From e25b6d9a299dec5d0207b5e2d61a0d69e135a55f Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Tue, 1 May 2018 23:22:32 +0000 Subject: [PATCH] added: Finder::prefix() method code not thoroughly tested git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1106 e52654a7-88a9-db11-a3e9-0013d4bc506e --- src/baseexpression.cpp | 20 +++++++++++ src/baseexpression.h | 6 ++++ src/dbconnector.cpp | 7 +++- src/dbconnector.h | 3 +- src/finder.h | 79 +++++++++++++++++++++++++++++------------- src/modelconnector.cpp | 4 +-- src/modelconnector.h | 2 +- 7 files changed, 92 insertions(+), 29 deletions(-) diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index 0c6ea5e..b37ad9f 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -60,6 +60,19 @@ void BaseExpression::set_work_mode(int work_mode) } +void BaseExpression::prepare_to_new_expression() +{ + column_prefix.clear(); + out_stream = nullptr; + is_first_field = false; + work_mode = 0; +} + +void BaseExpression::set_column_prefix(const std::wstring & prefix) +{ + column_prefix = prefix; +} + void BaseExpression::generate_from_model(PT::TextStream & stream, Model & model) { this->out_stream = &stream; @@ -113,6 +126,13 @@ void BaseExpression::field_after() void BaseExpression::put_field_name(const wchar_t * field_name) { before_field_name(); + + if( !column_prefix.empty() ) + { + esc(column_prefix, *out_stream); + (*out_stream) << '.'; + } + esc(field_name, *out_stream); after_field_name(); } diff --git a/src/baseexpression.h b/src/baseexpression.h index ccd5886..509084c 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -56,6 +56,9 @@ public: virtual ~BaseExpression(); virtual void set_work_mode(int work_mode); + virtual void prepare_to_new_expression(); + virtual void set_column_prefix(const std::wstring & prefix); + virtual void generate_from_model(PT::TextStream & stream, Model & model); template @@ -219,6 +222,9 @@ protected: // przyda sie do formatowania doubli PT::TextStream * out_stream; + + std::wstring column_prefix; + // virtual void map_fields(Model * model) // { // work_mode = model->work_mode; diff --git a/src/dbconnector.cpp b/src/dbconnector.cpp index e496098..ba310a3 100644 --- a/src/dbconnector.cpp +++ b/src/dbconnector.cpp @@ -169,14 +169,16 @@ DbExpression * DbConnector::get_expression() } -void DbConnector::generate_select_columns(PT::TextStream & stream, Model & model) +void DbConnector::generate_select_columns(PT::TextStream & stream, Model & model, const std::wstring & column_prefix) { allocate_default_expression_if_needed(); if( db_expression ) { + db_expression->prepare_to_new_expression(); db_expression->set_work_mode(MORM_WORK_MODE_MODEL_FIELDS); db_expression->set_output_type(MORM_OUTPUT_TYPE_SELECT_COLUMNS); + db_expression->set_column_prefix(column_prefix); db_expression->generate_from_model(stream, model); } } @@ -188,6 +190,7 @@ void DbConnector::generate_insert_query(PT::TextStream & stream, Model & model) if( db_expression ) { + db_expression->prepare_to_new_expression(); stream << "insert into "; model.table_name(stream); @@ -210,6 +213,7 @@ void DbConnector::generate_update_query(PT::TextStream & stream, Model & model) if( db_expression ) { + db_expression->prepare_to_new_expression(); stream << "update "; model.table_name(stream); @@ -232,6 +236,7 @@ void DbConnector::generate_remove_query(PT::TextStream & stream, Model & model) if( db_expression ) { + db_expression->prepare_to_new_expression(); stream << "delete from "; model.table_name(stream); stream << " where "; diff --git a/src/dbconnector.h b/src/dbconnector.h index 78ea0e2..16b67f6 100644 --- a/src/dbconnector.h +++ b/src/dbconnector.h @@ -61,7 +61,7 @@ public: virtual void clear_last_query_result(); - virtual void generate_select_columns(PT::TextStream & stream, Model & model); + virtual void generate_select_columns(PT::TextStream & stream, Model & model, const std::wstring & column_prefix); virtual void generate_insert_query(PT::TextStream & stream, Model & model); virtual void generate_update_query(PT::TextStream & stream, Model & model); virtual void generate_remove_query(PT::TextStream & stream, Model & model); @@ -165,6 +165,7 @@ protected: std::wstring last_query_error_msg; PT::Logger * logger; + virtual void allocate_default_expression() = 0; virtual void allocate_default_expression_if_needed(); virtual void deallocate_expression(); diff --git a/src/finder.h b/src/finder.h index 404f74c..ae8a112 100644 --- a/src/finder.h +++ b/src/finder.h @@ -121,30 +121,10 @@ public: } - Finder & select(ModelConnector & model_connector) + Finder & prefix(const wchar_t * prefix) { - this->model_connector = &model_connector; - return select(); - } - - Finder & select(ModelConnector * model_connector) - { - this->model_connector = model_connector; - return select(); - } - - Finder & select(PT::TextStream & out_stream, ModelConnector & model_connector) - { - this->out_stream = &out_stream; - this->model_connector = &model_connector; - return select(); - } - - Finder & select(PT::TextStream & out_stream, ModelConnector * model_connector) - { - this->out_stream = &out_stream; - this->model_connector = model_connector; - return select(); + column_prefix = prefix; + return *this; } @@ -153,6 +133,7 @@ public: was_query_error = false; last_query_error.clear(); model_data = nullptr; + column_prefix.clear(); if( model_connector ) { @@ -184,6 +165,32 @@ public: } + Finder & select(ModelConnector & model_connector) + { + this->model_connector = &model_connector; + return select(); + } + + Finder & select(ModelConnector * model_connector) + { + this->model_connector = model_connector; + return select(); + } + + Finder & select(PT::TextStream & out_stream, ModelConnector & model_connector) + { + this->out_stream = &out_stream; + this->model_connector = &model_connector; + return select(); + } + + Finder & select(PT::TextStream & out_stream, ModelConnector * model_connector) + { + this->out_stream = &out_stream; + this->model_connector = model_connector; + return select(); + } + Finder & select(bool call_prepare = true) { @@ -195,9 +202,13 @@ public: if( model_connector && out_stream ) { (*out_stream) << "SELECT "; - model_connector->generate_select_columns(*out_stream, model); + model_connector->generate_select_columns(*out_stream, model, column_prefix); (*out_stream) << " FROM "; model.table_name(*out_stream); + + if( !column_prefix.empty() ) + (*out_stream) << " AS " << column_prefix; // what about escaping? + (*out_stream) << " "; } @@ -403,6 +414,23 @@ public: } + Finder & raw(long val, bool add_spaces = true) + { + if( out_stream ) + { + if( add_spaces ) + (*out_stream) << ' '; + + (*out_stream) << val; + + if( add_spaces ) + (*out_stream) << ' '; + } + + return *this; + } + + bool get(ModelClass & result) { bool res = false; @@ -542,6 +570,9 @@ private: bool was_query_error; std::wstring last_query_error; Model::ModelData * model_data; + std::wstring column_prefix; + + void set_db_expression() { diff --git a/src/modelconnector.cpp b/src/modelconnector.cpp index 6de3eea..183cceb 100644 --- a/src/modelconnector.cpp +++ b/src/modelconnector.cpp @@ -198,7 +198,7 @@ void ModelConnector::to_text(PT::TextStream & stream, Model & model) } -void ModelConnector::generate_select_columns(PT::TextStream & stream, Model & model) +void ModelConnector::generate_select_columns(PT::TextStream & stream, Model & model, const std::wstring & column_prefix) { if( db_connector ) { @@ -207,7 +207,7 @@ void ModelConnector::generate_select_columns(PT::TextStream & stream, Model & mo //if( expression_callback ) //{ - db_connector->generate_select_columns(stream, model); + db_connector->generate_select_columns(stream, model, column_prefix); //} //expression_callback = nullptr; diff --git a/src/modelconnector.h b/src/modelconnector.h index 2748745..72674de 100644 --- a/src/modelconnector.h +++ b/src/modelconnector.h @@ -85,7 +85,7 @@ public: virtual void to_text(PT::TextStream & stream, Model & model); - virtual void generate_select_columns(PT::TextStream & stream, Model & model); + virtual void generate_select_columns(PT::TextStream & stream, Model & model, const std::wstring & column_prefix); virtual void generate_insert_query(PT::TextStream & stream, Model & model); virtual void generate_update_query(PT::TextStream & stream, Model & model); virtual void generate_remove_query(PT::TextStream & stream, Model & model);