fixed: add_field_for_select from Model incorrectly escaped a field string (column name)

fixed: Finder didn't use full table name (schema.table) in "from" clause
This commit is contained in:
Tomasz Sowa 2021-04-12 18:53:55 +02:00
parent 79fd642ef7
commit 9a4fd9b050
6 changed files with 47 additions and 27 deletions

View File

@ -194,12 +194,19 @@ bool BaseExpression::is_long_field_name(const PT::TextStream & field_name)
}
void BaseExpression::put_field_name(const wchar_t * field_name, ModelEnv * model_env)
void BaseExpression::put_field_name(const wchar_t * field_name, FT field_type, ModelEnv * model_env)
{
if( is_long_field_name(field_name) )
put_long_field_name(field_name);
if( field_type.is_raw_field_name() )
{
(*out_stream) << field_name;
}
else
put_short_field_name(field_name, model_env);
{
if( is_long_field_name(field_name) )
put_long_field_name(field_name);
else
put_short_field_name(field_name, model_env);
}
}
@ -262,13 +269,13 @@ void BaseExpression::put_short_field_name(const wchar_t * field_name, ModelEnv *
}
void BaseExpression::save_foreign_key(const wchar_t * field_name, ModelEnv * model_env)
void BaseExpression::save_foreign_key(const wchar_t * field_name, FT field_type, ModelEnv * model_env)
{
PT::TextStream str;
PT::TextStream * old_out_stream = out_stream;
out_stream = &str;
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
out_stream = old_out_stream;
if( model_env && model_env->finder_helper )

View File

@ -81,12 +81,12 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
{
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_SAVE_FIELDS )
{
save_foreign_key(field_name, model_env);
save_foreign_key(field_name, field_type, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@ -100,7 +100,7 @@ public:
{
if( (size_t)model_env->field_index < model_env->set_field_name_helper->size() )
{
put_field_name((*model_env->set_field_name_helper)[model_env->field_index], model_env);
put_field_name((*model_env->set_field_name_helper)[model_env->field_index], field_type, model_env);
put_name_value_separator();
put_field_value_or_null(field_value, field_type, model_env);
}
@ -109,7 +109,7 @@ public:
}
else
{
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
put_name_value_separator();
put_field_value_or_null(field_value, field_type, model_env);
}
@ -172,7 +172,7 @@ public:
// else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
put_name_value_separator();
put_field_value_list(field_value, model_connector, model_env);
}
@ -190,7 +190,7 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS )
{
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
}
else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@ -200,7 +200,7 @@ public:
else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
{
put_field_name(field_name, model_env);
put_field_name(field_name, field_type, model_env);
put_name_value_separator();
generate_from_model(field_model);
}
@ -274,10 +274,8 @@ protected:
virtual void field_before();
virtual void field_after();
virtual void put_field_name(const wchar_t * field_name, ModelEnv * model_env);
virtual void save_foreign_key(const wchar_t * field_name, ModelEnv * model_env);
virtual void put_field_name(const wchar_t * field_name, FT field_type, ModelEnv * model_env);
virtual void save_foreign_key(const wchar_t * field_name, FT field_type, ModelEnv * model_env);
virtual void dump_additional_info(Model & model);
template<typename FieldValue>
@ -573,7 +571,7 @@ protected:
this->out_stream = &stream;
field_before();
put_field_name(field_name, model_env);
put_field_name(field_name, FT::default_type, model_env);
put_name_value_separator();
bool is_first = true;

View File

@ -63,7 +63,7 @@ public:
virtual DbExpression & page(PT::TextStream & stream, size_t page_number, size_t page_size);
template<typename FieldValue>
void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, FieldValue & field_value)
void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, FieldValue & field_value, FT field_type, ModelEnv * model_env)
{
std::wstring column_expression; // field() methods can be called recursively, so don't make it as class object
@ -71,9 +71,7 @@ public:
column_expression += L" as ";
column_expression += new_column_name;
// put nullptr to ModelEnv* to not allow to use prefix
// or may better remember current value of use_prefix and set it to false for a while?
field(column_expression.c_str(), field_value, false, false, false, nullptr);
field(column_expression.c_str(), field_value, field_type, model_env);
}

View File

@ -236,7 +236,15 @@ public:
{
(*out_stream) << "SELECT ";
model.generate_select_columns(*out_stream);
(*out_stream) << " FROM " << model.model_env->table_name << " AS ";
(*out_stream) << " FROM ";
if( !model.model_env->schema_name.empty() )
{
(*out_stream) << model.model_env->schema_name << ".";
}
// IMPROVEME escape table name
(*out_stream) << model.model_env->table_name << " AS ";
(*out_stream) << model.model_env->table_name;
(*out_stream) << " ";
(*out_stream) << finder_helper.join_tables_str;

View File

@ -56,6 +56,7 @@ public:
no_insertable = 8,
no_updatable = 16,
no_fetchable = 32, /* not supported yet */
raw_field_name = 64,
};
/*
@ -130,6 +131,12 @@ public:
return !is_flag_set(no_fetchable);
}
bool is_raw_field_name() const
{
return is_flag_set(raw_field_name);
}
};
}

View File

@ -1324,6 +1324,8 @@ public:
template<typename FieldValue>
void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, const wchar_t * flat_field_name, FieldValue & field_value)
{
FT field_type = FT::no_insertable | FT::no_updatable | FT::raw_field_name;
if( model_connector && model_env )
{
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_DB_SQL )
@ -1336,24 +1338,24 @@ public:
if( db_expression && !is_empty_field(new_column_expression) )
{
db_expression->add_field_for_select(new_column_expression, new_column_name, field_value);
db_expression->add_field_for_select(new_column_expression, new_column_name, field_value, field_type, model_env);
}
}
}
else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING )
{
field_generic(L"", flat_field_name, field_value, false, false, false);
field_generic(L"", flat_field_name, field_value, field_type);
}
else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_READING_VALUE_FROM_DB_RESULTSET )
{
field_generic(new_column_name, L"", field_value, false, false, false);
field_generic(new_column_name, L"", field_value, field_type);
}
else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_CLEARING_VALUE )
{
field_generic(L"", L"", field_value, false, false, false); // the names don't matter here
field_generic(L"", L"", field_value, field_type); // the names don't matter here
}
}
}