added: Finder::prefix() method

code not thoroughly tested



git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1106 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2018-05-01 23:22:32 +00:00
parent 98206fdb7a
commit e25b6d9a29
7 changed files with 92 additions and 29 deletions

View File

@@ -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) void BaseExpression::generate_from_model(PT::TextStream & stream, Model & model)
{ {
this->out_stream = &stream; this->out_stream = &stream;
@@ -113,6 +126,13 @@ void BaseExpression::field_after()
void BaseExpression::put_field_name(const wchar_t * field_name) void BaseExpression::put_field_name(const wchar_t * field_name)
{ {
before_field_name(); before_field_name();
if( !column_prefix.empty() )
{
esc(column_prefix, *out_stream);
(*out_stream) << '.';
}
esc(field_name, *out_stream); esc(field_name, *out_stream);
after_field_name(); after_field_name();
} }

View File

@@ -56,6 +56,9 @@ public:
virtual ~BaseExpression(); virtual ~BaseExpression();
virtual void set_work_mode(int work_mode); 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); virtual void generate_from_model(PT::TextStream & stream, Model & model);
template<typename FieldValue> template<typename FieldValue>
@@ -219,6 +222,9 @@ protected:
// przyda sie do formatowania doubli // przyda sie do formatowania doubli
PT::TextStream * out_stream; PT::TextStream * out_stream;
std::wstring column_prefix;
// virtual void map_fields(Model * model) // virtual void map_fields(Model * model)
// { // {
// work_mode = model->work_mode; // work_mode = model->work_mode;

View File

@@ -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(); allocate_default_expression_if_needed();
if( db_expression ) if( db_expression )
{ {
db_expression->prepare_to_new_expression();
db_expression->set_work_mode(MORM_WORK_MODE_MODEL_FIELDS); db_expression->set_work_mode(MORM_WORK_MODE_MODEL_FIELDS);
db_expression->set_output_type(MORM_OUTPUT_TYPE_SELECT_COLUMNS); db_expression->set_output_type(MORM_OUTPUT_TYPE_SELECT_COLUMNS);
db_expression->set_column_prefix(column_prefix);
db_expression->generate_from_model(stream, model); db_expression->generate_from_model(stream, model);
} }
} }
@@ -188,6 +190,7 @@ void DbConnector::generate_insert_query(PT::TextStream & stream, Model & model)
if( db_expression ) if( db_expression )
{ {
db_expression->prepare_to_new_expression();
stream << "insert into "; stream << "insert into ";
model.table_name(stream); model.table_name(stream);
@@ -210,6 +213,7 @@ void DbConnector::generate_update_query(PT::TextStream & stream, Model & model)
if( db_expression ) if( db_expression )
{ {
db_expression->prepare_to_new_expression();
stream << "update "; stream << "update ";
model.table_name(stream); model.table_name(stream);
@@ -232,6 +236,7 @@ void DbConnector::generate_remove_query(PT::TextStream & stream, Model & model)
if( db_expression ) if( db_expression )
{ {
db_expression->prepare_to_new_expression();
stream << "delete from "; stream << "delete from ";
model.table_name(stream); model.table_name(stream);
stream << " where "; stream << " where ";

View File

@@ -61,7 +61,7 @@ public:
virtual void clear_last_query_result(); 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_insert_query(PT::TextStream & stream, Model & model);
virtual void generate_update_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); virtual void generate_remove_query(PT::TextStream & stream, Model & model);
@@ -165,6 +165,7 @@ protected:
std::wstring last_query_error_msg; std::wstring last_query_error_msg;
PT::Logger * logger; PT::Logger * logger;
virtual void allocate_default_expression() = 0; virtual void allocate_default_expression() = 0;
virtual void allocate_default_expression_if_needed(); virtual void allocate_default_expression_if_needed();
virtual void deallocate_expression(); virtual void deallocate_expression();

View File

@@ -121,30 +121,10 @@ public:
} }
Finder<ModelClass> & select(ModelConnector & model_connector) Finder<ModelClass> & prefix(const wchar_t * prefix)
{ {
this->model_connector = &model_connector; column_prefix = prefix;
return select(); return *this;
}
Finder<ModelClass> & select(ModelConnector * model_connector)
{
this->model_connector = model_connector;
return select();
}
Finder<ModelClass> & select(PT::TextStream & out_stream, ModelConnector & model_connector)
{
this->out_stream = &out_stream;
this->model_connector = &model_connector;
return select();
}
Finder<ModelClass> & select(PT::TextStream & out_stream, ModelConnector * model_connector)
{
this->out_stream = &out_stream;
this->model_connector = model_connector;
return select();
} }
@@ -153,6 +133,7 @@ public:
was_query_error = false; was_query_error = false;
last_query_error.clear(); last_query_error.clear();
model_data = nullptr; model_data = nullptr;
column_prefix.clear();
if( model_connector ) if( model_connector )
{ {
@@ -184,6 +165,32 @@ public:
} }
Finder<ModelClass> & select(ModelConnector & model_connector)
{
this->model_connector = &model_connector;
return select();
}
Finder<ModelClass> & select(ModelConnector * model_connector)
{
this->model_connector = model_connector;
return select();
}
Finder<ModelClass> & select(PT::TextStream & out_stream, ModelConnector & model_connector)
{
this->out_stream = &out_stream;
this->model_connector = &model_connector;
return select();
}
Finder<ModelClass> & select(PT::TextStream & out_stream, ModelConnector * model_connector)
{
this->out_stream = &out_stream;
this->model_connector = model_connector;
return select();
}
Finder<ModelClass> & select(bool call_prepare = true) Finder<ModelClass> & select(bool call_prepare = true)
{ {
@@ -195,9 +202,13 @@ public:
if( model_connector && out_stream ) if( model_connector && out_stream )
{ {
(*out_stream) << "SELECT "; (*out_stream) << "SELECT ";
model_connector->generate_select_columns(*out_stream, model); model_connector->generate_select_columns(*out_stream, model, column_prefix);
(*out_stream) << " FROM "; (*out_stream) << " FROM ";
model.table_name(*out_stream); model.table_name(*out_stream);
if( !column_prefix.empty() )
(*out_stream) << " AS " << column_prefix; // what about escaping?
(*out_stream) << " "; (*out_stream) << " ";
} }
@@ -403,6 +414,23 @@ public:
} }
Finder<ModelClass> & 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 get(ModelClass & result)
{ {
bool res = false; bool res = false;
@@ -542,6 +570,9 @@ private:
bool was_query_error; bool was_query_error;
std::wstring last_query_error; std::wstring last_query_error;
Model::ModelData * model_data; Model::ModelData * model_data;
std::wstring column_prefix;
void set_db_expression() void set_db_expression()
{ {

View File

@@ -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 ) if( db_connector )
{ {
@@ -207,7 +207,7 @@ void ModelConnector::generate_select_columns(PT::TextStream & stream, Model & mo
//if( expression_callback ) //if( expression_callback )
//{ //{
db_connector->generate_select_columns(stream, model); db_connector->generate_select_columns(stream, model, column_prefix);
//} //}
//expression_callback = nullptr; //expression_callback = nullptr;

View File

@@ -85,7 +85,7 @@ public:
virtual void to_text(PT::TextStream & stream, Model & model); 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_insert_query(PT::TextStream & stream, Model & model);
virtual void generate_update_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); virtual void generate_remove_query(PT::TextStream & stream, Model & model);