now Model.update() and Model.insert() can update/insert the whole tree with child models

(at the moment without lists/vectors only model childs)



git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1205 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2019-09-04 16:02:18 +00:00
parent 7ff05f493c
commit d2f851faf9
9 changed files with 228 additions and 89 deletions

View File

@@ -232,6 +232,12 @@ void Model::generate_insert_query(PT::TextStream & stream, ModelData * model_dat
}
bool Model::insert(ModelData & model_data, bool insert_whole_tree)
{
return insert(&model_data, insert_whole_tree);
}
bool Model::insert(ModelData * model_data, bool insert_whole_tree)
{
ModelEnv model_env_local;
@@ -248,13 +254,14 @@ bool Model::insert(ModelData * model_data, bool insert_whole_tree)
// has ModelEnv set
// FIX ME we need to propagage the status from the whole tree, if there is an error somewhere then we should return error from the parent
bool Model::insert_tree(bool insert_whole_tree)
{
bool result = false;
if( insert_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_INSERT;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_INSERT;
map_fields();
}
@@ -288,7 +295,7 @@ bool Model::insert_tree(bool insert_whole_tree)
if( insert_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_INSERT_XXX;
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_INSERT;
map_fields();
}
@@ -297,12 +304,6 @@ bool Model::insert_tree(bool insert_whole_tree)
bool Model::insert(ModelData & model_data, bool insert_whole_tree)
{
return insert(&model_data, insert_whole_tree);
}
void Model::generate_update_query(PT::TextStream & stream, ModelData * model_data)
{
ModelEnv model_env_local;
@@ -325,16 +326,40 @@ void Model::generate_update_query(PT::TextStream & stream, ModelData * model_dat
}
bool Model::update(ModelData * model_data)
bool Model::update(ModelData & model_data, bool update_whole_tree)
{
return update(&model_data, update_whole_tree);
}
bool Model::update(ModelData * model_data, bool update_whole_tree)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_data = model_data;
bool status = update_tree(update_whole_tree);
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
return status;
}
// FIX ME we need to propagage the status from the whole tree, if there is an error somewhere then we should return error from the parent
bool Model::update_tree(bool update_whole_tree)
{
bool result = false;
if( update_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_UPDATE;
map_fields();
}
if( model_connector )
{
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();
@@ -352,21 +377,18 @@ bool Model::update(ModelData * model_data)
else
after_update_failure();
}
}
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
if( update_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_UPDATE;
map_fields();
}
return result;
}
bool Model::update(ModelData & model_data)
{
return update(&model_data);
}
void Model::generate_remove_query(PT::TextStream & stream, ModelData * model_data)
{
ModelEnv model_env_local;
@@ -436,22 +458,52 @@ bool Model::remove(ModelData & model_data)
}
bool Model::save(ModelData * model_data)
bool Model::save(ModelData & model_data, bool save_whole_tree)
{
return save(&model_data, save_whole_tree);
}
bool Model::save(ModelData * model_data, bool save_whole_tree)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_data = model_data;
bool status = save_tree(save_whole_tree);
// what about if an exception was thrown? this pointer will not be null
model_env = nullptr;
return status;
}
// FIX ME we need to propagage the status from the whole tree, if there is an error somewhere then we should return error from the parent
bool Model::save_tree(bool save_whole_tree)
{
bool result = false;
if( save_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE;
map_fields();
}
ModelEnv * old_model_env = model_env; // remove, insert or update will set model_env to nullptr
switch( save_mode )
{
case DO_DELETE_ON_SAVE:
result = remove(model_data);
result = remove(model_env->model_data);// without the whole tree
break;
case DO_INSERT_ON_SAVE:
result = insert(model_data);
result = insert(model_env->model_data, false);
break;
case DO_UPDATE_ON_SAVE:
result = update(model_data);
result = update(model_env->model_data, false);
break;
case DO_NOTHING_ON_SAVE:
@@ -459,16 +511,18 @@ bool Model::save(ModelData * model_data)
break;
}
model_env = old_model_env;
if( save_whole_tree )
{
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE;
map_fields();
}
return result;
}
bool Model::save(ModelData & model_data)
{
return save(&model_data);
}
void Model::generate_select_columns(PT::TextStream & stream)
{
if( model_connector && model_env )