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:
parent
79fd642ef7
commit
9a4fd9b050
|
@ -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 )
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
10
src/finder.h
10
src/finder.h
|
@ -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;
|
||||||
|
|
7
src/ft.h
7
src/ft.h
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
10
src/model.h
10
src/model.h
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue