From 9a4fd9b050763e88aa365277b999d3ffe19efc13 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Mon, 12 Apr 2021 18:53:55 +0200 Subject: [PATCH] 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 --- src/baseexpression.cpp | 19 +++++++++++++------ src/baseexpression.h | 22 ++++++++++------------ src/dbexpression.h | 6 ++---- src/finder.h | 10 +++++++++- src/ft.h | 7 +++++++ src/model.h | 10 ++++++---- 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index d658d9e..d741c87 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -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 ) diff --git a/src/baseexpression.h b/src/baseexpression.h index 57c2144..872b6b2 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -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 @@ -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; diff --git a/src/dbexpression.h b/src/dbexpression.h index 3fbb890..1e6385e 100644 --- a/src/dbexpression.h +++ b/src/dbexpression.h @@ -63,7 +63,7 @@ public: virtual DbExpression & page(PT::TextStream & stream, size_t page_number, size_t page_size); template - 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); } diff --git a/src/finder.h b/src/finder.h index 8c8c5dc..89af0cf 100644 --- a/src/finder.h +++ b/src/finder.h @@ -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; diff --git a/src/ft.h b/src/ft.h index 581f9d3..1d884e9 100644 --- a/src/ft.h +++ b/src/ft.h @@ -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); + } + }; } diff --git a/src/model.h b/src/model.h index beaad31..f7b84aa 100644 --- a/src/model.h +++ b/src/model.h @@ -1324,6 +1324,8 @@ public: template 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 } } }