winix_fullmorm #4
|
@ -85,6 +85,28 @@ void DbConnector::set_log_queries(bool log_queries)
|
|||
}
|
||||
|
||||
|
||||
bool DbConnector::query(const PT::TextStream & stream)
|
||||
{
|
||||
std::unique_ptr<QueryResult> query_result_ptr(create_query_result());
|
||||
return query(stream, *query_result_ptr);
|
||||
}
|
||||
|
||||
|
||||
bool DbConnector::query(const std::string & query_str)
|
||||
{
|
||||
std::unique_ptr<QueryResult> query_result_ptr(create_query_result());
|
||||
return query(query_str, *query_result_ptr);
|
||||
}
|
||||
|
||||
|
||||
bool DbConnector::query(const char * query_str)
|
||||
{
|
||||
std::unique_ptr<QueryResult> 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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
113
src/model.cpp
113
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
|
||||
|
||||
|
|
32
src/model.h
32
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<typename FieldValue>
|
||||
|
@ -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<typename ModelObject>
|
||||
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<typename ModelClass> friend class Finder;
|
||||
template<typename ModelClass> friend class Cursor;
|
||||
friend class BaseExpression;
|
||||
|
|
Loading…
Reference in New Issue