diff --git a/src/Makefile.dep b/src/Makefile.dep index e8ab432..492efda 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -10,7 +10,7 @@ baseexpression.o: ../../pikotools/textstream/types.h morm_types.h model.h baseexpression.o: modelconnector.h clearer.h dbconnector.h baseexpression.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h baseexpression.o: queryresult.h flatconnector.h dbexpression.h -baseexpression.o: flatexpression.h ../../pikotools/utf8/utf8.h +baseexpression.o: flatexpression.h modeldata.h ../../pikotools/utf8/utf8.h clearer.o: clearer.h ../../pikotools/date/date.h clearer.o: ../../pikotools/convert/inttostr.h model.h clearer.o: ../../pikotools/textstream/textstream.h @@ -19,7 +19,7 @@ clearer.o: ../../pikotools/membuffer/membuffer.h clearer.o: ../../pikotools/textstream/types.h modelconnector.h dbconnector.h clearer.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h clearer.o: queryresult.h flatconnector.h dbexpression.h baseexpression.h -clearer.o: morm_types.h flatexpression.h +clearer.o: morm_types.h flatexpression.h modeldata.h dbconnector.o: dbconnector.h ../../pikotools/textstream/textstream.h dbconnector.o: ../../pikotools/space/space.h dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/date/date.h @@ -28,7 +28,7 @@ dbconnector.o: ../../pikotools/membuffer/membuffer.h dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/log/log.h dbconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h dbconnector.o: baseexpression.h morm_types.h model.h modelconnector.h -dbconnector.o: clearer.h flatconnector.h flatexpression.h +dbconnector.o: clearer.h flatconnector.h flatexpression.h modeldata.h dbconnector.o: ../../pikotools/utf8/utf8.h ../../pikotools/convert/convert.h dbconnector.o: ../../pikotools/convert/inttostr.h dbconnector.o: ../../pikotools/convert/patternreplacer.h @@ -69,6 +69,7 @@ flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h flatconnector.o: baseexpression.h morm_types.h model.h modelconnector.h flatconnector.o: clearer.h dbconnector.h ../../pikotools/log/log.h flatconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h +flatconnector.o: modeldata.h flatexpression.o: flatexpression.h baseexpression.h flatexpression.o: ../../pikotools/textstream/textstream.h flatexpression.o: ../../pikotools/space/space.h @@ -102,6 +103,7 @@ model.o: ../../pikotools/textstream/types.h modelconnector.h clearer.h model.o: dbconnector.h ../../pikotools/log/log.h model.o: ../../pikotools/log/filelog.h queryresult.h flatconnector.h model.o: dbexpression.h baseexpression.h morm_types.h flatexpression.h +model.o: modeldata.h modelconnector.o: modelconnector.h clearer.h ../../pikotools/date/date.h modelconnector.o: ../../pikotools/convert/inttostr.h dbconnector.h modelconnector.o: ../../pikotools/textstream/textstream.h diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index d24c994..e396399 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -161,10 +161,12 @@ void BaseExpression::put_field_name(const wchar_t * field_name, bool add_column_ -void BaseExpression::put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key) +void BaseExpression::put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data) { model.doc_field_pointer = field_pointer; + model.model_data = model_data; model.map_doc_fields(); + model.model_data = nullptr; model.doc_field_pointer = nullptr; } diff --git a/src/baseexpression.h b/src/baseexpression.h index 15f0677..879d25f 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -45,6 +45,7 @@ namespace morm { class Model; +class ModelData; class ModelConnector; @@ -65,7 +66,7 @@ public: // give me a better name - virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key); + virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data); @@ -98,7 +99,10 @@ public: } template - void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true) + void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value, + bool insertable = true, bool updatable = true, + bool is_primary_key = false, bool add_column_prefix = true, + ModelData * model_data = nullptr) { if( out_stream ) { @@ -107,7 +111,7 @@ public: put_field_name(field_name, add_column_prefix); put_name_value_separator(); - put_field_doc(model, reinterpret_cast(&field_value), insertable, updatable, is_primary_key); + put_field_doc(model, reinterpret_cast(&field_value), insertable, updatable, is_primary_key, model_data); put_name_value_separator(); put_type(field_value, *out_stream); @@ -148,7 +152,7 @@ public: template void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key, - ModelConnector * model_connector, int model_connector_mode) + ModelConnector * model_connector, int model_connector_mode, ModelData * model_data) { if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) ) { @@ -158,7 +162,7 @@ public: { put_field_name(field_name); put_name_value_separator(); - put_field_value_list(field_value, model_connector, model_connector_mode); + put_field_value_list(field_value, model_connector, model_connector_mode, model_data); } field_after(); @@ -271,7 +275,7 @@ protected: // what about lists with a pod types? e.g. list template - void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, int model_connector_mode) + void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, int model_connector_mode, ModelData * model_data) { if( out_stream ) { @@ -293,8 +297,10 @@ protected: //before_field_value(field_value); m.set_connector(model_connector); m.model_connector_mode = model_connector_mode; + m.model_data = model_data; generate_from_model(m); m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + m.model_data = nullptr; //after_field_value(field_value); is_first = false; } diff --git a/src/cursor.h b/src/cursor.h index 15f08c4..9ff9aa5 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -101,7 +101,7 @@ public: } - virtual void set_model_data(Model::ModelData * model_data) + virtual void set_model_data(ModelData * model_data) { this->model_data = model_data; } @@ -257,7 +257,7 @@ public: protected: ModelConnector * model_connector; - Model::ModelData * model_data; + ModelData * model_data; QueryResult * query_result; bool select_status; diff --git a/src/finder.h b/src/finder.h index 8d45a9f..b40550d 100644 --- a/src/finder.h +++ b/src/finder.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018, Tomasz Sowa + * Copyright (c) 2018-2019, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -81,6 +81,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + set_out_stream(); } Finder(ModelConnector * model_connector) @@ -90,6 +91,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + set_out_stream(); } Finder(PT::TextStream & out_stream, ModelConnector & model_connector) @@ -111,6 +113,44 @@ public: } + + +protected: + + void set_out_stream() + { + if( model_connector ) + { + this->out_stream = model_connector->get_stream(); + } + else + { + this->out_stream = nullptr; + } + } + + +public: + + Finder & set_out_stream(PT::TextStream * out_stream) + { + this->out_stream = out_stream; + return *this; + } + + Finder & set_model_data(ModelData * model_data) + { + this->model_data = model_data; + return *this; + } + + Finder & set_model_data(ModelData & model_data) + { + this->model_data = &model_data; + return *this; + } + + bool was_error() { return was_query_error; @@ -138,15 +178,9 @@ public: if( model_connector ) { - if( !out_stream ) - { - out_stream = model_connector->get_stream(); - } - if( out_stream ) { set_db_expression(); - out_stream->clear(); model.set_connector(model_connector); } @@ -216,7 +250,7 @@ public: return *this; } - Finder & select(Model::ModelData * model_data, bool call_prepare = true) + Finder & select(ModelData * model_data, bool call_prepare = true) { if( call_prepare ) { @@ -227,7 +261,7 @@ public: return select(false); } - Finder & select(Model::ModelData & model_data, bool call_prepare = true) + Finder & select(ModelData & model_data, bool call_prepare = true) { if( call_prepare ) { @@ -415,6 +449,23 @@ public: } + Finder & raw(PT::TextStream & sql, bool add_spaces = true) + { + if( out_stream ) + { + if( add_spaces ) + (*out_stream) << ' '; + + (*out_stream) << sql; + + if( add_spaces ) + (*out_stream) << ' '; + } + + return *this; + } + + Finder & raw(long val, bool add_spaces = true) { if( out_stream ) @@ -500,7 +551,7 @@ private: ModelClass model; bool was_query_error; std::wstring last_query_error; - Model::ModelData * model_data; + ModelData * model_data; std::wstring column_prefix; diff --git a/src/model.cpp b/src/model.cpp index 09dbf0f..ba899fa 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -129,8 +129,7 @@ bool Model::found() } - -void Model::to_text(PT::TextStream & stream, bool clear_stream) +void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream) { if( clear_stream ) { @@ -145,7 +144,9 @@ void Model::to_text(PT::TextStream & stream, bool clear_stream) if( flat_connector ) { + this->model_data = model_data; flat_connector->to_text(stream, *this); + this->model_data = nullptr; } } @@ -153,7 +154,20 @@ void Model::to_text(PT::TextStream & stream, bool clear_stream) } -void Model::to_text(std::string & str, bool clear_string) +void Model::to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream) +{ + to_text(stream, &model_data, clear_stream); +} + + +void Model::to_text(PT::TextStream & stream, bool clear_stream) +{ + to_text(stream, nullptr, clear_stream); +} + + + +void Model::to_text(std::string & str, ModelData * model_data, bool clear_string) { if( model_connector ) { @@ -162,13 +176,25 @@ void Model::to_text(std::string & str, bool clear_string) if( out_stream ) { - to_text(*out_stream, true); + to_text(*out_stream, model_data, true); out_stream->to_string(str, clear_string); } } } +void Model::to_text(std::string & str, ModelData & model_data, bool clear_string) +{ + to_text(str, &model_data, clear_string); +} + + +void Model::to_text(std::string & str, bool clear_string) +{ + to_text(str, nullptr, clear_string); +} + + std::string Model::to_text() { std::string str; diff --git a/src/model.h b/src/model.h index 4ff3741..730af48 100644 --- a/src/model.h +++ b/src/model.h @@ -42,6 +42,7 @@ #include "dbexpression.h" #include "flatexpression.h" #include "queryresult.h" +#include "modeldata.h" @@ -53,25 +54,6 @@ class Model { public: - class ModelData - { - public: - - ModelData() {} - virtual ~ModelData() {} - - /* - * may to add: - * std::set skip_columns; - * and Finder can use this - * also update and insert from Model - * (but what about the same name of columns through the whole objects-tree? - * may we can save the name of the table too?) - * - * - */ - }; - enum SaveMode { DO_INSERT_ON_SAVE, @@ -115,9 +97,14 @@ public: */ virtual void table_name(PT::TextStream & stream); - + virtual void to_text(PT::TextStream & stream, ModelData * model_data = nullptr, bool clear_stream = true); + virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true); virtual void to_text(PT::TextStream & stream, bool clear_stream = true); + + virtual void to_text(std::string & str, ModelData * model_data = nullptr, bool clear_string = true); + virtual void to_text(std::string & str, ModelData & model_data, bool clear_string = true); virtual void to_text(std::string & str, bool clear_string = true); + virtual std::string to_text(); virtual std::string to_string(); @@ -723,6 +710,7 @@ protected: if( model_connector ) { field_model.set_connector(model_connector); + field_model.model_data = model_data; // IMPLEMENTME what about db? if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) @@ -768,6 +756,8 @@ protected: } } } + + field_model.model_data = nullptr; } } @@ -791,7 +781,7 @@ protected: // IMPROVE ME // what about model_data and save_mode? // may it should be placed inside some structure? - flat_expression->field_list(flat_field_name, field_container, insertable, updatable, is_primary_key, model_connector, model_connector_mode); + flat_expression->field_list(flat_field_name, field_container, insertable, updatable, is_primary_key, model_connector, model_connector_mode, model_data); } } } @@ -818,7 +808,7 @@ protected: if( doc_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here - doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, is_primary_key); + doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, is_primary_key, model_data); } } } diff --git a/src/modeldata.h b/src/modeldata.h new file mode 100644 index 0000000..327cddb --- /dev/null +++ b/src/modeldata.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) 2019, 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_modeldata +#define headerfile_morm_modeldata + + +namespace morm +{ + +class ModelData +{ +public: + + ModelData() {} + virtual ~ModelData() {} + + /* + * may to add: + * std::set skip_columns; + * and Finder can use this + * also update and insert from Model + * (but what about the same name of columns through the whole objects-tree? + * may we can save the name of the table too?) + * + * + */ +}; + +} + +#endif