diff --git a/samples/Makefile.dep b/samples/Makefile.dep index 5d0c610..d56c775 100644 --- a/samples/Makefile.dep +++ b/samples/Makefile.dep @@ -14,7 +14,7 @@ main.o: ../../morm/src/queryresult.h ../../morm/src/flatconnector.h main.o: ../../morm/src/dbexpression.h ../../morm/src/baseexpression.h main.o: ../../morm/src/modelenv.h ../../morm/src/modeldata.h main.o: ../../morm/src/cursorhelper.h ../../morm/src/finderhelper.h -main.o: ../../morm/src/setfieldvaluehelper.h ../../morm/src/flatexpression.h +main.o: ../../morm/src/fieldvaluehelper.h ../../morm/src/flatexpression.h main.o: ../../morm/src/finder.h ../../pikotools/utf8/utf8.h main.o: ../../morm/src/cursor.h ../../morm/src/jsonexpression.h main.o: ../../morm/src/postgresqlexpression.h diff --git a/samples/attachment.h b/samples/attachment.h index 38c58b6..c16eefa 100644 --- a/samples/attachment.h +++ b/samples/attachment.h @@ -76,10 +76,7 @@ public: field(L"id", id, false, false, true); field(L"person_id", person_id); field(L"name", name); - field(L"language_id", language); - - field(L"content", content); field(L"some_flags", some_flags); field(L"created_date", created_date); diff --git a/src/Makefile.dep b/src/Makefile.dep index 06bb65f..36a6f42 100644 --- a/src/Makefile.dep +++ b/src/Makefile.dep @@ -8,7 +8,7 @@ baseexpression.o: ../../pikotools/convert/inttostr.h baseexpression.o: ../../pikotools/membuffer/membuffer.h baseexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h baseexpression.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -baseexpression.o: setfieldvaluehelper.h model.h modelconnector.h clearer.h +baseexpression.o: fieldvaluehelper.h model.h modelconnector.h clearer.h baseexpression.o: dbconnector.h ../../pikotools/log/log.h baseexpression.o: ../../pikotools/log/filelog.h flatconnector.h baseexpression.o: dbexpression.h flatexpression.h ../../pikotools/utf8/utf8.h @@ -21,7 +21,7 @@ clearer.o: ../../pikotools/textstream/types.h modelconnector.h dbconnector.h clearer.o: ../../pikotools/log/log.h ../../pikotools/log/filelog.h clearer.o: queryresult.h flatconnector.h dbexpression.h baseexpression.h clearer.o: morm_types.h modelenv.h modeldata.h cursorhelper.h finderhelper.h -clearer.o: setfieldvaluehelper.h flatexpression.h +clearer.o: fieldvaluehelper.h flatexpression.h dbconnector.o: dbconnector.h ../../pikotools/textstream/textstream.h dbconnector.o: ../../pikotools/space/space.h dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/date/date.h @@ -30,7 +30,7 @@ dbconnector.o: ../../pikotools/membuffer/membuffer.h dbconnector.o: ../../pikotools/textstream/types.h ../../pikotools/log/log.h dbconnector.o: ../../pikotools/log/filelog.h queryresult.h dbexpression.h dbconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h -dbconnector.o: cursorhelper.h finderhelper.h setfieldvaluehelper.h model.h +dbconnector.o: cursorhelper.h finderhelper.h fieldvaluehelper.h model.h dbconnector.o: modelconnector.h clearer.h flatconnector.h flatexpression.h dbconnector.o: ../../pikotools/utf8/utf8.h ../../pikotools/convert/convert.h dbconnector.o: ../../pikotools/convert/inttostr.h @@ -46,7 +46,7 @@ dbexpression.o: ../../pikotools/convert/inttostr.h dbexpression.o: ../../pikotools/membuffer/membuffer.h dbexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h dbexpression.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -dbexpression.o: setfieldvaluehelper.h +dbexpression.o: fieldvaluehelper.h dochtmlconnector.o: dochtmlconnector.h flatconnector.h dochtmlconnector.o: ../../pikotools/textstream/textstream.h dochtmlconnector.o: ../../pikotools/space/space.h @@ -57,7 +57,7 @@ dochtmlconnector.o: ../../pikotools/membuffer/membuffer.h dochtmlconnector.o: ../../pikotools/textstream/types.h dochtmlexpression.h dochtmlconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h dochtmlconnector.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -dochtmlconnector.o: setfieldvaluehelper.h +dochtmlconnector.o: fieldvaluehelper.h dochtmlexpression.o: dochtmlexpression.h flatexpression.h baseexpression.h dochtmlexpression.o: ../../pikotools/textstream/textstream.h dochtmlexpression.o: ../../pikotools/space/space.h @@ -67,7 +67,7 @@ dochtmlexpression.o: ../../pikotools/convert/inttostr.h dochtmlexpression.o: ../../pikotools/membuffer/membuffer.h dochtmlexpression.o: ../../pikotools/textstream/types.h morm_types.h dochtmlexpression.o: modelenv.h modeldata.h cursorhelper.h queryresult.h -dochtmlexpression.o: finderhelper.h setfieldvaluehelper.h +dochtmlexpression.o: finderhelper.h fieldvaluehelper.h flatconnector.o: flatconnector.h ../../pikotools/textstream/textstream.h flatconnector.o: ../../pikotools/space/space.h flatconnector.o: ../../pikotools/textstream/types.h @@ -77,7 +77,7 @@ flatconnector.o: ../../pikotools/membuffer/membuffer.h flatconnector.o: ../../pikotools/textstream/types.h flatexpression.h flatconnector.o: baseexpression.h morm_types.h modelenv.h modeldata.h flatconnector.o: cursorhelper.h queryresult.h finderhelper.h -flatconnector.o: setfieldvaluehelper.h model.h modelconnector.h clearer.h +flatconnector.o: fieldvaluehelper.h model.h modelconnector.h clearer.h flatconnector.o: dbconnector.h ../../pikotools/log/log.h flatconnector.o: ../../pikotools/log/filelog.h dbexpression.h flatexpression.o: flatexpression.h baseexpression.h @@ -89,7 +89,7 @@ flatexpression.o: ../../pikotools/convert/inttostr.h flatexpression.o: ../../pikotools/membuffer/membuffer.h flatexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h flatexpression.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -flatexpression.o: setfieldvaluehelper.h +flatexpression.o: fieldvaluehelper.h jsonconnector.o: jsonconnector.h flatconnector.h jsonconnector.o: ../../pikotools/textstream/textstream.h jsonconnector.o: ../../pikotools/space/space.h @@ -100,7 +100,7 @@ jsonconnector.o: ../../pikotools/membuffer/membuffer.h jsonconnector.o: ../../pikotools/textstream/types.h jsonexpression.h jsonconnector.o: flatexpression.h baseexpression.h morm_types.h modelenv.h jsonconnector.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -jsonconnector.o: setfieldvaluehelper.h +jsonconnector.o: fieldvaluehelper.h jsonexpression.o: jsonexpression.h flatexpression.h baseexpression.h jsonexpression.o: ../../pikotools/textstream/textstream.h jsonexpression.o: ../../pikotools/space/space.h @@ -110,7 +110,7 @@ jsonexpression.o: ../../pikotools/convert/inttostr.h jsonexpression.o: ../../pikotools/membuffer/membuffer.h jsonexpression.o: ../../pikotools/textstream/types.h morm_types.h modelenv.h jsonexpression.o: modeldata.h cursorhelper.h queryresult.h finderhelper.h -jsonexpression.o: setfieldvaluehelper.h +jsonexpression.o: fieldvaluehelper.h model.o: model.h ../../pikotools/textstream/textstream.h model.o: ../../pikotools/space/space.h ../../pikotools/textstream/types.h model.o: ../../pikotools/date/date.h ../../pikotools/convert/inttostr.h @@ -119,7 +119,7 @@ model.o: ../../pikotools/textstream/types.h modelconnector.h clearer.h model.o: dbconnector.h ../../pikotools/log/log.h model.o: ../../pikotools/log/filelog.h queryresult.h flatconnector.h model.o: dbexpression.h baseexpression.h morm_types.h modelenv.h modeldata.h -model.o: cursorhelper.h finderhelper.h setfieldvaluehelper.h flatexpression.h +model.o: cursorhelper.h finderhelper.h fieldvaluehelper.h flatexpression.h modelconnector.o: modelconnector.h clearer.h ../../pikotools/date/date.h modelconnector.o: ../../pikotools/convert/inttostr.h dbconnector.h modelconnector.o: ../../pikotools/textstream/textstream.h @@ -142,7 +142,7 @@ postgresqlconnector.o: ../../pikotools/log/filelog.h queryresult.h postgresqlconnector.o: postgresqlqueryresult.h ../../pikotools/utf8/utf8.h postgresqlconnector.o: postgresqlexpression.h dbexpression.h baseexpression.h postgresqlconnector.o: morm_types.h modelenv.h modeldata.h cursorhelper.h -postgresqlconnector.o: finderhelper.h setfieldvaluehelper.h +postgresqlconnector.o: finderhelper.h fieldvaluehelper.h postgresqlconnector.o: ../../pikotools/convert/strtoint.h postgresqlconnector.o: ../../pikotools/convert/text.h postgresqlconnector.o: ../../pikotools/convert/misc.h @@ -156,7 +156,7 @@ postgresqlexpression.o: ../../pikotools/convert/inttostr.h postgresqlexpression.o: ../../pikotools/membuffer/membuffer.h postgresqlexpression.o: ../../pikotools/textstream/types.h morm_types.h postgresqlexpression.o: modelenv.h modeldata.h cursorhelper.h queryresult.h -postgresqlexpression.o: finderhelper.h setfieldvaluehelper.h +postgresqlexpression.o: finderhelper.h fieldvaluehelper.h postgresqlqueryresult.o: postgresqlqueryresult.h queryresult.h queryresult.o: queryresult.h ../../pikotools/utf8/utf8.h queryresult.o: ../../pikotools/textstream/textstream.h diff --git a/src/fieldvaluehelper.h b/src/fieldvaluehelper.h new file mode 100644 index 0000000..fe0bfd2 --- /dev/null +++ b/src/fieldvaluehelper.h @@ -0,0 +1,68 @@ +/* + * This file is a part of morm + * and is distributed under the 2-Clause BSD licence. + * Author: Tomasz Sowa + */ + +/* + * Copyright (c) 2019, Tomasz Sowa + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef headerfile_morm_fieldvaluehelper +#define headerfile_morm_fieldvaluehelper + +#include +#include + + +namespace morm +{ + +struct FieldValueHelper +{ + const wchar_t * db_field_name; + const wchar_t * flat_field_name; + + const void * value_object; + const std::type_info * value_type_info; + + + FieldValueHelper() + { + db_field_name = nullptr; + flat_field_name = nullptr; + + value_object = nullptr; + value_type_info = nullptr; + } + +}; + + +} + +#endif diff --git a/src/model.h b/src/model.h index c2ea58c..976db3f 100644 --- a/src/model.h +++ b/src/model.h @@ -38,6 +38,7 @@ #include #include #include +#include #include "textstream/textstream.h" #include "modelconnector.h" @@ -142,11 +143,15 @@ public: model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE; model_env->field_index = 0; - SetFieldValueHelper set_field_value_helper; - FieldValueContainer helper_object(field_value); + FieldValueHelper field_value_helper; + field_value_helper.db_field_name = db_field_name; + field_value_helper.flat_field_name = flat_field_name; + field_value_helper.value_object = &field_value; + field_value_helper.value_type_info = &typeid(field_value); - set_field_value_helper.add(db_field_name, flat_field_name, &helper_object, false); - model_env->set_field_value_helper = &set_field_value_helper; + std::vector helper_tab; + helper_tab.push_back(field_value_helper); + model_env->field_value_helper_tab = &helper_tab; map_fields(); @@ -673,53 +678,57 @@ protected: template void field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key) { - PT::Log * log = model_connector->get_logger(); - if( model_connector && model_env ) { if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE ) { - if( model_env->set_field_value_helper ) + if( model_env->field_value_helper_tab ) { - if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->set_field_value_helper->size() ) + if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) { - if( is_the_same_field(db_field_name, model_env->set_field_value_helper->get_db_field_name(model_env->field_index)) && - is_the_same_field(flat_field_name, model_env->set_field_value_helper->get_flat_field_name(model_env->field_index)) ) + FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; + PT::Log * log = model_connector->get_logger(); + + if( is_the_same_field(db_field_name, helper.db_field_name) && + is_the_same_field(flat_field_name, helper.flat_field_name) ) { - model_env->set_field_value_helper->set_value(model_env->field_index, field_value); + if( helper.value_object && helper.value_type_info ) + { + if( typeid(field_value) == *helper.value_type_info ) + { + field_value = *(FieldValue*)helper.value_object; + } + else + { + table_name(model_env->table_name); + (*log) << PT::Log::log1 << "Morm: incorrect type of a field in " << model_env->table_name << ", "; + + if( !is_empty_field(db_field_name) ) + (*log) << "database field name: " << db_field_name << ", "; + + if( !is_empty_field(flat_field_name) ) + (*log) << "flat field name: " << flat_field_name << ", "; + + (*log) << "type expected " << typeid(field_value).name() + << " got " << helper.value_type_info->name() << PT::Log::logend; + } + } + model_env->field_index += 1; } } - else - { - // the log has to be generated by a parent call - // it should compare model_env->field_index with the number of keys -// if( log ) -// { -// // IMPROVE ME a better log message is required -// (*log) << PT::Log::log1 << "Morm: incorrect number of keys found in model objects" << PT::Log::logend; -// } - } } } if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES && is_primary_key ) { - if( model_env->set_field_value_helper ) + if( model_env->field_value_helper_tab ) { - if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->set_field_value_helper->size() ) + if( model_env->field_index >= 0 && (size_t)model_env->field_index < model_env->field_value_helper_tab->size() ) { - FieldValueBase * helper_object = new FieldValueContainer(field_value); - model_env->set_field_value_helper->add_field_value_container(model_env->field_index, helper_object, true); - } - else - { - if( log ) - { - // IMPROVE ME a better log message is required - // the log can be generated by a parent call - (*log) << PT::Log::log1 << "Morm: incorrect number of keys found in model objects" << PT::Log::logend; - } + FieldValueHelper & helper = (*model_env->field_value_helper_tab)[model_env->field_index]; + helper.value_object = &field_value; + helper.value_type_info = &typeid(field_value); } } @@ -1001,6 +1010,7 @@ protected: void field_model_set_parent_key(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model) { DbConnector * db_connector = model_connector->get_db_connector(); + PT::Log * log = model_connector->get_logger(); if( db_connector ) { @@ -1011,39 +1021,58 @@ protected: int old_connector_mode = model_env->model_connector_mode; model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_ITERATE_PRIMARY_KEY_VALUES; - SetFieldValueHelper set_field_value_helper; - set_field_value_helper.add(db_field_name, flat_field_name); // in the future we can have a primary key from more than one column - model_env->set_field_value_helper = &set_field_value_helper; + FieldValueHelper helper; // in the future we can have a primary key from more than one column + helper.db_field_name = db_field_name; + helper.flat_field_name = flat_field_name; + + std::vector helper_tab; + helper_tab.push_back(helper); + + model_env->field_value_helper_tab = &helper_tab; model_env->field_index = 0; + /* + * first we iterate through fields and save primary key values to helper_tab + */ map_fields(); - if( set_field_value_helper.empty() ) - { - // IMPROVE ME - // put some log: there is no a primary key in this model - } - else - if( set_field_value_helper.size() == 1 ) + if( (size_t)model_env->field_index == helper_tab.size() ) { ModelEnv model_env_local; model_env_local.copy_global_objects(*model_env); model_env_local.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_SET_FIELD_VALUE; - model_env_local.set_field_value_helper = &set_field_value_helper; + model_env_local.field_value_helper_tab = &helper_tab; model_env_local.field_index = 0; field_model.model_env = &model_env_local; + /* + * now we iterate through fields in field_model and save primary key values from *this object to the specified fields in field_model + */ field_model.map_fields(); - field_model.model_env = nullptr; - model_env->set_field_value_helper = nullptr; - model_env->model_connector_mode = old_connector_mode; + if( (size_t)field_model.model_env->field_index != helper_tab.size() && log ) + { + table_name(model_env->table_name); + field_model.table_name(field_model.model_env->table_name); + + (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of " << model_env->field_index << " column(s)" + << " but in " << field_model.model_env->table_name << " there are only " + << field_model.model_env->field_index << " matching column(s)" << PT::Log::logend; + } + + field_model.model_env = nullptr; } else + if( log ) { - // IMPROVE ME - // put some log: at the moment we only support a primary key from only one column + table_name(model_env->table_name); + + (*log) << PT::Log::log1 << "Morm: primary key in " << model_env->table_name << " consists of incorrect number of columns" + << ", expected " << helper_tab.size() << " column(s) but got " << model_env->field_index << PT::Log::logend; } + + model_env->field_value_helper_tab = nullptr; + model_env->model_connector_mode = old_connector_mode; } } } diff --git a/src/modelenv.h b/src/modelenv.h index 0548a29..d246689 100644 --- a/src/modelenv.h +++ b/src/modelenv.h @@ -38,7 +38,7 @@ #include "modeldata.h" #include "cursorhelper.h" #include "finderhelper.h" -#include "setfieldvaluehelper.h" +#include "fieldvaluehelper.h" #include "morm_types.h" @@ -63,7 +63,7 @@ public: int field_index; std::vector * set_field_name_helper; - SetFieldValueHelper * set_field_value_helper; + std::vector * field_value_helper_tab; ModelEnv() @@ -86,7 +86,7 @@ public: table_index = e.table_index; doc_field_pointer = e.doc_field_pointer; set_field_name_helper = e.set_field_name_helper; - set_field_value_helper = e.set_field_value_helper; + field_value_helper_tab = e.field_value_helper_tab; field_index = e.field_index; // table_name and table_name_short don't have to bo copied @@ -115,7 +115,7 @@ public: table_name_short.clear(); table_index = 0; set_field_name_helper = nullptr; - set_field_value_helper = nullptr; + field_value_helper_tab = nullptr; field_index = 0; } diff --git a/src/setfieldvaluehelper.h b/src/setfieldvaluehelper.h deleted file mode 100644 index b8490ae..0000000 --- a/src/setfieldvaluehelper.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * This file is a part of morm - * and is distributed under the 2-Clause BSD licence. - * Author: Tomasz Sowa - */ - -/* - * Copyright (c) 2019, Tomasz Sowa - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef headerfile_morm_setfieldvaluehelper -#define headerfile_morm_setfieldvaluehelper - -#include -#include - - -namespace morm -{ - - -struct FieldValueBase -{ - FieldValueBase() - { - } - - virtual ~FieldValueBase() - { - } - - virtual void set(void * value, const std::type_info & value_type_info) = 0; - -}; - - -template -struct FieldValueContainer : public FieldValueBase -{ - FieldValueContainer(const FieldValue & value) - { - this->value = &value; - } - - void set(void * value, const std::type_info & value_type_info) - { - if( value_type_info == typeid(FieldValue) ) - { - FieldValue * field_value = reinterpret_cast(value); - *field_value = *this->value; - } - } - - const FieldValue * value; - -}; - - - - -class SetFieldValueHelper -{ -public: - - struct Item - { - const wchar_t * db_field_name; - const wchar_t * flat_field_name; - - // IMPROVE ME - // instead of FieldValueBase can we have only a pointer to void (to the value object) and a pointer to std::type_info? - FieldValueBase * field_value_base; - - bool auto_remove_field_value_object; - - Item() - { - db_field_name = nullptr; - flat_field_name = nullptr; - field_value_base = nullptr; - auto_remove_field_value_object = false; - } - - ~Item() - { - } - }; - - - std::vector item_tab; - - - SetFieldValueHelper() - { - clear(); - } - - - virtual ~SetFieldValueHelper() - { - remove_field_value_base_objects(); - } - - - virtual void remove_field_value_base_objects() - { - for(Item & item : item_tab) - { - if( item.auto_remove_field_value_object ) - { - delete item.field_value_base; - item.field_value_base = nullptr; - } - } - } - - - virtual void clear() - { - item_tab.clear(); - } - - - virtual void add(const wchar_t * db_field_name, const wchar_t * flat_field_name) - { - add(db_field_name, flat_field_name, nullptr, false); - } - - - virtual void add(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValueBase * field_value_base, bool auto_remove_field_value_object) - { - Item item; - item.db_field_name = db_field_name; - item.flat_field_name = flat_field_name; - item.field_value_base = field_value_base; - item.auto_remove_field_value_object = auto_remove_field_value_object; - item_tab.push_back(item); - } - - - virtual size_t size() - { - return item_tab.size(); - } - - virtual bool empty() - { - return item_tab.empty(); - } - - virtual void add_field_value_container(size_t index, FieldValueBase * field_value_base, bool auto_remove_field_value_object) - { - if( item_tab[index].field_value_base && item_tab[index].auto_remove_field_value_object ) - { - delete item_tab[index].field_value_base; - } - - item_tab[index].field_value_base = field_value_base; - item_tab[index].auto_remove_field_value_object = auto_remove_field_value_object; - } - - template - void set_value(size_t index, FieldValue & value) - { - if( item_tab[index].field_value_base ) - { - item_tab[index].field_value_base->set(&value, typeid(value)); - } - } - - - virtual const wchar_t * get_db_field_name(size_t index) - { - return item_tab[index].db_field_name; - } - - - virtual const wchar_t * get_flat_field_name(size_t index) - { - return item_tab[index].flat_field_name; - } - -}; - -} - -#endif