diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index a864880..28570b2 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -69,9 +69,11 @@ int BaseExpression::get_work_mode() void BaseExpression::prepare_to_new_expression() { column_prefix.clear(); + column_prefix_index = 1; out_stream = nullptr; is_first_field = false; work_mode = 0; + use_prefix = true; } @@ -81,16 +83,35 @@ PT::TextStream * BaseExpression::get_current_stream() } +void BaseExpression::allow_to_use_prefix(bool use_prefix) +{ + this->use_prefix = use_prefix; +} + + void BaseExpression::set_column_prefix(const std::string & prefix) { column_prefix = prefix; } +void BaseExpression::set_column_prefix(const std::string & prefix, int index) +{ + column_prefix = prefix; + column_prefix_index = index; +} + std::string BaseExpression::get_column_prefix() { return column_prefix; } +int BaseExpression::get_column_prefix_index() +{ + return column_prefix_index; +} + + + void BaseExpression::generate_from_model(PT::TextStream & stream, Model & model) { this->out_stream = &stream; @@ -156,24 +177,17 @@ void BaseExpression::field_after() -void BaseExpression::put_field_name(int table_index, const wchar_t * field_name, bool add_column_prefix) +void BaseExpression::put_field_name(const wchar_t * field_name, bool add_column_prefix) { before_field_name(); -// if( !add_column_prefix ) -// { -// -// -// } -// -// if( table_index >= 0 ) -// { -// (*out_stream) << 't' << table_index << '.'; -// } - - if( add_column_prefix && !column_prefix.empty() ) + if( use_prefix && add_column_prefix && !column_prefix.empty() ) { esc(column_prefix, *out_stream); + + if( column_prefix_index > 1 ) + (*out_stream) << column_prefix_index; + (*out_stream) << '.'; } @@ -182,12 +196,6 @@ void BaseExpression::put_field_name(int table_index, const wchar_t * field_name, } -void BaseExpression::put_field_name(const wchar_t * field_name, bool add_column_prefix) -{ - put_field_name(-1, field_name, add_column_prefix); -} - - void BaseExpression::put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data) { diff --git a/src/baseexpression.h b/src/baseexpression.h index e83d92f..0350d73 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -62,12 +62,17 @@ public: virtual void prepare_to_new_expression(); virtual void set_column_prefix(const std::string & prefix); + virtual void set_column_prefix(const std::string & prefix, int index); + virtual std::string get_column_prefix(); + virtual int get_column_prefix_index(); virtual void generate_from_model(PT::TextStream & stream, Model & model); virtual PT::TextStream * get_current_stream(); + // rename me + virtual void allow_to_use_prefix(bool use_prefix); // give me a better name virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data); @@ -75,7 +80,7 @@ public: template - void field(int table_index, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true, ModelData * model_data = nullptr) + void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true, ModelData * model_data = nullptr) { if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) ) { @@ -83,7 +88,7 @@ public: if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) { - put_field_name(table_index, field_name, add_column_prefix); + put_field_name(field_name, add_column_prefix); } else if( work_mode == MORM_WORK_MODE_MODEL_SAVE_FIELDS ) @@ -92,7 +97,7 @@ public: PT::TextStream * old_out_stream = out_stream; out_stream = &str; - put_field_name(-1, field_name, add_column_prefix); + put_field_name(field_name, add_column_prefix); out_stream = old_out_stream; if( model_data ) @@ -110,7 +115,7 @@ public: else if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) { - put_field_name(table_index, field_name); + put_field_name(field_name); put_name_value_separator(); put_field_value(field_value); } @@ -230,7 +235,7 @@ public: void field_to_stream(PT::TextStream & stream, const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { this->out_stream = &stream; - field(-1, field_name, field_value, insertable, updatable, is_primary_key); + field(field_name, field_value, insertable, updatable, is_primary_key); this->out_stream = nullptr; } @@ -278,6 +283,8 @@ protected: std::string column_prefix; + int column_prefix_index; + bool use_prefix; virtual void generate_from_model(Model & model); @@ -289,7 +296,6 @@ protected: //void field(const wchar_t * field_name, Model & field, bool insertable = true, bool updatable = true); - virtual void put_field_name(int table_index, const wchar_t * field_name, bool add_column_prefix = true); virtual void put_field_name(const wchar_t * field_name, bool add_column_prefix = true); template diff --git a/src/dbexpression.h b/src/dbexpression.h index 13e1f63..b679c36 100644 --- a/src/dbexpression.h +++ b/src/dbexpression.h @@ -71,7 +71,7 @@ public: column_expression += L" as "; column_expression += new_column_name; - field(-1, column_expression.c_str(), field_value, false, false, false, false); + field(column_expression.c_str(), field_value, false, false, false, false); } diff --git a/src/finder.h b/src/finder.h index 7cafe50..375b398 100644 --- a/src/finder.h +++ b/src/finder.h @@ -176,7 +176,7 @@ public: last_query_error.clear(); model_data = nullptr; column_prefix.clear(); - model.clear_table_index(); // will be changed + model.prepare_to_select(); if( model_connector ) { @@ -608,6 +608,8 @@ private: if( db_connector ) { db_expression = db_connector->get_expression(); + db_expression->allow_to_use_prefix(true); + // set prefix maybe there to an empty string? } } } diff --git a/src/model.cpp b/src/model.cpp index 82700df..9190d2b 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -550,6 +550,11 @@ void Model::clear() } +void Model::prepare_to_select() +{ + table_index = 1; +} + diff --git a/src/model.h b/src/model.h index 29ccba4..7c2a404 100644 --- a/src/model.h +++ b/src/model.h @@ -132,12 +132,8 @@ public: // set object to default values virtual void clear(); + virtual void prepare_to_select(); - // will be changed - void clear_table_index() - { - table_index = 0; - } protected: @@ -654,7 +650,7 @@ protected: if( flat_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here - flat_expression->field(-1, flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); + flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); } } } @@ -669,7 +665,12 @@ protected: if( db_expression && !is_empty_field(db_field_name) ) { - db_expression->field(table_index, db_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); + db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_data); + + if( model_data ) + { + model_data->current_column += 1; + } } } } @@ -681,7 +682,14 @@ protected: if( db_connector ) { if( !is_empty_field(db_field_name) ) + { get_value_by_field_name(db_field_name, field_value); + + if( model_data ) + { + model_data->current_column += 1; + } + } } } @@ -722,11 +730,8 @@ protected: model_data->morm_current_max_column += 1; model_data->morm_foreign_keys.clear(); - field_model.table_index = model_data->morm_current_max_column; - model_data->morm_finder_join_tables << "LEFT JOIN "; field_model.table_name(model_data->morm_finder_join_tables); - model_data->morm_finder_join_tables << " AS "; @@ -734,41 +739,30 @@ protected: PT::TextStream join_table_name_this; table_name_for_join_as(join_table_name_this); - std::string sss1; // improve me - join_table_name_this.to_string(sss1); + if( table_index > 1 ) + join_table_name_this << table_index; - int this_index = model_data->find_join_table_index(sss1); - - if( this_index > 1 ) - join_table_name_this << this_index; /////////// + PT::TextStream join_table_name; field_model.table_name_for_join_as(join_table_name); - std::string sss; // improve me - join_table_name.to_string(sss); - int table_index = model_data->add_join_table(sss); + field_model.table_index = model_data->add_join_table(join_table_name); - if( table_index > 1 ) - join_table_name << table_index; + if( field_model.table_index > 1 ) + join_table_name << field_model.table_index; ////////// - - - - model_data->morm_finder_join_tables << join_table_name; int expr_work_mode = db_expression->get_work_mode(); int expr_output_type = db_expression->get_output_type(); - std::string old_prefix = db_expression->get_column_prefix(); db_expression->set_work_mode(MORM_WORK_MODE_MODEL_SAVE_FIELDS); db_expression->set_output_type(MORM_OUTPUT_TYPE_JOIN_TABLES); - std::string empty; - db_expression->set_column_prefix(empty); + db_expression->allow_to_use_prefix(false); if( has_foreign_key ) { @@ -797,9 +791,12 @@ protected: } model_data->morm_finder_join_tables << ' '; + db_expression->set_work_mode(expr_work_mode); db_expression->set_output_type(expr_output_type); - db_expression->set_column_prefix(old_prefix); + + db_expression->allow_to_use_prefix(true); + } } @@ -848,33 +845,32 @@ protected: if( db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES ) { field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; + + // they dont have to be copied out, this is the same as current table name and table_index std::string current_prefix = db_expression->get_column_prefix(); + int current_table_index = db_expression->get_column_prefix_index(); /////////// PT::TextStream join_table_name; - field_model.table_name_for_join_as(join_table_name); + field_model.table_name_for_join_as(join_table_name); // RENAME this method std::string sss; // improve me join_table_name.to_string(sss); - int table_index = model_data->add_join_table(sss); - - if( table_index > 1 ) - { - join_table_name << table_index; - join_table_name.to_string(sss); - } - - ////////// - db_expression->set_column_prefix(sss); - + db_expression->set_column_prefix(sss, field_model.table_index); field_model.map_fields(); - db_expression->set_column_prefix(current_prefix); + + db_expression->set_column_prefix(current_prefix, current_table_index); field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + + if( model_data ) + { + model_data->current_column += 1; + } } } } @@ -944,11 +940,9 @@ protected: if( db_expression && !is_empty_field(db_field_name) && db_expression->get_output_type() != MORM_OUTPUT_TYPE_JOIN_TABLES ) { - ModelContainerType model_type; - - model_type.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL; - field_model(db_field_name, flat_field_name, model_type, insertable, updatable, false); - model_type.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; + // another select will be used (from another Finder) + // we need only columns name + // but columns are defined in the other model } } } @@ -1145,7 +1139,7 @@ protected: virtual bool is_empty_field(const wchar_t * value); -// template friend class Finder; + //template friend class Finder; template friend class Cursor; friend class BaseExpression; diff --git a/src/modeldata.h b/src/modeldata.h index fa04d49..5f435dc 100644 --- a/src/modeldata.h +++ b/src/modeldata.h @@ -46,6 +46,7 @@ public: ModelData() { morm_current_max_column = 1; + current_column = 1; } virtual ~ModelData() @@ -57,6 +58,10 @@ public: int morm_current_max_column; std::map morm_table_join_map; + int current_column; + //std::vector table_index; + + virtual void prepare_to_new_select() { @@ -67,6 +72,14 @@ public: } + virtual int add_join_table(const PT::TextStream & table_name) + { + std::string table_name_str; + table_name.to_string(table_name_str); + + return add_join_table(table_name_str); + } + virtual int add_join_table(const std::string & table_name) { auto res = morm_table_join_map.insert(std::make_pair(table_name, 1)); @@ -79,17 +92,26 @@ public: return res.first->second; } - virtual int find_join_table_index(const std::string & table_name) - { - auto iter = morm_table_join_map.find(table_name); +// virtual int find_join_table_index(const std::string & table_name) +// { +// auto iter = morm_table_join_map.find(table_name); +// +// if( iter != morm_table_join_map.end() ) +// { +// return iter->second; +// } +// +// return 0; +// } - if( iter != morm_table_join_map.end() ) - { - return iter->second; - } +// virtual int get_table_index(int column) +// { +// if( column < (int)table_index.size() ) +// return table_index[column]; +// +// return 0; +// } - return 0; - } /* * may to add: