added support in Model for removing the whole tree
(without lists/vectors at the moment yet) git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1206 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
@@ -411,16 +411,41 @@ void Model::generate_remove_query(PT::TextStream & stream, ModelData * model_dat
|
||||
}
|
||||
|
||||
|
||||
bool Model::remove(ModelData * model_data)
|
||||
|
||||
bool Model::remove(ModelData & model_data, bool remove_whole_tree)
|
||||
{
|
||||
return remove(&model_data);
|
||||
}
|
||||
|
||||
|
||||
bool Model::remove(ModelData * model_data, bool remove_whole_tree)
|
||||
{
|
||||
ModelEnv model_env_local;
|
||||
model_env = &model_env_local;
|
||||
|
||||
model_env->model_data = model_data;
|
||||
bool status = remove_tree(remove_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::remove_tree(bool remove_whole_tree)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if( remove_whole_tree )
|
||||
{
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_REMOVE;
|
||||
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();
|
||||
|
||||
@@ -435,7 +460,7 @@ bool Model::remove(ModelData * model_data)
|
||||
|
||||
if( result )
|
||||
{
|
||||
save_mode = DO_INSERT_ON_SAVE;
|
||||
save_mode = DO_INSERT_ON_SAVE; // CHECKME may it would be better to set DO_NOTHING_ON_SAVE?
|
||||
after_remove();
|
||||
}
|
||||
else
|
||||
@@ -443,20 +468,18 @@ bool Model::remove(ModelData * model_data)
|
||||
after_remove_failure();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// what about if an exception was thrown? this pointer will not be null
|
||||
model_env = nullptr;
|
||||
if( remove_whole_tree )
|
||||
{
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_REMOVE;
|
||||
map_fields();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool Model::remove(ModelData & model_data)
|
||||
{
|
||||
return remove(&model_data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool Model::save(ModelData & model_data, bool save_whole_tree)
|
||||
@@ -486,7 +509,11 @@ bool Model::save_tree(bool save_whole_tree)
|
||||
|
||||
if( save_whole_tree )
|
||||
{
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE;
|
||||
if( save_mode == DO_DELETE_ON_SAVE )
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE;
|
||||
else
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE;
|
||||
|
||||
map_fields();
|
||||
}
|
||||
|
||||
@@ -495,15 +522,15 @@ bool Model::save_tree(bool save_whole_tree)
|
||||
switch( save_mode )
|
||||
{
|
||||
case DO_DELETE_ON_SAVE:
|
||||
result = remove(model_env->model_data);// without the whole tree
|
||||
result = remove_tree(false);
|
||||
break;
|
||||
|
||||
case DO_INSERT_ON_SAVE:
|
||||
result = insert(model_env->model_data, false);
|
||||
result = insert_tree(false);
|
||||
break;
|
||||
|
||||
case DO_UPDATE_ON_SAVE:
|
||||
result = update(model_env->model_data, false);
|
||||
result = update_tree(false);
|
||||
break;
|
||||
|
||||
case DO_NOTHING_ON_SAVE:
|
||||
@@ -515,7 +542,11 @@ bool Model::save_tree(bool save_whole_tree)
|
||||
|
||||
if( save_whole_tree )
|
||||
{
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE;
|
||||
if( save_mode == DO_DELETE_ON_SAVE )
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE;
|
||||
else
|
||||
model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_SAVE;
|
||||
|
||||
map_fields();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user