diff --git a/src/Makefile.dep b/src/Makefile.dep index 8217419..e372200 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -6,11 +6,11 @@ baseexpression.o: ../../pikotools/textstream/types.h baseexpression.o: ../../pikotools/date/date.h baseexpression.o: ../../pikotools/convert/inttostr.h baseexpression.o: ../../pikotools/membuffer/membuffer.h -baseexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h -baseexpression.o: model.h 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: ../../pikotools/textstream/types.h morm_types.h modelenv.h +baseexpression.o: modeldata.h queryresult.h model.h modelconnector.h +baseexpression.o: clearer.h dbconnector.h ../../pikotools/log/log.h +baseexpression.o: ../../pikotools/log/filelog.h flatconnector.h +baseexpression.o: dbexpression.h flatexpression.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 modeldata.h flatexpression.h +clearer.o: morm_types.h modelenv.h modeldata.h flatexpression.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 @@ -27,7 +27,7 @@ dbconnector.o: ../../pikotools/convert/inttostr.h 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 modeldata.h model.h +dbconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h model.h dbconnector.o: modelconnector.h clearer.h flatconnector.h flatexpression.h dbconnector.o: ../../pikotools/utf8/utf8.h ../../pikotools/convert/convert.h dbconnector.o: ../../pikotools/convert/inttostr.h @@ -41,7 +41,8 @@ dbexpression.o: ../../pikotools/textstream/types.h dbexpression.o: ../../pikotools/date/date.h dbexpression.o: ../../pikotools/convert/inttostr.h dbexpression.o: ../../pikotools/membuffer/membuffer.h -dbexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h +dbexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h +dbexpression.o: modeldata.h queryresult.h dochtmlconnector.o: dochtmlconnector.h flatconnector.h dochtmlconnector.o: ../../pikotools/textstream/textstream.h dochtmlconnector.o: ../../pikotools/space/space.h @@ -50,8 +51,8 @@ dochtmlconnector.o: ../../pikotools/date/date.h dochtmlconnector.o: ../../pikotools/convert/inttostr.h dochtmlconnector.o: ../../pikotools/membuffer/membuffer.h dochtmlconnector.o: ../../pikotools/textstream/types.h dochtmlexpression.h -dochtmlconnector.o: flatexpression.h baseexpression.h morm_types.h -dochtmlconnector.o: modeldata.h +dochtmlconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h +dochtmlconnector.o: modeldata.h queryresult.h dochtmlexpression.o: dochtmlexpression.h flatexpression.h baseexpression.h dochtmlexpression.o: ../../pikotools/textstream/textstream.h dochtmlexpression.o: ../../pikotools/space/space.h @@ -60,7 +61,7 @@ dochtmlexpression.o: ../../pikotools/date/date.h dochtmlexpression.o: ../../pikotools/convert/inttostr.h dochtmlexpression.o: ../../pikotools/membuffer/membuffer.h dochtmlexpression.o: ../../pikotools/textstream/types.h morm_types.h -dochtmlexpression.o: modeldata.h +dochtmlexpression.o: modelenv.h modeldata.h queryresult.h flatconnector.o: flatconnector.h ../../pikotools/textstream/textstream.h flatconnector.o: ../../pikotools/space/space.h flatconnector.o: ../../pikotools/textstream/types.h @@ -68,10 +69,10 @@ flatconnector.o: ../../pikotools/date/date.h flatconnector.o: ../../pikotools/convert/inttostr.h flatconnector.o: ../../pikotools/membuffer/membuffer.h flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h -flatconnector.o: baseexpression.h morm_types.h modeldata.h model.h -flatconnector.o: modelconnector.h clearer.h dbconnector.h -flatconnector.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h -flatconnector.o: queryresult.h dbexpression.h +flatconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h +flatconnector.o: queryresult.h model.h modelconnector.h clearer.h +flatconnector.o: dbconnector.h ../../pikotools/log/log.h +flatconnector.o: ../../pikotools/log/filelog.h dbexpression.h flatexpression.o: flatexpression.h baseexpression.h flatexpression.o: ../../pikotools/textstream/textstream.h flatexpression.o: ../../pikotools/space/space.h @@ -79,7 +80,8 @@ flatexpression.o: ../../pikotools/textstream/types.h flatexpression.o: ../../pikotools/date/date.h flatexpression.o: ../../pikotools/convert/inttostr.h flatexpression.o: ../../pikotools/membuffer/membuffer.h -flatexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h +flatexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h +flatexpression.o: modeldata.h queryresult.h jsonconnector.o: jsonconnector.h flatconnector.h jsonconnector.o: ../../pikotools/textstream/textstream.h jsonconnector.o: ../../pikotools/space/space.h @@ -88,7 +90,8 @@ jsonconnector.o: ../../pikotools/date/date.h jsonconnector.o: ../../pikotools/convert/inttostr.h jsonconnector.o: ../../pikotools/membuffer/membuffer.h jsonconnector.o: ../../pikotools/textstream/types.h jsonexpression.h -jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modeldata.h +jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h +jsonconnector.o: modeldata.h queryresult.h jsonexpression.o: jsonexpression.h flatexpression.h baseexpression.h jsonexpression.o: ../../pikotools/textstream/textstream.h jsonexpression.o: ../../pikotools/space/space.h @@ -96,7 +99,8 @@ jsonexpression.o: ../../pikotools/textstream/types.h jsonexpression.o: ../../pikotools/date/date.h jsonexpression.o: ../../pikotools/convert/inttostr.h jsonexpression.o: ../../pikotools/membuffer/membuffer.h -jsonexpression.o: ../../pikotools/textstream/types.h morm_types.h modeldata.h +jsonexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h +jsonexpression.o: modeldata.h queryresult.h model.o: model.h ../../pikotools/textstream/textstream.h model.o: ../../pikotools/space/space.h ../../pikotools/textstream/types.h model.o: ../../pikotools/date/date.h ../../pikotools/convert/inttostr.h @@ -104,7 +108,7 @@ model.o: ../../pikotools/membuffer/membuffer.h 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 modeldata.h +model.o: dbexpression.h baseexpression.h morm_types.h modelenv.h modeldata.h model.o: flatexpression.h modelconnector.o: modelconnector.h clearer.h ../../pikotools/date/date.h modelconnector.o: ../../pikotools/convert/inttostr.h dbconnector.h @@ -127,7 +131,7 @@ postgresqlconnector.o: ../../pikotools/log/log.h postgresqlconnector.o: ../../pikotools/log/filelog.h queryresult.h postgresqlconnector.o: postgresqlqueryresult.h ../../pikotools/utf8/utf8.h postgresqlconnector.o: postgresqlexpression.h dbexpression.h baseexpression.h -postgresqlconnector.o: morm_types.h modeldata.h +postgresqlconnector.o: morm_types.h modelenv.h modeldata.h postgresqlconnector.o: ../../pikotools/convert/strtoint.h postgresqlconnector.o: ../../pikotools/convert/text.h postgresqlconnector.o: ../../pikotools/convert/misc.h @@ -140,7 +144,7 @@ postgresqlexpression.o: ../../pikotools/date/date.h postgresqlexpression.o: ../../pikotools/convert/inttostr.h postgresqlexpression.o: ../../pikotools/membuffer/membuffer.h postgresqlexpression.o: ../../pikotools/textstream/types.h morm_types.h -postgresqlexpression.o: modeldata.h +postgresqlexpression.o: modelenv.h modeldata.h queryresult.h postgresqlqueryresult.o: postgresqlqueryresult.h queryresult.h queryresult.o: queryresult.h ../../pikotools/utf8/utf8.h queryresult.o: ../../pikotools/textstream/textstream.h diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index 28570b2..554837f 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -199,11 +199,13 @@ 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, 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; + */ } void BaseExpression::before_field_name() diff --git a/src/baseexpression.h b/src/baseexpression.h index 0350d73..a80ce74 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -40,7 +40,7 @@ #include "textstream/textstream.h" #include "date/date.h" #include "morm_types.h" -#include "modeldata.h" +#include "modelenv.h" @@ -330,13 +330,15 @@ protected: (*out_stream) << ","; // make a virtual method } + ModelEnv model_env_local; + m.model_env = &model_env_local; + //before_field_value(field_value); m.set_connector(model_connector); - m.model_connector_mode = model_connector_mode; - m.model_data = model_data; + m.model_env->model_connector_mode = model_connector_mode; + m.model_env->model_data = model_data; generate_from_model(m); - m.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - m.model_data = nullptr; + m.model_env = nullptr; //after_field_value(field_value); is_first = false; } diff --git a/src/cursor.h b/src/cursor.h index 1d471f4..6b42474 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -144,18 +144,21 @@ public: result.set_connector(model_connector); result.clear(); - if( model_connector && query_result && query_result->has_db_result() ) + if( model_connector && query_result && query_result->has_db_result() && model_data ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { + ModelEnv model_env_local; + result.model_env = &model_env_local; + try { - if( model_data ) - model_data->current_column = 0; + model_data->current_column = 0; + model_data->query_result = query_result; - result.model_data = model_data; + result.model_env->model_data = model_data; result.before_select(); res = select_status; @@ -164,7 +167,7 @@ public: if( query_result->cur_row < query_result->result_rows ) { result.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key - result.map_values_from_query(query_result); + result.map_values_from_query(); result.after_select(); query_result->cur_row += 1; } @@ -185,7 +188,7 @@ public: // throw something? } - result.model_data = nullptr; + result.model_env = nullptr; } } @@ -198,7 +201,7 @@ public: ModelClass model; get(model); - return std::move(model); + return model; } @@ -211,7 +214,7 @@ public: result.clear(); } - if( model_connector && query_result && query_result->has_db_result() ) + if( model_connector && query_result && query_result->has_db_result() && model_data ) { DbConnector * db_connector = model_connector->get_db_connector(); @@ -284,17 +287,20 @@ protected: result.emplace_back(); // it returns a reference from c++17 ModelClass & added_model = result.back(); + ModelEnv model_env_local; + added_model.model_env = &model_env_local; + try { - if( model_data ) - model_data->current_column = 0; + model_data->current_column = 0; + model_data->query_result = query_result; added_model.set_connector(model_connector); added_model.clear(); added_model.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key - added_model.model_data = model_data; + added_model.model_env->model_data = model_data; added_model.before_select(); - added_model.map_values_from_query(query_result); + added_model.map_values_from_query(); added_model.after_select(); } catch(...) @@ -303,7 +309,7 @@ protected: // throw or something? } - added_model.model_data = nullptr; + added_model.model_env = nullptr; } return res; diff --git a/src/finder.h b/src/finder.h index 161c43d..6b767fb 100644 --- a/src/finder.h +++ b/src/finder.h @@ -174,8 +174,13 @@ public: { was_query_error = false; last_query_error.clear(); - model_data = nullptr; column_prefix.clear(); + + model.model_env = &model_env; + model.model_env->clear(); + + //model.model_data = nullptr; + // what about model_data in model here? model.prepare_to_select(); if( model_connector ) @@ -198,6 +203,11 @@ public: last_query_error = L"model connector object is required"; } + if( !model_data ) + { + model_data = &model_data_generic; + } + return *this; } @@ -244,11 +254,19 @@ public: prepare_to_select(); } + if( !model.model_env ) + { + model.model_env = &model_env; + model.model_env->clear(); + } + if( !model_data ) { model_data = &model_data_generic; } + model.model_env->model_data = model_data; + model_data->prepare_to_new_select(); model_data->has_autogenerated_select = true; @@ -265,7 +283,7 @@ public: model_data->add_join_table(column_prefix); } - model.generate_select_columns(*out_stream, column_prefix, model_data); + model.generate_select_columns(*out_stream, column_prefix); (*out_stream) << " FROM "; model.table_name(*out_stream); @@ -293,6 +311,7 @@ public: return *this; } + Finder & select(ModelData * model_data, bool call_prepare = true) { if( call_prepare ) @@ -304,6 +323,7 @@ public: return select(false); } + Finder & select(ModelData & model_data, bool call_prepare = true) { if( call_prepare ) @@ -315,6 +335,7 @@ public: return select(false); } + Finder & where() { if( out_stream && db_expression ) @@ -579,7 +600,7 @@ public: std::list result; get_list(result, false); - return std::move(result); + return result; } @@ -597,6 +618,7 @@ private: std::wstring last_query_error; ModelData * model_data; std::string column_prefix; + ModelEnv model_env; diff --git a/src/model.cpp b/src/model.cpp index 9190d2b..5e51fc0 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -41,11 +41,8 @@ namespace morm Model::Model() { model_connector = nullptr; - model_data = nullptr; - doc_field_pointer = nullptr; + model_env = nullptr; save_mode = DO_INSERT_ON_SAVE; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - query_result = nullptr; } @@ -53,11 +50,7 @@ Model::Model(const Model & m) { model_connector = m.model_connector; save_mode = m.save_mode; - - model_data = nullptr; - doc_field_pointer = nullptr; // does it need to be copied? - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - query_result = nullptr; + model_env = m.model_env; // or just set to null? } @@ -65,6 +58,7 @@ Model::~Model() { } + void Model::set_save_mode(SaveMode save_mode) { this->save_mode = save_mode; @@ -170,7 +164,10 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_ stream.clear(); } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING; + ModelEnv model_env_local; + model_env = &model_env_local; + + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING; if( model_connector ) { @@ -178,13 +175,14 @@ void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_ if( flat_connector ) { - this->model_data = model_data; + this->model_env->model_data = model_data; flat_connector->to_text(stream, *this); - this->model_data = nullptr; + this->model_env->model_data = nullptr; } } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } @@ -247,7 +245,7 @@ std::string Model::to_string() void Model::generate_insert_query(PT::TextStream & stream) { - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; if( model_connector ) { @@ -259,7 +257,7 @@ void Model::generate_insert_query(PT::TextStream & stream) } } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } @@ -270,8 +268,11 @@ bool Model::insert(ModelData * model_data) if( model_connector ) { - this->model_data = model_data; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + ModelEnv model_env_local; + model_env = &model_env_local; + + model_env->model_data = model_data; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; DbConnector * db_connector = model_connector->get_db_connector(); // CHECK ME what if the stream is being used by something other? @@ -294,8 +295,8 @@ bool Model::insert(ModelData * model_data) } } - this->model_data = nullptr; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } return result; @@ -311,7 +312,7 @@ bool Model::insert(ModelData & model_data) void Model::generate_update_query(PT::TextStream & stream) { - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; if( model_connector ) { @@ -323,7 +324,7 @@ void Model::generate_update_query(PT::TextStream & stream) } } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } @@ -333,8 +334,11 @@ bool Model::update(ModelData * model_data) if( model_connector ) { - this->model_data = model_data; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + ModelEnv model_env_local; + model_env = &model_env_local; + + model_env->model_data = model_data; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; DbConnector * db_connector = model_connector->get_db_connector(); // CHECK ME what if the stream is being used by something other? @@ -352,8 +356,8 @@ bool Model::update(ModelData * model_data) after_update_failure(); } - this->model_data = nullptr; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } return result; @@ -371,14 +375,14 @@ void Model::generate_remove_query(PT::TextStream & stream) if( model_connector ) { DbConnector * db_connector = model_connector->get_db_connector(); - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; if( db_connector ) { db_connector->generate_remove_query(stream, *this); } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } } @@ -389,8 +393,11 @@ bool Model::remove(ModelData * model_data) if( model_connector ) { - this->model_data = model_data; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + ModelEnv model_env_local; + model_env = &model_env_local; + + model_env->model_data = model_data; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; DbConnector * db_connector = model_connector->get_db_connector(); // CHECK ME what if the stream is being used by something other? @@ -413,8 +420,8 @@ bool Model::remove(ModelData * model_data) } } - this->model_data = nullptr; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } return result; @@ -460,21 +467,17 @@ bool Model::save(ModelData & model_data) } -void Model::generate_select_columns(PT::TextStream & stream, const std::string & column_prefix, ModelData * model_data) +void Model::generate_select_columns(PT::TextStream & stream, const std::string & column_prefix) { - if( model_connector ) + if( model_connector && model_env ) { - this->model_data = model_data; - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { db_connector->generate_select_columns(stream, *this, column_prefix); } - - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - this->model_data = nullptr; } } @@ -487,7 +490,7 @@ void Model::generate_doc_for_flat(PT::TextStream & stream, bool clear_stream) stream.clear(); } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT; if( model_connector ) { @@ -499,7 +502,7 @@ void Model::generate_doc_for_flat(PT::TextStream & stream, bool clear_stream) } } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } @@ -510,7 +513,7 @@ void Model::generate_doc_for_db(PT::TextStream & stream, bool clear_stream) stream.clear(); } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_DB; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_DB; if( model_connector ) { @@ -522,37 +525,35 @@ void Model::generate_doc_for_db(PT::TextStream & stream, bool clear_stream) } } - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } -void Model::map_values_from_query(QueryResult * query_result) +void Model::map_values_from_query() { - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET; - this->query_result = query_result; - + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET; map_fields(); - - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - this->query_result = nullptr; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } void Model::clear() { - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE; + ModelEnv model_env_local; + model_env = &model_env_local; + + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE; map_fields(); - model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_env = nullptr; save_mode = DO_INSERT_ON_SAVE; - model_data = nullptr; } void Model::prepare_to_select() { - table_index = 1; + model_env->table_index = 1; } @@ -610,9 +611,30 @@ void Model::after_remove_failure() int Model::get_connector_mode() { - return model_connector_mode; + if( model_env ) + { + return model_env->model_connector_mode; + } + else + { + return MORM_MODEL_CONNECTOR_MODE_NONE; + } } + +ModelData * Model::get_model_data() +{ + if( model_env ) + { + return model_env->model_data; + } + else + { + return nullptr; + } +} + + bool Model::is_empty_field(const wchar_t * value) { return (!value || *value == '\0'); diff --git a/src/model.h b/src/model.h index 527ef39..3cdce56 100644 --- a/src/model.h +++ b/src/model.h @@ -41,8 +41,7 @@ #include "modelconnector.h" #include "dbexpression.h" #include "flatexpression.h" -#include "queryresult.h" -#include "modeldata.h" +#include "modelenv.h" @@ -124,7 +123,7 @@ public: virtual bool save(ModelData * model_data = nullptr); virtual bool save(ModelData & model_data); - virtual void generate_select_columns(PT::TextStream & stream, const std::string & column_prefix, ModelData * model_data); + virtual void generate_select_columns(PT::TextStream & stream, const std::string & column_prefix); virtual void generate_doc_for_flat(PT::TextStream & stream, bool clear_stream = true); virtual void generate_doc_for_db(PT::TextStream & stream, bool clear_stream = true); @@ -132,6 +131,7 @@ public: // set object to default values virtual void clear(); + // we need a pointer to ModelData here? virtual void prepare_to_select(); @@ -139,11 +139,8 @@ protected: ModelConnector * model_connector; SaveMode save_mode; - ModelData * model_data; - const void * doc_field_pointer; - int model_connector_mode; - QueryResult * query_result; - int table_index; + ModelEnv * model_env; + Model(); @@ -167,8 +164,10 @@ protected: virtual int get_connector_mode(); + virtual ModelData * get_model_data(); + // used by Cursor - virtual void map_values_from_query(QueryResult * query_result); + virtual void map_values_from_query(); ///////////////////////////////// @@ -639,7 +638,7 @@ protected: { if( model_connector ) { - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { FlatConnector * flat_connector = model_connector->get_flat_connector(); @@ -650,12 +649,12 @@ protected: if( flat_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here - flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); + flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data); } } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) { DbConnector * db_connector = model_connector->get_db_connector(); @@ -665,17 +664,17 @@ protected: if( db_expression && !is_empty_field(db_field_name) ) { - db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); + db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data); - if( model_data ) + if( model_env->model_data ) { - model_data->current_column += 1; + model_env->model_data->current_column += 1; } } } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) { DbConnector * db_connector = model_connector->get_db_connector(); @@ -683,10 +682,10 @@ protected: { if( !is_empty_field(db_field_name) ) { - if( model_data && model_data->has_autogenerated_select ) + if( model_env->model_data && model_env->model_data->has_autogenerated_select ) { - get_value_by_field_index(model_data->current_column, field_value); - model_data->current_column += 1; + get_value_by_field_index(model_env->model_data->current_column, field_value); + model_env->model_data->current_column += 1; } else { @@ -696,7 +695,7 @@ protected: } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { Clearer * clearer = model_connector->get_clearer(); @@ -706,7 +705,7 @@ protected: } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) @@ -728,36 +727,36 @@ protected: void field_model_left_join(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key, DbExpression * db_expression) { - if( model_data ) + if( model_env->model_data ) { - model_data->morm_current_max_column += 1; - model_data->morm_foreign_keys.clear(); + model_env->model_data->morm_current_max_column += 1; + model_env->model_data->morm_foreign_keys.clear(); - model_data->morm_finder_join_tables << "LEFT JOIN "; - field_model.table_name(model_data->morm_finder_join_tables); - model_data->morm_finder_join_tables << " AS "; + model_env->model_data->morm_finder_join_tables << "LEFT JOIN "; + field_model.table_name(model_env->model_data->morm_finder_join_tables); + model_env->model_data->morm_finder_join_tables << " AS "; ////////////// PT::TextStream join_table_name_this; table_name_for_join_as(join_table_name_this); - if( table_index > 1 ) - join_table_name_this << table_index; + if( model_env->table_index > 1 ) + join_table_name_this << model_env->table_index; /////////// PT::TextStream join_table_name; field_model.table_name_for_join_as(join_table_name); - field_model.table_index = model_data->add_join_table(join_table_name); + field_model.model_env->table_index = model_env->model_data->add_join_table(join_table_name); - if( field_model.table_index > 1 ) - join_table_name << field_model.table_index; + if( field_model.model_env->table_index > 1 ) + join_table_name << field_model.model_env->table_index; ////////// - model_data->morm_finder_join_tables << join_table_name; + model_env->model_data->morm_finder_join_tables << join_table_name; int expr_work_mode = db_expression->get_work_mode(); int expr_output_type = db_expression->get_output_type(); @@ -771,29 +770,29 @@ protected: { field_model.map_fields(); - model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape? - model_data->morm_finder_join_tables << " = " << join_table_name << '.'; + model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape? + model_env->model_data->morm_finder_join_tables << " = " << join_table_name << '.'; - if( !model_data->morm_foreign_keys.empty() ) + if( !model_env->model_data->morm_foreign_keys.empty() ) { - model_data->morm_finder_join_tables << model_data->morm_foreign_keys.front(); + model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front(); } } else { map_fields(); - model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.'; + model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.'; - if( !model_data->morm_foreign_keys.empty() ) + if( !model_env->model_data->morm_foreign_keys.empty() ) { - model_data->morm_finder_join_tables << model_data->morm_foreign_keys.front(); + model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front(); } - model_data->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name; + model_env->model_data->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name; } - model_data->morm_finder_join_tables << ' '; + model_env->model_data->morm_finder_join_tables << ' '; db_expression->set_work_mode(expr_work_mode); db_expression->set_output_type(expr_output_type); @@ -804,108 +803,155 @@ protected: } + + void field_model_generate_flat_string(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) + { + FlatConnector * flat_connector = model_connector->get_flat_connector(); + + if( flat_connector ) + { + FlatExpression * flat_expression = flat_connector->get_expression(); + + if( flat_expression && !is_empty_field(flat_field_name) ) + { + field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING; + flat_expression->field_model(flat_field_name, field_model, insertable, updatable, false); + } + } + } + + + void field_model_generate_db_sql(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + DbExpression * db_expression = db_connector->get_expression(); + + if( db_expression && !is_empty_field(db_field_name) ) + { + field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + + if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS ) + { + field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression); + } + + if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES ) + { + // they dont have to be copied out, this is the same as current table name and table_index + std::string current_prefix = db_expression->get_column_prefix(); + int current_table_index = db_expression->get_column_prefix_index(); + + /////////// + PT::TextStream join_table_name; + field_model.table_name_for_join_as(join_table_name); // RENAME this method + + std::string sss; // improve me + join_table_name.to_string(sss); + + // now we dont need set_column_prefix()?, we can pass ModelEnv there somewhat? + db_expression->set_column_prefix(sss, field_model.model_env->table_index); + + field_model.map_fields(); + + db_expression->set_column_prefix(current_prefix, current_table_index); + } + + field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + + if( model_env->model_data ) + { + model_env->model_data->current_column += 1; + } + } + } + } + + + void field_model_clear_values(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) + { + Clearer * clearer = model_connector->get_clearer(); + + if( clearer ) + { + clearer->clear_model(field_model); + } + } + + + void field_model_generate_doc_flat(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) + { + FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) + + if( doc_connector ) + { + FlatExpression * doc_expression = doc_connector->get_expression(); + + // potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych + 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_model, insertable, updatable, false); + } + } + } + + + void field_model_read_values_from_queryresult(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + if( !is_empty_field(db_field_name) ) + { + // we need to test if the object is actually defined, test nulls on primary key? + + field_model.before_select(); + field_model.set_save_mode(Model::DO_UPDATE_ON_SAVE); // IMPROVE ME check if there is a primary key + field_model.map_values_from_query(); + field_model.after_select(); + } + } + } + + void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key) { if( model_connector ) { + ModelEnv model_env_local(*model_env); + field_model.model_env = &model_env_local; field_model.set_connector(model_connector); - field_model.model_data = model_data; - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { - FlatConnector * flat_connector = model_connector->get_flat_connector(); - - if( flat_connector ) - { - FlatExpression * flat_expression = flat_connector->get_expression(); - - if( flat_expression && !is_empty_field(flat_field_name) ) - { - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING; - flat_expression->field_model(flat_field_name, field_model, insertable, updatable, false); - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - } - } + field_model_generate_flat_string(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key); } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) { - DbConnector * db_connector = model_connector->get_db_connector(); - - if( db_connector ) - { - DbExpression * db_expression = db_connector->get_expression(); - - if( db_expression && !is_empty_field(db_field_name) ) - { - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; - - if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS ) - { - field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression); - } - - if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES ) - { - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; - - // they dont have to be copied out, this is the same as current table name and table_index - std::string current_prefix = db_expression->get_column_prefix(); - int current_table_index = db_expression->get_column_prefix_index(); - - /////////// - PT::TextStream join_table_name; - field_model.table_name_for_join_as(join_table_name); // RENAME this method - - std::string sss; // improve me - join_table_name.to_string(sss); - - db_expression->set_column_prefix(sss, field_model.table_index); - - field_model.map_fields(); - - db_expression->set_column_prefix(current_prefix, current_table_index); - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - } - - field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; - - if( model_data ) - { - model_data->current_column += 1; - } - } - } + field_model_generate_db_sql(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key); } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { - Clearer * clearer = model_connector->get_clearer(); - - if( clearer ) - { - clearer->clear_model(field_model); - } + field_model_clear_values(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key); } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { - FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) - - if( doc_connector ) - { - FlatExpression * doc_expression = doc_connector->get_expression(); - - // potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych - 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_model, insertable, updatable, false); - } - } + field_model_generate_doc_flat(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key); } - field_model.model_data = nullptr; + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) + { + field_model_read_values_from_queryresult(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key); + } + + field_model.model_env = nullptr; } } @@ -915,7 +961,7 @@ protected: { if( model_connector ) { - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { FlatConnector * flat_connector = model_connector->get_flat_connector(); @@ -928,12 +974,12 @@ 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, false, model_connector, model_connector_mode, model_data); + flat_expression->field_list(flat_field_name, field_container, insertable, updatable, false, model_connector, model_env->model_connector_mode, model_env->model_data); } } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) { DbConnector * db_connector = model_connector->get_db_connector(); @@ -951,7 +997,7 @@ protected: } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { Clearer * clearer = model_connector->get_clearer(); @@ -961,7 +1007,7 @@ protected: } } - if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) @@ -973,7 +1019,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, false, model_data); + doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, false, model_env->model_data); } } } @@ -984,9 +1030,9 @@ protected: template void get_value_by_field_index(int field_index, FieldValue & field_value) { - if( query_result ) + if( model_env->model_data && model_env->model_data->query_result ) { - const char * val_str = query_result->get_field_string_value(field_index); + const char * val_str = model_env->model_data->query_result->get_field_string_value(field_index); if( val_str ) { @@ -1004,9 +1050,9 @@ protected: template void get_value_by_field_name(const wchar_t * field_name, FieldValue & field_value) { - if( query_result ) + if( model_env->model_data && model_env->model_data->query_result ) { - const char * val_str = query_result->get_field_string_value(field_name); + const char * val_str = model_env->model_data->query_result->get_field_string_value(field_name); if( val_str ) { @@ -1025,7 +1071,7 @@ protected: template void doc_field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value) { - if( reinterpret_cast(&field_value) == doc_field_pointer && model_connector ) + if( reinterpret_cast(&field_value) == model_env->doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); @@ -1049,7 +1095,7 @@ protected: void doc_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model) { - if( reinterpret_cast(&field_model) == doc_field_pointer && model_connector ) + if( reinterpret_cast(&field_model) == model_env->doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); @@ -1074,7 +1120,7 @@ protected: template void doc_field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container) { - if( reinterpret_cast(&field_container) == doc_field_pointer && model_connector ) + if( reinterpret_cast(&field_container) == model_env->doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); @@ -1161,8 +1207,7 @@ protected: virtual bool is_empty_field(const wchar_t * value); - - //template friend class Finder; + template friend class Finder; template friend class Cursor; friend class BaseExpression; diff --git a/src/modeldata.h b/src/modeldata.h index df6ef2d..8781181 100644 --- a/src/modeldata.h +++ b/src/modeldata.h @@ -35,6 +35,8 @@ #ifndef headerfile_morm_modeldata #define headerfile_morm_modeldata +#include "queryresult.h" + namespace morm { @@ -47,6 +49,7 @@ public: { morm_current_max_column = 1; current_column = 1; + query_result = nullptr; } virtual ~ModelData() @@ -55,7 +58,12 @@ public: bool has_autogenerated_select; + QueryResult * query_result; +// int table_index; + + // can be moved to another struct? + // let ModelData be only for user stuff PT::TextStream morm_finder_join_tables; std::list morm_foreign_keys; int morm_current_max_column; @@ -69,6 +77,9 @@ public: virtual void prepare_to_new_select() { has_autogenerated_select = false; + query_result = nullptr; + +// table_index = 1; morm_current_max_column = 1; morm_finder_join_tables.clear(); diff --git a/src/modelenv.h b/src/modelenv.h new file mode 100644 index 0000000..5c34e14 --- /dev/null +++ b/src/modelenv.h @@ -0,0 +1,90 @@ +/* + * 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_modelenv +#define headerfile_morm_modelenv + +#include "modeldata.h" +#include "morm_types.h" + + +namespace morm +{ + +// rename me? +class ModelEnv +{ +public: + + ModelData * model_data; + int model_connector_mode; + int table_index; + const void * doc_field_pointer; + + + ModelEnv() + { + clear(); + } + + + ~ModelEnv() + { + } + + + ModelEnv(const ModelEnv & e) + { + model_data = e.model_data; + model_connector_mode = e.model_connector_mode; + table_index = e.table_index; + doc_field_pointer = e.doc_field_pointer; + } + + + void clear() + { + model_data = nullptr; + model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + table_index = 0; + doc_field_pointer = nullptr; + } + + +}; + +} + + +#endif