diff --git a/src/model.cpp b/src/model.cpp index db52ef0..598fc37 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -262,7 +262,8 @@ bool Model::insert_tree(bool insert_whole_tree) if( insert_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_INSERT; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_INSERT; map_fields(); } @@ -296,7 +297,8 @@ bool Model::insert_tree(bool insert_whole_tree) if( insert_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_INSERT; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_INSERT; map_fields(); } @@ -355,7 +357,8 @@ bool Model::update_tree(bool update_whole_tree) if( update_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_UPDATE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_UPDATE; map_fields(); } @@ -382,7 +385,8 @@ bool Model::update_tree(bool update_whole_tree) if( update_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_UPDATE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_UPDATE; map_fields(); } @@ -441,7 +445,8 @@ bool Model::remove_tree(bool remove_whole_tree) if( remove_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_REMOVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_REMOVE; map_fields(); } @@ -473,7 +478,8 @@ bool Model::remove_tree(bool remove_whole_tree) if( remove_whole_tree ) { - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_REMOVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_REMOVE; map_fields(); } @@ -511,10 +517,11 @@ bool Model::save_tree(bool save_whole_tree) if( save_whole_tree ) { if( save_mode == DO_DELETE_ON_SAVE ) - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY; else - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_SAVE; map_fields(); } @@ -544,10 +551,11 @@ bool Model::save_tree(bool save_whole_tree) if( save_whole_tree ) { if( save_mode == DO_DELETE_ON_SAVE ) - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY; else - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY; + model_env->model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_SAVE; map_fields(); } diff --git a/src/model.h b/src/model.h index aeec000..2ee6555 100644 --- a/src/model.h +++ b/src/model.h @@ -674,6 +674,152 @@ protected: protected: + template + void field_generic_set_field_value(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) + { + if( model_env->field_value_helper_tab ) + { + if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) + { + FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; + PT::Log * log = model_connector->get_logger(); + + if( is_the_same_field(db_field_name, helper.db_field_name) && + is_the_same_field(flat_field_name, helper.flat_field_name) ) + { + if( helper.value_object && helper.value_type_info ) + { + if( typeid(field_value) == *helper.value_type_info ) + { + field_value = *(FieldValue*)helper.value_object; + } + else + { + table_name(model_env->table_name); + (*log) << PT::Log::log1 << "Morm: incorrect type of a field in " << model_env->table_name << ", "; + + if( !is_empty_field(db_field_name) ) + (*log) << "database field name: " << db_field_name << ", "; + + if( !is_empty_field(flat_field_name) ) + (*log) << "flat field name: " << flat_field_name << ", "; + + (*log) << "type expected " << typeid(field_value).name() + << " got " << helper.value_type_info->name() << PT::Log::logend; + } + } + + model_env->field_index += 1; + } + } + } + } + + template + void field_generic_iterate_primary_key_values(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) + { + if( is_primary_key ) + { + if( model_env->field_value_helper_tab ) + { + if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) + { + FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; + helper.value_object = &field_value; + helper.value_type_info = &typeid(field_value); + } + } + + model_env->field_index += 1; + } + } + + template + void field_generic_generate_flat_string(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_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) ) + { + // insertable, updatable and is_primary_key are ignored here + flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, model_env); + } + } + } + + template + void field_generic_generate_db_sql(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_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) ) + { + db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, model_env); + } + } + } + + template + void field_generic_read_value_from_db_resultset(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + if( !is_empty_field(db_field_name) ) + { + if( model_env->cursor_helper && model_env->cursor_helper->has_autogenerated_select ) + { + get_value_by_field_index(model_env->cursor_helper->current_column, field_value); + model_env->cursor_helper->current_column += 1; + } + else + { + get_value_by_field_name(db_field_name, field_value); + } + } + } + } + + template + void field_generic_clear_value(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) + { + Clearer * clearer = model_connector->get_clearer(); + + if( clearer ) + { + clearer->clear_value(field_value); + } + } + + // will be changed + template + void field_generic_generate_doc_for_flat(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_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_value, insertable, updatable, is_primary_key, model_env); + } + } + } + + template void field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) { @@ -681,137 +827,37 @@ protected: { if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE ) { - if( model_env->field_value_helper_tab ) - { - if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) - { - FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; - PT::Log * log = model_connector->get_logger(); - - if( is_the_same_field(db_field_name, helper.db_field_name) && - is_the_same_field(flat_field_name, helper.flat_field_name) ) - { - if( helper.value_object && helper.value_type_info ) - { - if( typeid(field_value) == *helper.value_type_info ) - { - field_value = *(FieldValue*)helper.value_object; - } - else - { - table_name(model_env->table_name); - (*log) << PT::Log::log1 << "Morm: incorrect type of a field in " << model_env->table_name << ", "; - - if( !is_empty_field(db_field_name) ) - (*log) << "database field name: " << db_field_name << ", "; - - if( !is_empty_field(flat_field_name) ) - (*log) << "flat field name: " << flat_field_name << ", "; - - (*log) << "type expected " << typeid(field_value).name() - << " got " << helper.value_type_info->name() << PT::Log::logend; - } - } - - model_env->field_index += 1; - } - } - } + field_generic_set_field_value(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES && is_primary_key ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES ) { - if( model_env->field_value_helper_tab ) - { - if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) - { - FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; - helper.value_object = &field_value; - helper.value_type_info = &typeid(field_value); - } - } - - model_env->field_index += 1; + field_generic_iterate_primary_key_values(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } - 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) ) - { - // insertable, updatable and is_primary_key are ignored here - flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, model_env); - } - } + field_generic_generate_flat_string(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } 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) ) - { - db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, model_env); - } - } + field_generic_generate_db_sql(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) { - DbConnector * db_connector = model_connector->get_db_connector(); - - if( db_connector ) - { - if( !is_empty_field(db_field_name) ) - { - if( model_env->cursor_helper && model_env->cursor_helper->has_autogenerated_select ) - { - get_value_by_field_index(model_env->cursor_helper->current_column, field_value); - model_env->cursor_helper->current_column += 1; - } - else - { - get_value_by_field_name(db_field_name, field_value); - } - } - } + field_generic_read_value_from_db_resultset(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { - Clearer * clearer = model_connector->get_clearer(); - - if( clearer ) - { - clearer->clear_value(field_value); - } + field_generic_clear_value(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } 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_value, insertable, updatable, is_primary_key, model_env); - } - } + field_generic_generate_doc_for_flat(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } } } @@ -882,6 +928,104 @@ protected: } + void field_model_set_parent_key(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model) + { + DbConnector * db_connector = model_connector->get_db_connector(); + PT::Log * log = model_connector->get_logger(); + + if( db_connector ) + { + DbExpression * db_expression = db_connector->get_expression(); + + if( db_expression && !is_empty_field(db_field_name) ) + { + int old_connector_mode = model_env->model_connector_mode; + model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES; + + FieldValueHelper helper; // in the future we can have a primary key from more than one column + helper.db_field_name = db_field_name; + helper.flat_field_name = flat_field_name; + + std::vector helper_tab; + helper_tab.push_back(helper); + + model_env->field_value_helper_tab = &helper_tab; + model_env->field_index = 0; + + /* + * first we iterate through fields and save primary key values to helper_tab + */ + map_fields(); + + if( (size_t)model_env->field_index == helper_tab.size() ) + { + ModelEnv model_env_local; + model_env_local.copy_global_objects(*model_env); + model_env_local.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE; + model_env_local.field_value_helper_tab = &helper_tab; + model_env_local.field_index = 0; + field_model.model_env = &model_env_local; + + /* + * now we iterate through fields in field_model and save primary key values from *this object to the specified fields in field_model + */ + field_model.map_fields(); + + if( (size_t)field_model.model_env->field_index != helper_tab.size() && log ) + { + table_name(model_env->table_name); + field_model.table_name(field_model.model_env->table_name); + + (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of " << model_env->field_index << " column(s)" + << " but in " << field_model.model_env->table_name << " there are only " + << field_model.model_env->field_index << " matching column(s)" << PT::Log::logend; + } + + field_model.model_env = nullptr; + } + else + if( log ) + { + table_name(model_env->table_name); + + (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of incorrect number of columns" + << ", expected " << helper_tab.size() << " column(s) but got " << model_env->field_index << PT::Log::logend; + } + + model_env->field_value_helper_tab = nullptr; + model_env->model_connector_mode = old_connector_mode; + } + } + } + + + void field_model_iterate_through_childs(const wchar_t * db_field_name, Model & field_model) + { + if( !is_empty_field(db_field_name) ) + { + if( model_env->model_connector_submode == MORM_MODEL_CONNECTOR_SUBMODE_INSERT ) + { + field_model.insert_tree(true); + } + + if( model_env->model_connector_submode == MORM_MODEL_CONNECTOR_SUBMODE_UPDATE ) + { + field_model.update_tree(true); + } + + if( model_env->model_connector_submode == MORM_MODEL_CONNECTOR_SUBMODE_REMOVE ) + { + field_model.remove_tree(true); + } + + if( model_env->model_connector_submode == MORM_MODEL_CONNECTOR_SUBMODE_SAVE ) + { + field_model.save_tree(true); + } + } + } + + 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) { @@ -1031,77 +1175,6 @@ protected: } } - void field_model_set_parent_key(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model) - { - DbConnector * db_connector = model_connector->get_db_connector(); - PT::Log * log = model_connector->get_logger(); - - if( db_connector ) - { - DbExpression * db_expression = db_connector->get_expression(); - - if( db_expression && !is_empty_field(db_field_name) ) - { - int old_connector_mode = model_env->model_connector_mode; - model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES; - - FieldValueHelper helper; // in the future we can have a primary key from more than one column - helper.db_field_name = db_field_name; - helper.flat_field_name = flat_field_name; - - std::vector helper_tab; - helper_tab.push_back(helper); - - model_env->field_value_helper_tab = &helper_tab; - model_env->field_index = 0; - - /* - * first we iterate through fields and save primary key values to helper_tab - */ - map_fields(); - - if( (size_t)model_env->field_index == helper_tab.size() ) - { - ModelEnv model_env_local; - model_env_local.copy_global_objects(*model_env); - model_env_local.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE; - model_env_local.field_value_helper_tab = &helper_tab; - model_env_local.field_index = 0; - field_model.model_env = &model_env_local; - - /* - * now we iterate through fields in field_model and save primary key values from *this object to the specified fields in field_model - */ - field_model.map_fields(); - - if( (size_t)field_model.model_env->field_index != helper_tab.size() && log ) - { - table_name(model_env->table_name); - field_model.table_name(field_model.model_env->table_name); - - (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of " << model_env->field_index << " column(s)" - << " but in " << field_model.model_env->table_name << " there are only " - << field_model.model_env->field_index << " matching column(s)" << PT::Log::logend; - } - - field_model.model_env = nullptr; - } - else - if( log ) - { - table_name(model_env->table_name); - - (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of incorrect number of columns" - << ", expected " << helper_tab.size() << " column(s) but got " << model_env->field_index << PT::Log::logend; - } - - model_env->field_value_helper_tab = nullptr; - model_env->model_connector_mode = old_connector_mode; - } - } - } - - 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 && model_env ) @@ -1112,51 +1185,27 @@ protected: field_model.model_env = &model_env_local; field_model.set_connector(model_connector); - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_SET_PARENT_ID && !has_foreign_key ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_SET_PARENT_ID ) { - field_model_set_parent_key(db_field_name, flat_field_name, field_model); + if( !has_foreign_key ) + { + field_model_set_parent_key(db_field_name, flat_field_name, field_model); + } } - if( !is_empty_field(db_field_name) ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY ) { - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_INSERT && has_foreign_key ) + if( has_foreign_key ) { - field_model.insert_tree(true); + field_model_iterate_through_childs(db_field_name, field_model); } + } - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_INSERT && !has_foreign_key ) + if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY ) + { + if( !has_foreign_key ) { - field_model.insert_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_UPDATE && has_foreign_key ) - { - field_model.update_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_UPDATE && !has_foreign_key ) - { - field_model.update_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_REMOVE && has_foreign_key ) - { - field_model.remove_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_REMOVE && !has_foreign_key ) - { - field_model.remove_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE && has_foreign_key ) - { - field_model.save_tree(true); - } - - if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE && !has_foreign_key ) - { - field_model.save_tree(true); + field_model_iterate_through_childs(db_field_name, field_model); } } diff --git a/src/modelenv.h b/src/modelenv.h index 3f9e26c..a6ba1b1 100644 --- a/src/modelenv.h +++ b/src/modelenv.h @@ -56,6 +56,7 @@ public: FinderHelper * finder_helper; CursorHelper * cursor_helper; int model_connector_mode; + int model_connector_submode; bool dump_mode; // local objects @@ -89,6 +90,7 @@ public: finder_helper = e.finder_helper; cursor_helper = e.cursor_helper; model_connector_mode = e.model_connector_mode; + model_connector_submode = e.model_connector_submode; dump_mode = e.dump_mode; table_index = e.table_index; doc_field_pointer = e.doc_field_pointer; @@ -108,6 +110,7 @@ public: cursor_helper = e.cursor_helper; model_connector_mode = e.model_connector_mode; + model_connector_submode = e.model_connector_submode; dump_mode = e.dump_mode; // what about doc_field_pointer? @@ -119,6 +122,7 @@ public: finder_helper = nullptr; cursor_helper = nullptr; model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + model_connector_submode = MORM_MODEL_CONNECTOR_SUBMODE_NONE; dump_mode = false; doc_field_pointer = nullptr; table_name.clear(); diff --git a/src/morm_types.h b/src/morm_types.h index 050f693..fab2d49 100644 --- a/src/morm_types.h +++ b/src/morm_types.h @@ -47,24 +47,20 @@ #define MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET 6 #define MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE 7 +#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY 8 +#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY 9 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_INSERT 8 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_INSERT 9 +#define MORM_MODEL_CONNECTOR_MODE_SET_PARENT_ID 10 +#define MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES 11 +#define MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE 12 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_UPDATE 10 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_UPDATE 11 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE 12 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE 13 - -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_REMOVE 14 -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_REMOVE 15 - -#define MORM_MODEL_CONNECTOR_MODE_SET_PARENT_ID 16 - -#define MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES 17 - -#define MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE 18 +// submodes used in some cases +#define MORM_MODEL_CONNECTOR_SUBMODE_NONE 0 +#define MORM_MODEL_CONNECTOR_SUBMODE_INSERT 1 +#define MORM_MODEL_CONNECTOR_SUBMODE_UPDATE 2 +#define MORM_MODEL_CONNECTOR_SUBMODE_REMOVE 3 +#define MORM_MODEL_CONNECTOR_SUBMODE_SAVE 4