From b12037a7e54ded1c8c7441241dd3002688e62420 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Fri, 14 May 2021 03:24:53 +0200 Subject: [PATCH] added basic support for making migrations --- src/dbconnector.cpp | 22 +++++++++ src/dbconnector.h | 6 +-- src/model.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++++ src/model.h | 32 +++++++++++++ 4 files changed, 170 insertions(+), 3 deletions(-) diff --git a/src/dbconnector.cpp b/src/dbconnector.cpp index 8c74396..12da18b 100644 --- a/src/dbconnector.cpp +++ b/src/dbconnector.cpp @@ -85,6 +85,28 @@ void DbConnector::set_log_queries(bool log_queries) } +bool DbConnector::query(const PT::TextStream & stream) +{ + std::unique_ptr query_result_ptr(create_query_result()); + return query(stream, *query_result_ptr); +} + + +bool DbConnector::query(const std::string & query_str) +{ + std::unique_ptr query_result_ptr(create_query_result()); + return query(query_str, *query_result_ptr); +} + + +bool DbConnector::query(const char * query_str) +{ + std::unique_ptr query_result_ptr(create_query_result()); + return query(query_str, *query_result_ptr); +} + + + bool DbConnector::query(const PT::TextStream & stream, QueryResult & query_result) { std::string query_str; diff --git a/src/dbconnector.h b/src/dbconnector.h index 2a93cd3..a87a896 100644 --- a/src/dbconnector.h +++ b/src/dbconnector.h @@ -62,8 +62,6 @@ public: DbExpression * get_expression(); - //virtual void clear_last_query_result(); - virtual void generate_select_columns(PT::TextStream & stream, Model & model); virtual void generate_insert_query(PT::TextStream & stream, Model & model); virtual void generate_update_query(PT::TextStream & stream, Model & model); @@ -73,7 +71,9 @@ public: virtual bool update(PT::TextStream & stream, Model & model); virtual bool remove(PT::TextStream & stream, Model & model); - //void ModelConnector::get_values_from_db(Model & model) + virtual bool query(const PT::TextStream & stream); + virtual bool query(const std::string & query_str); + virtual bool query(const char * query_str); virtual QueryResult * create_query_result() = 0; diff --git a/src/model.cpp b/src/model.cpp index 01fc531..d424819 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -33,6 +33,7 @@ */ #include "model.h" +#include "utf8/utf8.h" namespace morm @@ -177,6 +178,68 @@ bool Model::found() } +void Model::get_table_name(PT::WTextStream & stream, bool with_schema_name, ModelData * model_data, bool clear_stream) +{ + if( clear_stream ) + { + stream.clear(); + } + + ModelEnv model_env_local; + model_env = &model_env_local; + model_env->model_data = model_data; + + if( model_connector ) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + try + { + table(); + + if( with_schema_name && !model_env->schema_name.empty() ) + { + stream << model_env->schema_name; + stream << '.'; + } + + stream << model_env->table_name; + } + catch(...) + { + model_env = nullptr; + throw; + } + } + } + + model_env = nullptr; +} + + +void Model::get_table_name(std::wstring & str, bool with_schema_name, ModelData * model_data, bool clear_string) +{ + PT::WTextStream stream; + + if( clear_string ) + str.clear(); + + get_table_name(stream, with_schema_name, model_data, false); + stream.to_string(str); +} + + +void Model::get_table_name(std::string & str, bool with_schema_name, ModelData * model_data, bool clear_string) +{ + PT::WTextStream stream; + + get_table_name(stream, with_schema_name, model_data, false); + PT::WideStreamToUTF8(stream, str, clear_string); +} + + void Model::to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream, bool dump_mode) { if( clear_stream ) @@ -272,6 +335,7 @@ std::string Model::to_string() + void Model::generate_insert_query(PT::TextStream & stream, ModelData * model_data) { ModelEnv model_env_local; @@ -797,6 +861,10 @@ void Model::clear() +bool Model::do_migration(int & current_table_version) +{ + return true; +} @@ -1449,5 +1517,50 @@ void Model::set_parent_key_in_childs() } } + + +bool Model::db_query(const char * raw_sql) +{ + bool status = false; + + if( model_connector ) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + status = db_connector->query(raw_sql); + } + } + + return status; +} + + +bool Model::db_query(const std::string & raw_sql) +{ + return db_query(raw_sql.c_str()); +} + + +bool Model::db_query(const PT::TextStream & raw_sql) +{ + bool status = false; + + if( model_connector ) + { + DbConnector * db_connector = model_connector->get_db_connector(); + + if( db_connector ) + { + status = db_connector->query(raw_sql); + } + } + + return status; +} + + + } // namespace diff --git a/src/model.h b/src/model.h index 7b96376..b1c6334 100644 --- a/src/model.h +++ b/src/model.h @@ -86,6 +86,10 @@ public: void set_connector(ModelConnector * connector); ModelConnector * get_connector(); + virtual void get_table_name(PT::WTextStream & stream, bool with_schema_name = true, ModelData * model_data = nullptr, bool clear_stream = true); + virtual void get_table_name(std::wstring & str, bool with_schema_name = true, ModelData * model_data = nullptr, bool clear_string = true); + virtual void get_table_name(std::string & str, bool with_schema_name = true, ModelData * model_data = nullptr, bool clear_string = true); + virtual void to_text(PT::TextStream & stream, ModelData * model_data, bool clear_stream = true, bool dump_mode = false); virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true, bool dump_mode = false); virtual void to_text(PT::TextStream & stream, bool clear_stream = true, bool dump_mode = false); @@ -122,6 +126,9 @@ public: // set object to default values virtual void clear(); + virtual bool do_migration(int & current_table_version); + + // IMPROVE ME this will be protected // add set_field_value() functions for each POD type template @@ -210,6 +217,9 @@ protected: virtual void map_values_from_query(); + virtual bool db_query(const char * raw_sql); + virtual bool db_query(const std::string & raw_sql); + virtual bool db_query(const PT::TextStream & raw_sql); ///////////////////////////////// /* @@ -972,6 +982,28 @@ protected: virtual void log_table_name(bool put_schema_name = true); virtual void log_table_name_with_field(const wchar_t * db_field_name = nullptr, bool put_schema_name = true); + template + bool do_migration(int & current_table_version, int destination_table_version, ModelObject * model_object, bool (ModelObject::*migration_function)()) + { + bool status = true; + + if( current_table_version < destination_table_version ) + { + if( (model_object->*migration_function)() ) + { + current_table_version = destination_table_version; + } + else + { + status = false; + } + } + + return status; + } + + + template friend class Finder; template friend class Cursor; friend class BaseExpression;