diff --git a/samples/Makefile.dep b/samples/Makefile.dep index d02dee6..3211123 100644 --- a/samples/Makefile.dep +++ b/samples/Makefile.dep @@ -16,9 +16,9 @@ ./main.o: ../../pikotools/src/textstream/types.h ../src/modelconnector.h ./main.o: ../src/clearer.h ../src/ft.h ../src/dbconnector.h ./main.o: ../../pikotools/src/log/log.h ../../pikotools/src/log/filelog.h -./main.o: ../src/queryresult.h ../src/flatconnector.h ../src/dbexpression.h -./main.o: ../src/baseexpression.h ../src/modelenv.h ../src/modeldata.h -./main.o: ../src/cursorhelper.h ../src/finderhelper.h +./main.o: ../src/queryresult.h ../src/flatconnector.h ../src/export.h +./main.o: ../src/dbexpression.h ../src/baseexpression.h ../src/modelenv.h +./main.o: ../src/modeldata.h ../src/cursorhelper.h ../src/finderhelper.h ./main.o: ../src/fieldvaluehelper.h ../src/wrapper.h ../src/spacewrapper.h ./main.o: ../src/baseobjectwrapper.h ../src/modelcontainerwrapper.h ./main.o: ../src/select.h ../../pikotools/src/convert/text.h diff --git a/src/Makefile.dep b/src/Makefile.dep index cfa181b..372e085 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -18,7 +18,7 @@ ./baseexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./baseexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./baseexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h -./baseexpression.o: ../../pikotools/src/convert/text.h model.h +./baseexpression.o: export.h ../../pikotools/src/convert/text.h model.h ./baseexpression.o: modelconnector.h clearer.h dbconnector.h flatconnector.h ./baseexpression.o: dbexpression.h flatexpression.h ./clearer.o: clearer.h ../../pikotools/src/date/date.h @@ -35,7 +35,7 @@ ./clearer.o: ../../pikotools/src/textstream/types.h modelconnector.h ./clearer.o: dbconnector.h ../../pikotools/src/log/log.h ./clearer.o: ../../pikotools/src/log/filelog.h queryresult.h flatconnector.h -./clearer.o: dbexpression.h baseexpression.h morm_types.h modelenv.h +./clearer.o: export.h dbexpression.h baseexpression.h morm_types.h modelenv.h ./clearer.o: modeldata.h cursorhelper.h finderhelper.h fieldvaluehelper.h ./clearer.o: wrapper.h spacewrapper.h baseobjectwrapper.h ./clearer.o: modelcontainerwrapper.h select.h @@ -60,7 +60,7 @@ ./dbconnector.o: dbexpression.h baseexpression.h morm_types.h modelenv.h ./dbconnector.o: modeldata.h cursorhelper.h finderhelper.h fieldvaluehelper.h ./dbconnector.o: wrapper.h spacewrapper.h baseobjectwrapper.h -./dbconnector.o: modelcontainerwrapper.h select.h +./dbconnector.o: modelcontainerwrapper.h select.h export.h ./dbconnector.o: ../../pikotools/src/convert/text.h model.h modelconnector.h ./dbconnector.o: clearer.h flatconnector.h flatexpression.h ./dbconnector.o: ../../pikotools/src/convert/convert.h @@ -88,8 +88,9 @@ ./dbexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./dbexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./dbexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h -./dbexpression.o: ../../pikotools/src/convert/text.h model.h modelconnector.h -./dbexpression.o: clearer.h dbconnector.h flatconnector.h flatexpression.h +./dbexpression.o: export.h ../../pikotools/src/convert/text.h model.h +./dbexpression.o: modelconnector.h clearer.h dbconnector.h flatconnector.h +./dbexpression.o: flatexpression.h ./flatconnector.o: flatconnector.h ./flatconnector.o: ../../pikotools/src/textstream/textstream.h ./flatconnector.o: ../../pikotools/src/textstream/stream.h @@ -102,9 +103,10 @@ ./flatconnector.o: ../../pikotools/src/utf8/utf8_private.h ./flatconnector.o: ../../pikotools/src/date/date.h ./flatconnector.o: ../../pikotools/src/membuffer/membuffer.h -./flatconnector.o: ../../pikotools/src/textstream/types.h flatexpression.h -./flatconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h -./flatconnector.o: cursorhelper.h queryresult.h ../../pikotools/src/log/log.h +./flatconnector.o: ../../pikotools/src/textstream/types.h export.h +./flatconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h +./flatconnector.o: modeldata.h cursorhelper.h queryresult.h +./flatconnector.o: ../../pikotools/src/log/log.h ./flatconnector.o: ../../pikotools/src/log/filelog.h finderhelper.h ./flatconnector.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./flatconnector.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h @@ -128,7 +130,7 @@ ./flatexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./flatexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./flatexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h -./flatexpression.o: ../../pikotools/src/convert/text.h +./flatexpression.o: export.h ../../pikotools/src/convert/text.h ./jsonconnector.o: jsonconnector.h flatconnector.h ./jsonconnector.o: ../../pikotools/src/textstream/textstream.h ./jsonconnector.o: ../../pikotools/src/textstream/stream.h @@ -141,10 +143,10 @@ ./jsonconnector.o: ../../pikotools/src/utf8/utf8_private.h ./jsonconnector.o: ../../pikotools/src/date/date.h ./jsonconnector.o: ../../pikotools/src/membuffer/membuffer.h -./jsonconnector.o: ../../pikotools/src/textstream/types.h jsonexpression.h -./jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h -./jsonconnector.o: modeldata.h cursorhelper.h queryresult.h -./jsonconnector.o: ../../pikotools/src/log/log.h +./jsonconnector.o: ../../pikotools/src/textstream/types.h export.h +./jsonconnector.o: jsonexpression.h flatexpression.h baseexpression.h +./jsonconnector.o: morm_types.h modelenv.h modeldata.h cursorhelper.h +./jsonconnector.o: queryresult.h ../../pikotools/src/log/log.h ./jsonconnector.o: ../../pikotools/src/log/filelog.h finderhelper.h ./jsonconnector.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./jsonconnector.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h @@ -167,7 +169,7 @@ ./jsonexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./jsonexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./jsonexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h -./jsonexpression.o: ../../pikotools/src/convert/text.h +./jsonexpression.o: export.h ../../pikotools/src/convert/text.h ./jsonexpression.o: ../../pikotools/src/convert/misc.h ./jsonexpression.o: ../../pikotools/src/convert/text.h ./model.o: model.h ../../pikotools/src/textstream/textstream.h @@ -184,7 +186,7 @@ ./model.o: ../../pikotools/src/textstream/types.h modelconnector.h clearer.h ./model.o: ft.h dbconnector.h ../../pikotools/src/log/log.h ./model.o: ../../pikotools/src/log/filelog.h queryresult.h flatconnector.h -./model.o: dbexpression.h baseexpression.h morm_types.h modelenv.h +./model.o: export.h dbexpression.h baseexpression.h morm_types.h modelenv.h ./model.o: modeldata.h cursorhelper.h finderhelper.h fieldvaluehelper.h ./model.o: wrapper.h spacewrapper.h baseobjectwrapper.h ./model.o: modelcontainerwrapper.h select.h @@ -204,7 +206,7 @@ ./modelconnector.o: ../../pikotools/src/textstream/types.h ./modelconnector.o: ../../pikotools/src/log/log.h ./modelconnector.o: ../../pikotools/src/log/filelog.h queryresult.h -./modelconnector.o: flatconnector.h +./modelconnector.o: flatconnector.h export.h ./postgresqlconnector.o: postgresqlconnector.h dbconnector.h ./postgresqlconnector.o: ../../pikotools/src/textstream/textstream.h ./postgresqlconnector.o: ../../pikotools/src/textstream/stream.h @@ -225,7 +227,7 @@ ./postgresqlconnector.o: modelenv.h modeldata.h cursorhelper.h finderhelper.h ./postgresqlconnector.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./postgresqlconnector.o: baseobjectwrapper.h modelcontainerwrapper.h select.h -./postgresqlconnector.o: ../../pikotools/src/convert/text.h +./postgresqlconnector.o: export.h ../../pikotools/src/convert/text.h ./postgresqlconnector.o: ../../pikotools/src/convert/strtoint.h ./postgresqlconnector.o: ../../pikotools/src/convert/text.h ./postgresqlconnector.o: ../../pikotools/src/convert/misc.h @@ -248,7 +250,8 @@ ./postgresqlexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./postgresqlexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./postgresqlexpression.o: baseobjectwrapper.h modelcontainerwrapper.h -./postgresqlexpression.o: select.h ft.h ../../pikotools/src/convert/text.h +./postgresqlexpression.o: select.h ft.h export.h +./postgresqlexpression.o: ../../pikotools/src/convert/text.h ./postgresqlqueryresult.o: postgresqlqueryresult.h queryresult.h ./postgresqlqueryresult.o: ../../pikotools/src/log/log.h ./postgresqlqueryresult.o: ../../pikotools/src/textstream/textstream.h @@ -292,7 +295,7 @@ ./transaction.o: ../../pikotools/src/membuffer/membuffer.h ./transaction.o: ../../pikotools/src/textstream/types.h ./transaction.o: ../../pikotools/src/log/filelog.h modelconnector.h clearer.h -./transaction.o: ft.h dbconnector.h queryresult.h flatconnector.h +./transaction.o: ft.h dbconnector.h queryresult.h flatconnector.h export.h ./xmlconnector.o: xmlconnector.h flatconnector.h ./xmlconnector.o: ../../pikotools/src/textstream/textstream.h ./xmlconnector.o: ../../pikotools/src/textstream/stream.h @@ -305,10 +308,10 @@ ./xmlconnector.o: ../../pikotools/src/utf8/utf8_private.h ./xmlconnector.o: ../../pikotools/src/date/date.h ./xmlconnector.o: ../../pikotools/src/membuffer/membuffer.h -./xmlconnector.o: ../../pikotools/src/textstream/types.h xmlexpression.h -./xmlconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h -./xmlconnector.o: modeldata.h cursorhelper.h queryresult.h -./xmlconnector.o: ../../pikotools/src/log/log.h +./xmlconnector.o: ../../pikotools/src/textstream/types.h export.h +./xmlconnector.o: xmlexpression.h flatexpression.h baseexpression.h +./xmlconnector.o: morm_types.h modelenv.h modeldata.h cursorhelper.h +./xmlconnector.o: queryresult.h ../../pikotools/src/log/log.h ./xmlconnector.o: ../../pikotools/src/log/filelog.h finderhelper.h ./xmlconnector.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./xmlconnector.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h @@ -331,6 +334,47 @@ ./xmlexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h ./xmlexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h ./xmlexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h -./xmlexpression.o: ../../pikotools/src/convert/text.h +./xmlexpression.o: export.h ../../pikotools/src/convert/text.h ./xmlexpression.o: ../../pikotools/src/convert/misc.h ./xmlexpression.o: ../../pikotools/src/convert/text.h +./csvexpression.o: csvexpression.h flatexpression.h baseexpression.h +./csvexpression.o: ../../pikotools/src/textstream/textstream.h +./csvexpression.o: ../../pikotools/src/textstream/stream.h +./csvexpression.o: ../../pikotools/src/space/space.h +./csvexpression.o: ../../pikotools/src/textstream/types.h +./csvexpression.o: ../../pikotools/src/convert/inttostr.h +./csvexpression.o: ../../pikotools/src/utf8/utf8.h +./csvexpression.o: ../../pikotools/src/textstream/stream.h +./csvexpression.o: ../../pikotools/src/utf8/utf8_templates.h +./csvexpression.o: ../../pikotools/src/utf8/utf8_private.h +./csvexpression.o: ../../pikotools/src/date/date.h +./csvexpression.o: ../../pikotools/src/membuffer/membuffer.h +./csvexpression.o: ../../pikotools/src/textstream/types.h morm_types.h +./csvexpression.o: modelenv.h modeldata.h cursorhelper.h queryresult.h +./csvexpression.o: ../../pikotools/src/log/log.h +./csvexpression.o: ../../pikotools/src/log/filelog.h finderhelper.h +./csvexpression.o: fieldvaluehelper.h wrapper.h spacewrapper.h +./csvexpression.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h +./csvexpression.o: export.h ../../pikotools/src/convert/text.h +./csvexpression.o: ../../pikotools/src/convert/misc.h +./csvexpression.o: ../../pikotools/src/convert/text.h +./csvconnector.o: csvconnector.h flatconnector.h +./csvconnector.o: ../../pikotools/src/textstream/textstream.h +./csvconnector.o: ../../pikotools/src/textstream/stream.h +./csvconnector.o: ../../pikotools/src/space/space.h +./csvconnector.o: ../../pikotools/src/textstream/types.h +./csvconnector.o: ../../pikotools/src/convert/inttostr.h +./csvconnector.o: ../../pikotools/src/utf8/utf8.h +./csvconnector.o: ../../pikotools/src/textstream/stream.h +./csvconnector.o: ../../pikotools/src/utf8/utf8_templates.h +./csvconnector.o: ../../pikotools/src/utf8/utf8_private.h +./csvconnector.o: ../../pikotools/src/date/date.h +./csvconnector.o: ../../pikotools/src/membuffer/membuffer.h +./csvconnector.o: ../../pikotools/src/textstream/types.h export.h +./csvconnector.o: csvexpression.h flatexpression.h baseexpression.h +./csvconnector.o: morm_types.h modelenv.h modeldata.h cursorhelper.h +./csvconnector.o: queryresult.h ../../pikotools/src/log/log.h +./csvconnector.o: ../../pikotools/src/log/filelog.h finderhelper.h +./csvconnector.o: fieldvaluehelper.h wrapper.h spacewrapper.h +./csvconnector.o: baseobjectwrapper.h modelcontainerwrapper.h select.h ft.h +./csvconnector.o: ../../pikotools/src/convert/text.h diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index 34c44af..4992532 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -51,6 +51,7 @@ BaseExpression::BaseExpression() clear(); } + BaseExpression::~BaseExpression() { } @@ -61,6 +62,7 @@ void BaseExpression::clear() out_stream = nullptr; is_first_field = false; work_mode = 0; + output_type = 0; use_prefix = false; } @@ -77,6 +79,18 @@ int BaseExpression::get_work_mode() } +void BaseExpression::set_output_type(int output_type) +{ + this->output_type = output_type; +} + + +int BaseExpression::get_output_type() +{ + return output_type; +} + + pt::TextStream * BaseExpression::get_text_stream() { @@ -184,6 +198,13 @@ bool BaseExpression::can_field_model_be_generated(bool has_model_primary_key, co } +bool BaseExpression::can_field_list_be_generated(const FT &) +{ + return true; +} + + + bool BaseExpression::should_field_model_be_generated_as_null(bool has_model_primary_key, const FT & field_type) { return false; diff --git a/src/baseexpression.h b/src/baseexpression.h index 28383f1..c94cfee 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -43,6 +43,7 @@ #include "morm_types.h" #include "modelenv.h" #include "ft.h" +#include "export.h" #include "convert/text.h" #ifdef MORM_HAS_EZC_LIBRARY @@ -69,6 +70,9 @@ public: virtual void set_work_mode(int work_mode); virtual int get_work_mode(); + virtual void set_output_type(int output_type); + virtual int get_output_type(); + virtual pt::TextStream * get_text_stream(); virtual void set_text_stream(pt::TextStream * out_stream); @@ -160,7 +164,7 @@ public: void field_list(const wchar_t * field_name, ModelContainer & field_value, ModelContainerType * model_container_type, const FT & field_type, ModelConnector * model_connector, ModelEnv * model_env, IsContainerByValueRenameMe * foo) { - if( out_stream && can_field_be_generated(field_type) ) + if( out_stream && can_field_be_generated(field_type) && can_field_list_be_generated(field_type) ) { field_before(); @@ -192,12 +196,15 @@ public: if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) { - put_field_name_and_table_if_needed(field_name, field_type, model_env); + if( output_type == MORM_OUTPUT_TYPE_FIELDS_RECURSIVE ) + generate_from_model(field_model, field_type); + else + put_field_name_and_table_if_needed(field_name, field_type, model_env); } else if( work_mode == MORM_WORK_MODE_MODEL_VALUES ) { - generate_from_model(field_model, field_type); // is it ok as a value? + generate_from_model(field_model, field_type); } else if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) @@ -341,6 +348,7 @@ public: protected: int work_mode; /* what to do: generating fields list, values list or fields-values list */ + int output_type; bool is_first_field; pt::TextStream * out_stream; bool use_prefix; @@ -354,6 +362,7 @@ protected: virtual bool can_field_be_generated(const FT &); virtual bool can_field_model_be_generated(bool has_model_primary_key, const FT & field_type); + virtual bool can_field_list_be_generated(const FT &); virtual bool should_field_model_be_generated_as_null(bool has_model_primary_key, const FT & field_type); virtual void field_before(); diff --git a/src/csvconnector.cpp b/src/csvconnector.cpp new file mode 100644 index 0000000..85d8db3 --- /dev/null +++ b/src/csvconnector.cpp @@ -0,0 +1,81 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2023, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "csvconnector.h" +#include "csvexpression.h" + + +namespace morm +{ + + +CSVConnector::CSVConnector() +{ +} + + +void CSVConnector::allocate_default_expression() +{ + deallocate_expression(); + flat_expression = new CSVExpression(); + expression_allocated = true; + +} + + +void CSVConnector::to_text(pt::TextStream & stream, Model & model, Export exp) +{ + allocate_default_expression_if_needed(); + + if( flat_expression ) + { + flat_expression->clear(); + + if( exp.is_export_headers() ) + { + flat_expression->set_work_mode(MORM_WORK_MODE_MODEL_FIELDS); + flat_expression->set_output_type(MORM_OUTPUT_TYPE_FIELDS_RECURSIVE); + } + else + { + flat_expression->set_work_mode(MORM_WORK_MODE_MODEL_VALUES); + } + + flat_expression->allow_to_use_prefix(false); + flat_expression->generate_from_model(stream, model); + } +} + + +} diff --git a/src/csvconnector.h b/src/csvconnector.h new file mode 100644 index 0000000..a7fc2e8 --- /dev/null +++ b/src/csvconnector.h @@ -0,0 +1,63 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2023, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef headerfile_morm_src_csvconnector +#define headerfile_morm_src_csvconnector + +#include "flatconnector.h" + + +namespace morm +{ + +class CSVConnector : public FlatConnector +{ + +public: + + CSVConnector(); + + + void to_text(pt::TextStream & stream, Model & model, Export exp); + + +protected: + + void allocate_default_expression(); + +}; + +} + +#endif diff --git a/src/csvexpression.cpp b/src/csvexpression.cpp new file mode 100644 index 0000000..4cdb983 --- /dev/null +++ b/src/csvexpression.cpp @@ -0,0 +1,97 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2023, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "csvexpression.h" +#include "morm_types.h" +#include "convert/misc.h" + + +namespace morm +{ + + +bool CSVExpression::can_field_list_be_generated(const FT &) +{ + return false; +} + + +void CSVExpression::field_before() +{ + BaseExpression::field_before(); + + if( !is_first_field ) + { + (*out_stream) << ","; + } +} + + +void CSVExpression::after_generate_from_model() +{ + (*out_stream) << ","; +} + + +void CSVExpression::before_field_name() +{ + (*out_stream) << '"'; +} + + +void CSVExpression::after_field_name() +{ + (*out_stream) << '"'; +} + + +void CSVExpression::before_field_value_string(const FT & field_type, ModelEnv * model_env) +{ + (*out_stream) << '"'; +} + + +void CSVExpression::after_field_value_string(const FT & field_type, ModelEnv * model_env) +{ + (*out_stream) << '"'; +} + + +bool CSVExpression::esc_char(wchar_t val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env) +{ + return pt::try_esc_to_csv(val, stream); +} + + +} diff --git a/src/csvexpression.h b/src/csvexpression.h new file mode 100644 index 0000000..31fab5b --- /dev/null +++ b/src/csvexpression.h @@ -0,0 +1,68 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2023, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef headerfile_morm_src_csvexpression +#define headerfile_morm_src_csvexpression + +#include "flatexpression.h" + + + +namespace morm +{ + +class CSVExpression : public FlatExpression +{ + +protected: + + bool can_field_list_be_generated(const FT &); + void field_before(); + void after_generate_from_model(); + + void before_field_name(); + void after_field_name(); + + void before_field_value_string(const FT & field_type, ModelEnv * model_env); + void after_field_value_string(const FT & field_type, ModelEnv * model_env); + + using BaseExpression::esc; + bool esc_char(wchar_t val, pt::TextStream & stream, const FT & field_type, ModelEnv * model_env); + + +}; + +} + +#endif diff --git a/src/dbexpression.cpp b/src/dbexpression.cpp index 2ba5ec6..d836129 100644 --- a/src/dbexpression.cpp +++ b/src/dbexpression.cpp @@ -42,7 +42,6 @@ namespace morm DbExpression::DbExpression() { - output_type = 0; } @@ -51,18 +50,6 @@ DbExpression::~DbExpression() } -void DbExpression::set_output_type(int output_type) -{ - this->output_type = output_type; -} - - -int DbExpression::get_output_type() -{ - return output_type; -} - - bool DbExpression::can_field_be_generated(const FT & field_type) { if( output_type == MORM_OUTPUT_TYPE_DB_INSERT ) diff --git a/src/dbexpression.h b/src/dbexpression.h index ada8773..bbe8f9f 100644 --- a/src/dbexpression.h +++ b/src/dbexpression.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018-2022, Tomasz Sowa + * Copyright (c) 2018-2023, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,11 +53,6 @@ public: constexpr static const char * COLUMN_ROWS_COUNTER_POSTFIX = "_autoadded_rows_counter"; - - virtual void set_output_type(int output_type); - virtual int get_output_type(); - - virtual void prepare_to_where_clause(); virtual DbExpression & group_or(pt::TextStream & stream); @@ -86,7 +81,7 @@ public: protected: - int output_type; + std::vector conjunctions; bool can_field_be_generated(const FT & field_type); diff --git a/src/export.h b/src/export.h new file mode 100644 index 0000000..4c733a8 --- /dev/null +++ b/src/export.h @@ -0,0 +1,128 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2023, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWAExportType, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef headerfile_morm_src_export +#define headerfile_morm_src_export + +namespace morm +{ + + + +/* + * field types + */ +class Export +{ +public: + + enum ExportType + { + default_type = 0, + no_clear_stream = 1, + dump_mode = 2, + export_headers = 4, + }; + + /* + * type can be a superposition from ExportType values + */ + int type; + + + + Export() + { + type = 0; + } + + Export(const Export & field_type) + { + type = field_type.type; + } + + Export(ExportType type) + { + this->type = static_cast(type); + } + + Export(int type) + { + this->type = type; + } + + Export & operator=(const Export & field_type) + { + type = field_type.type; + return *this; + } + + Export & operator=(ExportType type) + { + this->type = static_cast(type); + return *this; + } + + Export & operator=(int type) + { + this->type = type; + return *this; + } + + bool is_flag_set(int flag_mask) const + { + return (type & flag_mask) != 0; + } + + bool is_no_clear_stream() const + { + return is_flag_set(no_clear_stream); + } + + bool is_dump_mode() const + { + return is_flag_set(dump_mode); + } + + bool is_export_headers() const + { + return is_flag_set(export_headers); + } + +}; + +} + +#endif + diff --git a/src/flatconnector.cpp b/src/flatconnector.cpp index a7ea051..d55f466 100644 --- a/src/flatconnector.cpp +++ b/src/flatconnector.cpp @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018-2021, Tomasz Sowa + * Copyright (c) 2018-2023, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -67,8 +67,7 @@ FlatExpression * FlatConnector::get_expression() } - -void FlatConnector::to_text(pt::TextStream & stream, Model & model) +void FlatConnector::to_text(pt::TextStream & stream, Model & model, Export exp) { allocate_default_expression_if_needed(); @@ -82,8 +81,6 @@ void FlatConnector::to_text(pt::TextStream & stream, Model & model) } - - void FlatConnector::deallocate_expression() { if( expression_allocated ) diff --git a/src/flatconnector.h b/src/flatconnector.h index fdacf13..eab72ab 100644 --- a/src/flatconnector.h +++ b/src/flatconnector.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018-2021, Tomasz Sowa + * Copyright (c) 2018-2023, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -36,6 +36,7 @@ #define headerfile_morm_src_flatconnector #include "textstream/textstream.h" +#include "export.h" namespace morm @@ -51,7 +52,7 @@ public: FlatConnector(); virtual ~FlatConnector(); - virtual void to_text(pt::TextStream & stream, Model & model); + virtual void to_text(pt::TextStream & stream, Model & model, Export exp); virtual void set_expression(FlatExpression & expression); virtual FlatExpression * get_expression(); diff --git a/src/flatexpression.cpp b/src/flatexpression.cpp index 7fb9d1a..7b93934 100644 --- a/src/flatexpression.cpp +++ b/src/flatexpression.cpp @@ -39,6 +39,17 @@ namespace morm { + +FlatExpression::FlatExpression() +{ +} + + +FlatExpression::~FlatExpression() +{ +} + + bool FlatExpression::should_field_model_be_generated_as_null(bool has_model_primary_key, const FT & field_type) { return !has_model_primary_key && field_type.is_serialize_to_null_if_null(); diff --git a/src/flatexpression.h b/src/flatexpression.h index d6c4691..74065eb 100644 --- a/src/flatexpression.h +++ b/src/flatexpression.h @@ -45,6 +45,9 @@ class FlatExpression : public BaseExpression { public: + FlatExpression(); + virtual ~FlatExpression(); + protected: diff --git a/src/model.cpp b/src/model.cpp index 8516926..396b49c 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -347,10 +347,9 @@ bool Model::get_raw_value(const wchar_t * db_field_name, const wchar_t * flat_fi - -void Model::to_text(pt::TextStream & stream, ModelData * model_data, bool clear_stream, bool dump_mode) +void Model::to_text(pt::TextStream & stream, ModelData * model_data, Export exp) { - if( clear_stream ) + if( !exp.is_no_clear_stream() ) { stream.clear(); } @@ -359,7 +358,7 @@ void Model::to_text(pt::TextStream & stream, ModelData * model_data, bool clear_ model_env = &model_env_local; model_env->has_primary_key_set = has_primary_key_set; model_env->model_work_mode = MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING; - model_env->dump_mode = dump_mode; + model_env->dump_mode = exp.is_dump_mode(); model_env->model_data = model_data; model_env->model = this; @@ -372,7 +371,7 @@ void Model::to_text(pt::TextStream & stream, ModelData * model_data, bool clear_ try { // table(); at the moment flat strings (json/space) do not need a table name - flat_connector->to_text(stream, *this); + flat_connector->to_text(stream, *this, exp); } catch(...) { @@ -386,6 +385,32 @@ void Model::to_text(pt::TextStream & stream, ModelData * model_data, bool clear_ } +void Model::to_text(pt::TextStream & stream, ModelData & model_data, Export exp) +{ + to_text(stream, &model_data, exp); +} + + +void Model::to_text(pt::TextStream & stream, Export exp) +{ + to_text(stream, nullptr, exp); +} + + +void Model::to_text(pt::TextStream & stream, ModelData * model_data, bool clear_stream, bool dump_mode) +{ + Export exp = Export::default_type; + + if( !clear_stream ) + exp = exp.type | Export::no_clear_stream; + + if( dump_mode ) + exp = exp.type | Export::dump_mode; + + to_text(stream, model_data, exp); +} + + void Model::to_text(pt::TextStream & stream, ModelData & model_data, bool clear_stream, bool dump_mode) { to_text(stream, &model_data, clear_stream, dump_mode); @@ -399,6 +424,7 @@ void Model::to_text(pt::TextStream & stream, bool clear_stream, bool dump_mode) + void Model::to_text(std::string & str, ModelData * model_data, bool clear_string, bool dump_mode) { if( model_connector ) diff --git a/src/model.h b/src/model.h index f67b472..d9fcd3c 100644 --- a/src/model.h +++ b/src/model.h @@ -177,9 +177,13 @@ public: virtual void get_table_name(std::wstring & str, bool with_schema_name = true, ModelData * model_data = nullptr, bool clear_string = true); virtual void get_table_name(std::string & str, bool with_schema_name = true, ModelData * model_data = nullptr, bool clear_string = true); - virtual void to_text(pt::TextStream & stream, ModelData * model_data, bool clear_stream = true, bool dump_mode = false); - virtual void to_text(pt::TextStream & stream, ModelData & model_data, bool clear_stream = true, bool dump_mode = false); - virtual void to_text(pt::TextStream & stream, bool clear_stream = true, bool dump_mode = false); + virtual void to_text(pt::TextStream & stream, ModelData * model_data, Export exp = Export::default_type); + virtual void to_text(pt::TextStream & stream, ModelData & model_data, Export exp = Export::default_type); + virtual void to_text(pt::TextStream & stream, Export exp = Export::default_type); + + virtual void to_text(pt::TextStream & stream, ModelData * model_data, bool clear_stream, bool dump_mode); + virtual void to_text(pt::TextStream & stream, ModelData & model_data, bool clear_stream, bool dump_mode); + virtual void to_text(pt::TextStream & stream, bool clear_stream, bool dump_mode); virtual void to_text(std::string & str, ModelData * model_data, bool clear_string = true, bool dump_mode = false); virtual void to_text(std::string & str, ModelData & model_data, bool clear_string = true, bool dump_mode = false); diff --git a/src/morm_types.h b/src/morm_types.h index c8a9010..bf436a8 100644 --- a/src/morm_types.h +++ b/src/morm_types.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018-2022, Tomasz Sowa + * Copyright (c) 2018-2023, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -102,6 +102,7 @@ #define MORM_OUTPUT_TYPE_WHERE_LIKE 27 #define MORM_OUTPUT_TYPE_WHERE_ILIKE 28 +#define MORM_OUTPUT_TYPE_FIELDS_RECURSIVE 29 #define MORM_CONJUNCTION_AND 1 #define MORM_CONJUNCTION_OR 2 diff --git a/src/xmlconnector.cpp b/src/xmlconnector.cpp index 2330b21..bdab448 100644 --- a/src/xmlconnector.cpp +++ b/src/xmlconnector.cpp @@ -100,7 +100,7 @@ void XMLConnector::allocate_default_expression() } -void XMLConnector::to_text(pt::TextStream & stream, Model & model) +void XMLConnector::to_text(pt::TextStream & stream, Model & model, Export exp) { allocate_default_expression_if_needed(); diff --git a/src/xmlconnector.h b/src/xmlconnector.h index 00ba67b..bbeab41 100644 --- a/src/xmlconnector.h +++ b/src/xmlconnector.h @@ -57,7 +57,7 @@ public: virtual void set_root_element(const std::wstring & root_name); virtual std::wstring & get_root_element(); - void to_text(pt::TextStream & stream, Model & model); + void to_text(pt::TextStream & stream, Model & model, Export exp); protected: