From ac67f0079ae5cd49b457e55157ee9cfb3e1a150a Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Wed, 25 Sep 2019 16:20:37 +0000 Subject: [PATCH] fixed: in Model::remove(ModelData & model_data, bool remove_whole_tree) we didn't use remove_whole_tree parameter fixed: compilation erorr when inserting/updating a Model object which has child lists without Model objects such as std::list added: to Model: methods insert, update, remove and save with one argument: bool save_whole_tree git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1217 e52654a7-88a9-db11-a3e9-0013d4bc506e --- src/model.cpp | 27 ++++++++++++++++++++++++++- src/model.h | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/model.cpp b/src/model.cpp index c80296b..44312e8 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -239,6 +239,12 @@ bool Model::insert(ModelData & model_data, bool insert_whole_tree) } +bool Model::insert(bool insert_whole_tree) +{ + return insert(nullptr, insert_whole_tree); +} + + bool Model::insert(ModelData * model_data, bool insert_whole_tree) { ModelEnv model_env_local; @@ -335,6 +341,12 @@ bool Model::update(ModelData & model_data, bool update_whole_tree) } +bool Model::update(bool update_whole_tree) +{ + return update(nullptr, update_whole_tree); +} + + bool Model::update(ModelData * model_data, bool update_whole_tree) { ModelEnv model_env_local; @@ -419,7 +431,13 @@ void Model::generate_remove_query(PT::TextStream & stream, ModelData * model_dat bool Model::remove(ModelData & model_data, bool remove_whole_tree) { - return remove(&model_data); + return remove(&model_data, remove_whole_tree); +} + + +bool Model::remove(bool remove_whole_tree) +{ + return remove(nullptr, remove_whole_tree); } @@ -494,6 +512,13 @@ bool Model::save(ModelData & model_data, bool save_whole_tree) return save(&model_data, save_whole_tree); } + +bool Model::save(bool save_whole_tree) +{ + return save(nullptr, save_whole_tree); +} + + bool Model::save(ModelData * model_data, bool save_whole_tree) { ModelEnv model_env_local; diff --git a/src/model.h b/src/model.h index 1ed4d4c..0062565 100644 --- a/src/model.h +++ b/src/model.h @@ -39,6 +39,7 @@ #include #include #include +#include #include "textstream/textstream.h" #include "modelconnector.h" @@ -109,19 +110,24 @@ public: virtual std::string to_string(); virtual void generate_insert_query(PT::TextStream & stream, ModelData * model_data = nullptr); - virtual bool insert(ModelData * model_data = nullptr, bool insert_whole_tree = true); + virtual bool insert(ModelData * model_data, bool insert_whole_tree = true); virtual bool insert(ModelData & model_data, bool insert_whole_tree = true); + virtual bool insert(bool insert_whole_tree = true); virtual void generate_update_query(PT::TextStream & stream, ModelData * model_data = nullptr); - virtual bool update(ModelData * model_data = nullptr, bool update_whole_tree = true); + virtual bool update(ModelData * model_data, bool update_whole_tree = true); virtual bool update(ModelData & model_data, bool update_whole_tree = true); + virtual bool update(bool update_whole_tree = true); virtual void generate_remove_query(PT::TextStream & stream, ModelData * model_data = nullptr); - virtual bool remove(ModelData * model_data = nullptr, bool remove_whole_tree = true); + virtual bool remove(ModelData * model_data, bool remove_whole_tree = true); virtual bool remove(ModelData & model_data, bool remove_whole_tree = true); + virtual bool remove(bool remove_whole_tree = true); - virtual bool save(ModelData * model_data = nullptr, bool save_whole_tree = true); + virtual bool save(ModelData * model_data, bool save_whole_tree = true); virtual bool save(ModelData & model_data, bool save_whole_tree = true); + virtual bool save(bool save_whole_tree = true); + virtual void generate_select_columns(PT::TextStream & stream); @@ -1106,14 +1112,29 @@ protected: { if( model_connector && model_env ) { - if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_SET_PARENT_ID ) + if( !is_empty_field(db_field_name) ) { - field_list_set_parent_key(db_field_name, field_container, model_container_type); - } + if constexpr (std::is_base_of()) + { + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_SET_PARENT_ID ) + { + field_list_set_parent_key(db_field_name, field_container, model_container_type); + } - if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY ) - { - field_list_iterate_through_childs(db_field_name, field_container, model_container_type); + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY ) + { + field_list_iterate_through_childs(db_field_name, field_container, model_container_type); + } + } + else + { + PT::Log * plog = model_connector->get_logger(); + + if( plog ) + { + (*plog) << "Morm: ignoring " << db_field_name << " as this is not a container with Model objects" << PT::Log::logend; + } + } } if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING ) @@ -1256,6 +1277,7 @@ public: } } + // RENAME ME to something like select_field() or field_select() template void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, FieldValue & field_value) {