diff --git a/src/baseexpression.h b/src/baseexpression.h index 351b8b9..08e36d1 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -312,7 +312,40 @@ protected: (*out_stream) << ") "; } - // what about lists with a pod types? e.g. list + + template + void put_field_value_list_non_model(ModelContainer & field_value, ModelConnector * model_connector) + { + if( model_connector && out_stream ) + { + bool is_first = true; + before_field_value_list(); + + for(const auto & m : field_value) + { + if( !is_first ) + { + field_value_list_separator(); + } + + //ModelEnv model_env_local(*model_env); + //m.model_env = &model_env_local; + //before_field_value(field_value); + //m.set_connector(model_connector); + + put_field_value(m); + + //generate_from_model(m); + //m.model_env = nullptr; + //after_field_value(field_value); + is_first = false; + } + + after_field_value_list(); + } + } + + template void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, ModelEnv * model_env) { @@ -343,6 +376,182 @@ protected: } + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::vector & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + + + + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + void put_field_value_list(std::list & field_value, ModelConnector * model_connector, ModelEnv *) + { + put_field_value_list_non_model(field_value, model_connector); + } + + + // used in 'in()' statements, may should be renamed? template void field_in_generic(PT::TextStream & stream, const wchar_t * field_name, const Container & container, ModelEnv * model_env) @@ -437,7 +646,13 @@ protected: template void put_type(const std::list & model, PT::TextStream & stream) { - stream << "table"; + stream << "table"; // may just use std::list? + } + + template + void put_type(const std::vector & model, PT::TextStream & stream) + { + stream << "table"; // may just just std::vector? } }; diff --git a/src/model.cpp b/src/model.cpp index 7ce8d7f..b670279 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -210,8 +210,11 @@ std::string Model::to_string() -void Model::generate_insert_query(PT::TextStream & stream) +void Model::generate_insert_query(PT::TextStream & stream, ModelData * model_data) { + 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; if( model_connector ) @@ -224,7 +227,8 @@ void Model::generate_insert_query(PT::TextStream & stream) } } - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } @@ -277,8 +281,11 @@ bool Model::insert(ModelData & model_data) } -void Model::generate_update_query(PT::TextStream & stream) +void Model::generate_update_query(PT::TextStream & stream, ModelData * model_data) { + 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; if( model_connector ) @@ -291,7 +298,8 @@ void Model::generate_update_query(PT::TextStream & stream) } } - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } @@ -337,20 +345,25 @@ bool Model::update(ModelData & model_data) } -void Model::generate_remove_query(PT::TextStream & stream) +void Model::generate_remove_query(PT::TextStream & stream, ModelData * model_data) { + 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; + if( model_connector ) { DbConnector * db_connector = model_connector->get_db_connector(); - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; if( db_connector ) { db_connector->generate_remove_query(stream, *this); } - - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } + + // what about if an exception was thrown? this pointer will not be null + model_env = nullptr; } diff --git a/src/model.h b/src/model.h index e14b616..d0f1a68 100644 --- a/src/model.h +++ b/src/model.h @@ -36,6 +36,8 @@ #define headerfile_morm_model #include +#include +#include #include "textstream/textstream.h" #include "modelconnector.h" @@ -107,15 +109,15 @@ public: virtual std::string to_text(); virtual std::string to_string(); - virtual void generate_insert_query(PT::TextStream & stream); // FIX ME needed model_data + virtual void generate_insert_query(PT::TextStream & stream, ModelData * model_data = nullptr); virtual bool insert(ModelData * model_data = nullptr); virtual bool insert(ModelData & model_data); - virtual void generate_update_query(PT::TextStream & stream); // FIX ME needed model_data + virtual void generate_update_query(PT::TextStream & stream, ModelData * model_data = nullptr); virtual bool update(ModelData * model_data = nullptr); virtual bool update(ModelData & model_data); - virtual void generate_remove_query(PT::TextStream & stream); // FIX ME needed model_data + virtual void generate_remove_query(PT::TextStream & stream, ModelData * model_data = nullptr); virtual bool remove(ModelData * model_data = nullptr); virtual bool remove(ModelData & model_data); @@ -281,6 +283,12 @@ protected: field_list(field_name, field_name, field_value, list_model_null_pointer, insertable, updatable); } + template + void field(const wchar_t * field_name, std::vector & field_value, bool insertable = true, bool updatable = true) + { + ModelClass * list_model_null_pointer = nullptr; + field_list(field_name, field_name, field_value, list_model_null_pointer, insertable, updatable); + } ////////////////////// @@ -397,7 +405,14 @@ protected: field_list(db_field_name, flat_field_name, field_value, list_model_null_pointer, insertable, updatable); } -////////////////////// + template + void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::vector & field_value, bool insertable = true, bool updatable = true) + { + ModelClass * list_model_null_pointer = nullptr; + field_list(db_field_name, flat_field_name, field_value, list_model_null_pointer, insertable, updatable); + } + + ////////////////////// void doc(const wchar_t * field_name, char & field_value) { doc_field_generic(field_name, field_name, field_value); @@ -813,6 +828,8 @@ protected: if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES ) { + // FIX ME + // UPDATE, INSERT, REMOVE for models field_model.map_fields(); } @@ -946,6 +963,9 @@ protected: // another select will be used (from another Finder) // we need only columns name // but columns are defined in the other model + + // FIX ME + // UPDATE, INSERT, REMOVE for lists } } }