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:
92
src/model.h
92
src/model.h
@@ -114,15 +114,15 @@ public:
|
||||
virtual bool insert(ModelData & model_data, bool insert_whole_tree = true);
|
||||
|
||||
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 bool update(ModelData * model_data = nullptr, bool update_whole_tree = true);
|
||||
virtual bool update(ModelData & model_data, bool update_whole_tree = true);
|
||||
|
||||
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);
|
||||
|
||||
virtual bool save(ModelData * model_data = nullptr);
|
||||
virtual bool save(ModelData & model_data);
|
||||
virtual bool save(ModelData * model_data = nullptr, bool save_whole_tree = true);
|
||||
virtual bool save(ModelData & model_data, bool save_whole_tree = true);
|
||||
|
||||
virtual void generate_select_columns(PT::TextStream & stream);
|
||||
|
||||
@@ -187,6 +187,8 @@ protected:
|
||||
virtual ModelData * get_model_data();
|
||||
|
||||
virtual bool insert_tree(bool insert_whole_tree);
|
||||
virtual bool update_tree(bool update_whole_tree);
|
||||
virtual bool save_tree(bool save_whole_tree);
|
||||
|
||||
virtual void map_values_from_query();
|
||||
|
||||
@@ -889,25 +891,45 @@ protected:
|
||||
field_model_left_join(db_field_name, flat_field_name, field_model, insertable, updatable, has_foreign_key, db_expression);
|
||||
}
|
||||
|
||||
if( db_expression->get_work_mode() == MORM_WORK_MODE_MODEL_FIELDS && db_expression->get_output_type() == MORM_OUTPUT_TYPE_DB_INSERT && has_foreign_key )
|
||||
if( has_foreign_key )
|
||||
{
|
||||
int not_used_object = 0;
|
||||
db_expression->field(db_field_name, not_used_object, insertable, updatable, false, model_env);
|
||||
}
|
||||
if( db_expression->get_work_mode() == MORM_WORK_MODE_MODEL_FIELDS && db_expression->get_output_type() == MORM_OUTPUT_TYPE_DB_INSERT )
|
||||
{
|
||||
int not_used_object = 0;
|
||||
db_expression->field(db_field_name, not_used_object, insertable, updatable, false, model_env);
|
||||
}
|
||||
|
||||
if( db_expression->get_work_mode() == MORM_WORK_MODE_MODEL_VALUES && db_expression->get_output_type() == MORM_OUTPUT_TYPE_DB_INSERT && has_foreign_key )
|
||||
{
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_INSERT_PRIMARY_KEY);
|
||||
field_model.map_fields();
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_INSERT);
|
||||
if( db_expression->get_work_mode() == MORM_WORK_MODE_MODEL_VALUES && db_expression->get_output_type() == MORM_OUTPUT_TYPE_DB_INSERT )
|
||||
{
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_INSERT_PRIMARY_KEY);
|
||||
field_model.map_fields();
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_INSERT);
|
||||
}
|
||||
|
||||
if( db_expression->get_work_mode() == MORM_WORK_MODE_MODEL_FIELDS_VALUES && db_expression->get_output_type() == MORM_OUTPUT_TYPE_DB_UPDATE )
|
||||
{
|
||||
std::vector<const wchar_t *> key_fields;
|
||||
key_fields.push_back(db_field_name); // at the moment only one key
|
||||
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_UPDATE_PRIMARY_KEY);
|
||||
field_model.model_env->field_index = 0;
|
||||
field_model.model_env->set_field_name_helper = &key_fields;
|
||||
field_model.map_fields();
|
||||
db_expression->set_output_type(MORM_OUTPUT_TYPE_DB_UPDATE);
|
||||
|
||||
if( (size_t)field_model.model_env->field_index != key_fields.size() )
|
||||
{
|
||||
// number of keys are different
|
||||
// put error log here
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES &&
|
||||
db_expression->get_output_type() != MORM_OUTPUT_TYPE_DB_PRIMARY_KEY &&
|
||||
db_expression->get_output_type() != MORM_OUTPUT_TYPE_DB_INSERT &&
|
||||
db_expression->get_output_type() != MORM_OUTPUT_TYPE_DB_UPDATE )
|
||||
{
|
||||
// FIX ME
|
||||
// UPDATE, INSERT, REMOVE for models
|
||||
field_model.map_fields();
|
||||
}
|
||||
|
||||
@@ -1030,36 +1052,52 @@ protected:
|
||||
field_model_set_parent_key(db_field_name, flat_field_name, field_model);
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_INSERT && has_foreign_key )
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_INSERT && has_foreign_key )
|
||||
{
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
field_model.map_fields();
|
||||
field_model.insert_tree(true);
|
||||
}
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_INSERT_XXX && !has_foreign_key )
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_INSERT && !has_foreign_key )
|
||||
{
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
field_model.map_fields();
|
||||
field_model.insert_tree(true);
|
||||
}
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_UPDATE )
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_UPDATE && has_foreign_key )
|
||||
{
|
||||
// IMPROVE ME what about if db_field_name is empty? not iterate in such a case?
|
||||
//field_model.map_fields();
|
||||
//field_model.update_tree(true);
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
field_model.update_tree(true);
|
||||
}
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_AND_SAVE )
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITHOUT_FOREIGN_KEY_AND_UPDATE && !has_foreign_key )
|
||||
{
|
||||
// IMPROVE ME what about if db_field_name is empty? not iterate in such a case?
|
||||
//field_model.map_fields();
|
||||
//field_model.save_tree(true);
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
field_model.update_tree(true);
|
||||
}
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_THROUGH_CHILDS_WITH_FOREIGN_KEY_AND_SAVE && has_foreign_key )
|
||||
{
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
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 )
|
||||
{
|
||||
if( !is_empty_field(db_field_name) )
|
||||
{
|
||||
field_model.save_tree(true);
|
||||
}
|
||||
}
|
||||
|
||||
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
|
||||
|
Reference in New Issue
Block a user