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:
Tomasz Sowa 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)
{
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();
}

View File

@ -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<typename FieldValue>
@ -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;

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();
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 ";

View File

@ -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();

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;
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();
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<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)
{
@ -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<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 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()
{

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 )
{
@ -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;

View File

@ -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);