From de4abeb91ce727bd489bdcd6baecff4b147aaa22 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Thu, 13 May 2021 19:32:31 +0200 Subject: [PATCH] added to Finder: methods eq() and similar with table_name as an argument Finder & eq(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) Finder & eq(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) and similar for neq(), lt(), gt(), le(), ge() and in() --- src/baseexpression.cpp | 9 +- src/finder.h | 273 ++++++++++++++++++++++++++++++++++++++++- src/modelenv.h | 14 +++ 3 files changed, 294 insertions(+), 2 deletions(-) diff --git a/src/baseexpression.cpp b/src/baseexpression.cpp index ff0bc39..c14a81b 100644 --- a/src/baseexpression.cpp +++ b/src/baseexpression.cpp @@ -174,7 +174,14 @@ void BaseExpression::put_field_name_and_table_if_needed(const wchar_t * field_na { if( use_prefix && model_env ) { - put_table_with_index_and_field(model_env->table_name, model_env->table_index, field_name, field_type); + if( !is_empty_field(model_env->table2_name) ) + { + put_table_with_index_and_field(model_env->table2_name, model_env->table2_index, field_name, field_type); + } + else + { + put_table_with_index_and_field(model_env->table_name, model_env->table_index, field_name, field_type); + } } else { diff --git a/src/finder.h b/src/finder.h index 7f69477..c369da9 100644 --- a/src/finder.h +++ b/src/finder.h @@ -341,7 +341,6 @@ public: - template Finder & eq(const wchar_t * field_name, const FieldValue & field_value) { @@ -355,6 +354,32 @@ public: } + template + Finder & eq(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_EQ); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + template + Finder & eq(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_EQ); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + template Finder & neq(const wchar_t * field_name, const FieldValue & field_value) { @@ -367,6 +392,33 @@ public: return *this; } + + template + Finder & neq(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_NOT_EQ); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + template + Finder & neq(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_NOT_EQ); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + template Finder & lt(const wchar_t * field_name, const FieldValue & field_value) { @@ -380,6 +432,32 @@ public: } + template + Finder & lt(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LT); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + template + Finder & lt(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LT); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + template Finder & gt(const wchar_t * field_name, const FieldValue & field_value) { @@ -393,6 +471,32 @@ public: } + template + Finder & gt(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GT); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + template + Finder & gt(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GT); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + template Finder & le(const wchar_t * field_name, const FieldValue & field_value) { @@ -406,6 +510,34 @@ public: } + template + Finder & le(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LE); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + + template + Finder & le(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_LE); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + + template Finder & ge(const wchar_t * field_name, const FieldValue & field_value) { @@ -419,6 +551,33 @@ public: } + template + Finder & ge(const wchar_t * table_name, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GE); + field_to_stream(table_name, 1, field_name, field_value); + } + + return *this; + } + + + + template + Finder & ge(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_GE); + field_to_stream(table_name, table_index, field_name, field_value); + } + + return *this; + } + + template Finder & in(const wchar_t * field_name, const std::set & container) @@ -432,6 +591,33 @@ public: return *this; } + + template + Finder & in(const wchar_t * table_name, const wchar_t * field_name, const std::set & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, 1, field_name, container); + } + + return *this; + } + + + template + Finder & in(const wchar_t * table_name, int table_index, const wchar_t * field_name, const std::set & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, table_index, field_name, container); + } + + return *this; + } + + template Finder & in(const wchar_t * field_name, const std::list & container) { @@ -444,6 +630,33 @@ public: return *this; } + + template + Finder & in(const wchar_t * table_name, const wchar_t * field_name, const std::list & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, 1, field_name, container); + } + + return *this; + } + + + template + Finder & in(const wchar_t * table_name, int table_index, const wchar_t * field_name, const std::list & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, table_index, field_name, container); + } + + return *this; + } + + template Finder & in(const wchar_t * field_name, const std::vector & container) { @@ -456,6 +669,35 @@ public: return *this; } + + template + Finder & in(const wchar_t * table_name, const wchar_t * field_name, const std::vector & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, 1, field_name, container); + } + + return *this; + } + + + template + Finder & in(const wchar_t * table_name, int table_index, const wchar_t * field_name, const std::vector & container) + { + if( db_expression ) + { + db_expression->set_output_type(MORM_OUTPUT_TYPE_WHERE_IN); + field_in(table_name, table_index, field_name, container); + } + + return *this; + } + + + + Finder & page(size_t page_number, size_t page_size) { if( out_stream && db_expression ) @@ -640,6 +882,35 @@ private: } + template + void field_to_stream(const wchar_t * table_name, int table_index, const wchar_t * field_name, const FieldValue & field_value) + { + if( db_expression ) + { + model_env.table2_name = table_name; + model_env.table2_index = table_index; + + db_expression->field_to_stream(*out_stream, field_name, field_value, FT::default_type, &model_env); + + model_env.table2_name = nullptr; + model_env.table2_index = 0; + } + } + + template + void field_in(const wchar_t * table_name, int table_index, const wchar_t * field_name, const Container & container) + { + if( db_expression ) + { + model_env.table2_name = table_name; + model_env.table2_index = table_index; + + db_expression->field_in(*out_stream, field_name, container, &model_env); + + model_env.table2_name = nullptr; + model_env.table2_index = 0; + } + } }; diff --git a/src/modelenv.h b/src/modelenv.h index dae9625..c68adbc 100644 --- a/src/modelenv.h +++ b/src/modelenv.h @@ -64,10 +64,20 @@ public: PT::WTextStream schema_name; PT::WTextStream table_name; int table_index; + + /* + * optional additional table name + * used in eq(), neq(), ... methods in Finder + */ + const wchar_t * table2_name; + int table2_index; + + int field_index; bool was_primary_key_read; bool has_primary_key_set; + std::vector * set_field_name_helper; std::vector * field_value_helper_tab; @@ -87,6 +97,7 @@ public: copy_global_objects(e); table_index = e.table_index; + table2_index = e.table2_index; set_field_name_helper = e.set_field_name_helper; field_value_helper_tab = e.field_value_helper_tab; field_index = e.field_index; @@ -94,6 +105,7 @@ public: has_primary_key_set = e.has_primary_key_set; // schema_name and table_name don't have to be copied + table2_name = nullptr; } @@ -119,7 +131,9 @@ public: dump_mode = false; schema_name.clear(); table_name.clear(); + table2_name = nullptr; table_index = 0; + table2_index = 0; set_field_name_helper = nullptr; field_value_helper_tab = nullptr; field_index = 0;