/* * This file is a part of morm * and is distributed under the 2-Clause BSD licence. * Author: Tomasz Sowa */ /* * Copyright (c) 2018, 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_model #define headerfile_morm_model #include #include "textstream/textstream.h" #include "modelconnector.h" #include "dbexpression.h" #include "flatexpression.h" #include "queryresult.h" #include "modeldata.h" namespace morm { class Model { public: enum SaveMode { DO_INSERT_ON_SAVE, DO_UPDATE_ON_SAVE, DO_DELETE_ON_SAVE, DO_NOTHING_ON_SAVE, }; virtual void set_save_mode(SaveMode save_mode); virtual SaveMode get_save_mode(); virtual void mark_to_delete(); virtual void mark_to_remove(); virtual void mark_to_insert(); virtual void mark_to_update(); virtual bool object_exists(); virtual bool found(); void set_connector(ModelConnector & connector); void set_connector(ModelConnector * connector); /* * map fields to names * * */ virtual void map_fields() = 0; virtual void map_doc_fields() {} ; /* * * we can use the object for a different purpose than database (e.g. json) * so let the table_name be non pure-virtual * */ virtual void table_name(PT::TextStream & stream); virtual void to_text(PT::TextStream & stream, ModelData * model_data = nullptr, bool clear_stream = true); virtual void to_text(PT::TextStream & stream, ModelData & model_data, bool clear_stream = true); virtual void to_text(PT::TextStream & stream, bool clear_stream = true); virtual void to_text(std::string & str, ModelData * model_data = nullptr, bool clear_string = true); virtual void to_text(std::string & str, ModelData & model_data, bool clear_string = true); virtual void to_text(std::string & str, bool clear_string = true); virtual std::string to_text(); virtual std::string to_string(); virtual void generate_insert_query(PT::TextStream & stream); virtual bool insert(ModelData * model_data = nullptr); virtual bool insert(ModelData & model_data); virtual void generate_update_query(PT::TextStream & stream); virtual bool update(ModelData * model_data = nullptr); virtual bool update(ModelData & model_data); virtual void generate_remove_query(PT::TextStream & stream); virtual bool remove(ModelData * model_data = nullptr); virtual bool remove(ModelData & model_data); virtual bool save(ModelData * model_data = nullptr); virtual bool save(ModelData & model_data); virtual void generate_select_columns(PT::TextStream & stream, const std::wstring & column_prefix); virtual void generate_doc_for_flat(PT::TextStream & stream, bool clear_stream = true); virtual void generate_doc_for_db(PT::TextStream & stream, bool clear_stream = true); // set object to default values virtual void clear(); protected: ModelConnector * model_connector; SaveMode save_mode; ModelData * model_data; const void * doc_field_pointer; int model_connector_mode; QueryResult * query_result; Model(); Model(const Model & m); virtual ~Model(); virtual void before_select(); virtual void before_insert(); virtual void before_update(); virtual void before_remove(); virtual void after_select(); virtual void after_insert(); virtual void after_update(); virtual void after_remove(); virtual void after_select_failure(); virtual void after_insert_failure(); virtual void after_update_failure(); virtual void after_remove_failure(); virtual int get_connector_mode(); // used by Cursor virtual void map_values_from_query(QueryResult * query_result); ///////////////////////////////// void field(const wchar_t * field_name, char & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, unsigned char & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, std::wstring & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * field_name, wchar_t * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * field_name, std::string & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * field_name, char * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * field_name, bool & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, short & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, unsigned short & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, int & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, unsigned int & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, unsigned long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, long long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, unsigned long long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, float & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, double & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, long double & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * field_name, void * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * field_name, PT::Date & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(field_name, field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * field_name, Model & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_model(field_name, field_name, field_value, insertable, updatable, is_primary_key); } template void field(const wchar_t * field_name, std::list & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_list(field_name, field_name, field_value, insertable, updatable, is_primary_key); } ////////////////////// void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, char & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned char & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::wstring & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, wchar_t * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::string & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, char * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, short & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned short & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, int & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned int & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, long long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned long long & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, float & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, double & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, long double & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } // void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, void * field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) // { // field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); // } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, PT::Date & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_generic(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_model(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } template void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { field_list(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); } ////////////////////// void doc(const wchar_t * field_name, char & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, unsigned char & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, std::wstring & field_value) { doc_field_generic(field_name, field_name, field_value); } // void doc(const wchar_t * field_name, wchar_t * field_value) // { // doc_field_generic(field_name, field_name, field_value); // } void doc(const wchar_t * field_name, std::string & field_value) { doc_field_generic(field_name, field_name, field_value); } // void doc(const wchar_t * field_name, char * field_value) // { // doc_field_generic(field_name, field_name, field_value); // } void doc(const wchar_t * field_name, bool & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, short & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, unsigned short & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, int & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, unsigned int & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, long & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, unsigned long & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, long long & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, unsigned long long & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, float & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, double & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, long double & field_value) { doc_field_generic(field_name, field_name, field_value); } // void doc(const wchar_t * field_name, void * field_value) // { // doc_field_generic(field_name, field_name, field_value); // } void doc(const wchar_t * field_name, PT::Date & field_value) { doc_field_generic(field_name, field_name, field_value); } void doc(const wchar_t * field_name, Model & field_value) { doc_field_model(field_name, field_name, field_value); } template void doc(const wchar_t * field_name, std::list & field_value) { doc_field_list(field_name, field_name, field_value); } ////////////////////// void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, char & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned char & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::wstring & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } // void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, wchar_t * field_value) // { // doc_field_generic(db_field_name, flat_field_name, field_value); // } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::string & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } // void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, char * field_value) // { // doc_field_generic(db_field_name, flat_field_name, field_value); // } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, short & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned short & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, int & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned int & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, long & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned long & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, long long & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, unsigned long long & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, float & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, double & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, long double & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } // void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, void * field_value) // { // doc_field_generic(db_field_name, flat_field_name, field_value); // } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, PT::Date & field_value) { doc_field_generic(db_field_name, flat_field_name, field_value); } void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_value) { doc_field_model(db_field_name, flat_field_name, field_value); } template void doc(const wchar_t * db_field_name, const wchar_t * flat_field_name, std::list & field_value) { doc_field_list(db_field_name, flat_field_name, field_value); } ////////////////////// 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) { if( model_connector ) { if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { FlatConnector * flat_connector = model_connector->get_flat_connector(); if( flat_connector ) { FlatExpression * flat_expression = flat_connector->get_expression(); if( flat_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key); } } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { DbExpression * db_expression = db_connector->get_expression(); if( db_expression && !is_empty_field(db_field_name) ) { db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key); } } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { if( !is_empty_field(db_field_name) ) get_value_by_field_name(db_field_name, field_value); } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { Clearer * clearer = model_connector->get_clearer(); if( clearer ) { clearer->clear_value(field_value); } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); // potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych if( doc_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here doc_expression->field_doc(*this, flat_field_name, field_value, insertable, updatable, is_primary_key); } } } } } void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool is_primary_key) { if( model_connector ) { field_model.set_connector(model_connector); field_model.model_data = model_data; // IMPLEMENTME what about db? if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { FlatConnector * flat_connector = model_connector->get_flat_connector(); if( flat_connector ) { FlatExpression * flat_expression = flat_connector->get_expression(); if( flat_expression && !is_empty_field(flat_field_name) ) { field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING; flat_expression->field_model(flat_field_name, field_model, insertable, updatable, is_primary_key); field_model.model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE; } } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { Clearer * clearer = model_connector->get_clearer(); if( clearer ) { clearer->clear_model(field_model); } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); // potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych if( doc_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here doc_expression->field_doc(*this, flat_field_name, field_model, insertable, updatable, is_primary_key); } } } field_model.model_data = nullptr; } } template void field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container, bool insertable, bool updatable, bool is_primary_key) { // IMPLEMENTME what about db? if( model_connector ) { if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { FlatConnector * flat_connector = model_connector->get_flat_connector(); if( flat_connector ) { FlatExpression * flat_expression = flat_connector->get_expression(); if( flat_expression && !is_empty_field(flat_field_name) ) { // IMPROVE ME // what about model_data and save_mode? // may it should be placed inside some structure? flat_expression->field_list(flat_field_name, field_container, insertable, updatable, is_primary_key, model_connector, model_connector_mode, model_data); } } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { Clearer * clearer = model_connector->get_clearer(); if( clearer ) { clearer->clear_container(field_container); } } if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_DOC_FOR_FLAT ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); // different connector will be here (doc, flat) if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); // potrzebujemy dwa rozne doce, jeden dla flat drugi dla bazy danych if( doc_expression && !is_empty_field(flat_field_name) ) { // insertable, updatable and is_primary_key are ignored here doc_expression->field_doc(*this, flat_field_name, field_container, insertable, updatable, is_primary_key, model_data); } } } } } template void get_value_by_field_name(const wchar_t * field_name, FieldValue & field_value) { if( query_result ) { const char * val_str = query_result->get_field_string_value(field_name); if( val_str ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { db_connector->get_value(val_str, field_value); } } } } //// template void doc_field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value) { if( reinterpret_cast(&field_value) == doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); if( doc_expression ) { PT::TextStream * out_stream = doc_expression->get_current_stream(); if( out_stream ) { (*out_stream) << flat_field_name; } } } } } void doc_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model) { if( reinterpret_cast(&field_model) == doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); if( doc_expression ) { PT::TextStream * out_stream = doc_expression->get_current_stream(); if( out_stream ) { (*out_stream) << flat_field_name; } } } } } template void doc_field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container) { if( reinterpret_cast(&field_container) == doc_field_pointer && model_connector ) { FlatConnector * doc_connector = model_connector->get_doc_connector(); if( doc_connector ) { FlatExpression * doc_expression = doc_connector->get_expression(); if( doc_expression ) { PT::TextStream * out_stream = doc_expression->get_current_stream(); if( out_stream ) { (*out_stream) << flat_field_name; } } } } } public: template void get_last_sequence(const wchar_t * sequence_table_name, FieldValue & field_value) { if( model_connector ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector && !is_empty_field(sequence_table_name) ) { db_connector->get_last_sequence(sequence_table_name, field_value); } } } template void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, const wchar_t * flat_field_name, FieldValue & field_value) { if( model_connector ) { if( get_connector_mode() == MORM_MODEL_CONNECTOR_MODE_GENERATING_DB_SQL ) { DbConnector * db_connector = model_connector->get_db_connector(); if( db_connector ) { DbExpression * db_expression = db_connector->get_expression(); if( db_expression && !is_empty_field(new_column_expression) ) { db_expression->add_field_for_select(new_column_expression, new_column_name, field_value); } } } else if( get_connector_mode() == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING ) { field_generic(L"", flat_field_name, field_value, false, false, false); } else if( get_connector_mode() == MORM_MODEL_CONNECTOR_MODE_READING_VALUE_FROM_DB_RESULTSET ) { field_generic(new_column_name, L"", field_value, false, false, false); } else if( get_connector_mode() == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) { field_generic(L"", L"", field_value, false, false, false); // the names don't matter here } } } template void add_field_for_select(const wchar_t * new_column_expression, const wchar_t * new_column_name, FieldValue & field_value) { add_field_for_select(new_column_expression, new_column_name, new_column_name, field_value); } protected: virtual bool is_empty_field(const wchar_t * value); template friend class Finder; template friend class Cursor; friend class BaseExpression; }; } // namespace #endif