changed the way how the table name is set in a Model - added prepare_table() method

removed from Model:
virtual void table_name(PT::TextStream & stream);

added to Model:
virtual void prepare_table();
virtual void table(const wchar_t * table_name);
virtual void table(const wchar_t * schema_name, const wchar_t * table_name);
This commit is contained in:
2021-03-11 12:22:37 +01:00
parent fcf1d28b18
commit f7490594ad
18 changed files with 193 additions and 182 deletions

View File

@@ -88,19 +88,16 @@ public:
/*
* map fields to names
*
*
* IMPROVEME rename me to fields() and make protected
*/
virtual void map_fields() = 0;
/*
*
* we can use the object for a different purpose than database (e.g. json)
* so let the table_name be non pure-virtual
*
* IMPROVEME make me protected
*/
virtual void table_name(PT::TextStream & stream);
virtual void prepare_table();
virtual void table(const wchar_t * table_name);
virtual void table(const wchar_t * schema_name, const wchar_t * table_name);
virtual void to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream = true, bool dump_mode = false);
virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true, bool dump_mode = false);
@@ -147,6 +144,7 @@ public:
model_env = &model_env_local;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_SET_FIELD_VALUE;
model_env->field_index = 0;
prepare_table(); // CHECK ME it is needed to set table name?
FieldValueHelper field_value_helper;
field_value_helper.db_field_name = db_field_name;
@@ -166,7 +164,7 @@ public:
if( plog )
{
(*plog) << "Morm: I cannot find such a property: ";
(*plog) << PT::Log::log1 << "Morm: I cannot find such a property: ";
put_fields_to_log(*plog, db_field_name, flat_field_name);
(*plog) << PT::Log::logend;
}
@@ -465,11 +463,9 @@ protected:
}
else
{
table_name(model_env->table_name);
if( log )
{
(*log) << PT::Log::log1 << "Morm: incorrect type of a field in " << model_env->table_name << ", ";
(*log) << PT::Log::log1 << "Morm: incorrect type of a field in " << get_table_name() << ", ";
put_fields_to_log(*log, db_field_name, flat_field_name);
(*log) << ", type expected " << typeid(field_value).name()
<< " got " << helper.value_type_info->name() << PT::Log::logend;
@@ -623,7 +619,7 @@ protected:
{
model_env->finder_helper->foreign_keys.clear();
PT::TextStream & join_tables_str = model_env->finder_helper->join_tables_str;
field_model.model_env->table_index = model_env->finder_helper->add_join_table(field_model.model_env->table_name_short);
field_model.model_env->add_table_name_to_finder_helper();
join_tables_str << "LEFT JOIN " << field_model.model_env->table_name << " AS ";
field_model.put_table_name_with_index(join_tables_str);
@@ -704,7 +700,7 @@ protected:
if( model_env->field_value_helper_tab->empty() && plog )
{
(*plog) << "Morm: I cannot find a primary key in " << model_env->table_name << PT::Log::logend;
(*plog) << PT::Log::log1 << "Morm: I cannot find a primary key in " << get_table_name() << PT::Log::logend;
}
}
}
@@ -736,26 +732,21 @@ protected:
model_env_local.field_value_helper_tab = &helper_tab;
model_env_local.field_index = 0;
field_model.model_env = &model_env_local;
field_model.prepare_table();
field_model.map_fields();
if( (size_t)field_model.model_env->field_index != helper_tab.size() && log )
{
if( model_env->table_name.empty() )
table_name(model_env->table_name);
if( field_model.model_env->table_name.empty() )
field_model.table_name(field_model.model_env->table_name);
if( field_model.model_env->field_index == 0 )
{
(*log) << PT::Log::log1 << "Morm: there is no a foreign key in " << field_model.model_env->table_name
<< " called " << db_field_name << " pointing to " << model_env->table_name << PT::Log::logend;
(*log) << PT::Log::log1 << "Morm: there is no a foreign key in " << field_model.get_table_name()
<< " called " << db_field_name << " pointing to " << get_table_name() << PT::Log::logend;
}
else
{
(*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of " << model_env->field_index << " column(s)"
<< " but foreign key in " << field_model.model_env->table_name << " consists of "
(*log) << PT::Log::log1 << "Morm: primary key in " << get_table_name() << " consists of " << model_env->field_index << " column(s)"
<< " but foreign key in " << field_model.get_table_name() << " consists of "
<< field_model.model_env->field_index << " column(s)" << PT::Log::logend;
}
}
@@ -765,9 +756,7 @@ protected:
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"
(*log) << PT::Log::log1 << "Morm: primary key in " << get_table_name() << " consists of incorrect number of columns"
<< ", expected " << helper_tab.size() << " column(s) but got " << model_env->field_index << PT::Log::logend;
}
}
@@ -852,9 +841,6 @@ protected:
{
field_model.model_env->model_work_mode = MORM_MODEL_WORK_MODE_GENERATING_DB_SQL;
field_model.table_name(field_model.model_env->table_name);
db_expression->prepare_short_table_name(field_model.model_env->table_name, field_model.model_env->table_name_short);
if( db_expression->get_output_type() == MORM_OUTPUT_TYPE_SELECT_COLUMNS )
{
field_model_left_join(db_field_name, field_model, field_type, db_expression);
@@ -943,7 +929,7 @@ protected:
!model_env->cursor_helper->has_autogenerated_select &&
model_env->cursor_helper->use_table_prefix_for_fetching_values )
{
field_model.prepare_table_names();
field_model.model_env->add_table_name_to_finder_helper();
}
field_model.before_select();
@@ -968,6 +954,7 @@ protected:
field_model.model_env = &model_env_local;
field_model.model_env->has_primary_key_set = field_model.has_primary_key_set;
field_model.set_connector(model_connector);
field_model.prepare_table();
if( !is_empty_field(db_field_name) )
{
@@ -981,7 +968,7 @@ protected:
if( plog )
{
(*plog) << "Morm: error in " << log_table_name(db_field_name)
(*plog) << PT::Log::log1 << "Morm: error in " << get_table_name_with_field(db_field_name)
<< " field, you should set FT::is_foreign_key or FT::is_foreign_key_in_child flag for a model child object" << PT::Log::logend;
}
}
@@ -1080,6 +1067,7 @@ protected:
child_model.model_env = &model_env_local;
child_model.model_env->has_primary_key_set = child_model.has_primary_key_set;
child_model.set_connector(model_connector);
child_model.prepare_table();
if( model_env->model_work_submode == MORM_MODEL_WORK_SUBMODE_INSERT )
{
@@ -1153,7 +1141,7 @@ protected:
{
if( plog )
{
(*plog) << "Morm: error: FT::is_foreign_key is not implemented for a list/vector yet" << PT::Log::logend;
(*plog) << PT::Log::log1 << "Morm: error: FT::is_foreign_key is not implemented for a list/vector yet" << PT::Log::logend;
return;
}
}
@@ -1176,7 +1164,7 @@ protected:
{
if( plog )
{
(*plog) << "Morm: ignoring " << log_table_name(db_field_name) << " as this is not a container with Model objects" << PT::Log::logend;
(*plog) << PT::Log::log1 << "Morm: ignoring " << get_table_name_with_field(db_field_name) << " as this is not a container with Model objects" << PT::Log::logend;
}
}
}
@@ -1184,7 +1172,7 @@ protected:
{
if( plog )
{
(*plog) << "Morm: error in " << log_table_name(db_field_name)
(*plog) << PT::Log::log1 << "Morm: error in " << get_table_name_with_field(db_field_name)
<< " field, you should set FT::is_foreign_key or FT::is_foreign_key_in_child flag for a list of child objects" << PT::Log::logend;
}
}
@@ -1363,24 +1351,23 @@ public:
}
protected:
virtual bool is_empty_field(const wchar_t * value);
virtual bool is_the_same_field(const wchar_t * field1, const wchar_t * field2);
virtual void prepare_table_names(bool prepare_table_index = true);
virtual void put_table_name_with_index(PT::TextStream & str);
virtual void put_to_log(const wchar_t * str);
virtual void put_fields_to_log(PT::Log & log, const wchar_t * db_field_name, const wchar_t * flat_field_name);
PT::TextStream log_table_name();
PT::TextStream log_table_name(const wchar_t * db_field_name);
virtual PT::WTextStream get_table_name(bool put_schema_name = true);
virtual PT::WTextStream get_table_name_with_field(const wchar_t * db_field_name = nullptr, bool put_schema_name = true);
template<typename ModelClass> friend class Finder;
template<typename ModelClass> friend class Cursor;
friend class BaseExpression;
friend class DbConnector;
};