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) ) if( field_type.is_raw_field_name() )
put_long_field_name(field_name); {
(*out_stream) << field_name;
}
else 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 str;
PT::TextStream * old_out_stream = out_stream; PT::TextStream * old_out_stream = out_stream;
out_stream = &str; out_stream = &str;
put_field_name(field_name, model_env); put_field_name(field_name, field_type, model_env);
out_stream = old_out_stream; out_stream = old_out_stream;
if( model_env && model_env->finder_helper ) if( model_env && model_env->finder_helper )

View File

@ -81,12 +81,12 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) 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 else
if( work_mode == MORM_WORK_MODE_MODEL_SAVE_FIELDS ) 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 else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES ) 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() ) 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_name_value_separator();
put_field_value_or_null(field_value, field_type, model_env); put_field_value_or_null(field_value, field_type, model_env);
} }
@ -109,7 +109,7 @@ public:
} }
else else
{ {
put_field_name(field_name, model_env); put_field_name(field_name, field_type, model_env);
put_name_value_separator(); put_name_value_separator();
put_field_value_or_null(field_value, field_type, model_env); put_field_value_or_null(field_value, field_type, model_env);
} }
@ -172,7 +172,7 @@ public:
// else // else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) 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_name_value_separator();
put_field_value_list(field_value, model_connector, model_env); put_field_value_list(field_value, model_connector, model_env);
} }
@ -190,7 +190,7 @@ public:
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) 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 else
if( work_mode == MORM_WORK_MODE_MODEL_VALUES ) if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
@ -200,7 +200,7 @@ public:
else else
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) 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_name_value_separator();
generate_from_model(field_model); generate_from_model(field_model);
} }
@ -274,10 +274,8 @@ protected:
virtual void field_before(); virtual void field_before();
virtual void field_after(); virtual void field_after();
virtual void put_field_name(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 save_foreign_key(const wchar_t * field_name, ModelEnv * model_env);
virtual void dump_additional_info(Model & model); virtual void dump_additional_info(Model & model);
template<typename FieldValue> template<typename FieldValue>
@ -573,7 +571,7 @@ protected:
this->out_stream = &stream; this->out_stream = &stream;
field_before(); field_before();
put_field_name(field_name, model_env); put_field_name(field_name, FT::default_type, model_env);
put_name_value_separator(); put_name_value_separator();
bool is_first = true; 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); virtual DbExpression & page(PT::TextStream & stream, size_t page_number, size_t page_size);
template<typename FieldValue> 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 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 += L" as ";
column_expression += new_column_name; column_expression += new_column_name;
// put nullptr to ModelEnv* to not allow to use prefix field(column_expression.c_str(), field_value, field_type, model_env);
// 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);
} }

View File

@ -236,7 +236,15 @@ public:
{ {
(*out_stream) << "SELECT "; (*out_stream) << "SELECT ";
model.generate_select_columns(*out_stream); 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) << model.model_env->table_name;
(*out_stream) << " "; (*out_stream) << " ";
(*out_stream) << finder_helper.join_tables_str; (*out_stream) << finder_helper.join_tables_str;

View File

@ -56,6 +56,7 @@ public:
no_insertable = 8, no_insertable = 8,
no_updatable = 16, no_updatable = 16,
no_fetchable = 32, /* not supported yet */ no_fetchable = 32, /* not supported yet */
raw_field_name = 64,
}; };
/* /*
@ -130,6 +131,12 @@ public:
return !is_flag_set(no_fetchable); 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> 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) 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_connector && model_env )
{ {
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_DB_SQL ) 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) ) 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 else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING ) 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 else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_READING_VALUE_FROM_DB_RESULTSET ) 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 else
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_CLEARING_VALUE ) 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
} }
} }
} }