From 98206fdb7a268c20efe846db3271f323387cd0c4 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Thu, 26 Apr 2018 18:58:31 +0000 Subject: [PATCH] added: field_model() method to Model git-svn-id: svn://ttmath.org/publicrep/morm/trunk@1103 e52654a7-88a9-db11-a3e9-0013d4bc506e --- src/baseexpression.h | 29 +++++++++++++++++++++++++++++ src/finder.h | 6 ++---- src/model.h | 26 ++++++++++++++++++++++++++ src/modelconnector.h | 26 ++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/baseexpression.h b/src/baseexpression.h index 9b5cf9f..ccd5886 100644 --- a/src/baseexpression.h +++ b/src/baseexpression.h @@ -120,6 +120,7 @@ public: { field_before(); + // IMPLEMENTME // if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) // { // put_field_name(field_name); @@ -141,6 +142,34 @@ public: } } + template + void field_model(const wchar_t * field_name, ModelClass & field_model, bool insertable = true, bool updatable = true, bool is_primary_key = false) + { + if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) ) + { + field_before(); + + // IMPLEMENTME +// if( work_mode == MORM_WORK_MODE_MODEL_FIELDS ) +// { +// put_field_name(field_name); +// } +// else +// if( work_mode == MORM_WORK_MODE_MODEL_VALUES ) +// { +// put_field_value(field_value); +// } +// else + if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES ) + { + put_field_name(field_name); + put_name_value_separator(); + generate_from_model(field_model); + } + + field_after(); + } + } template 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) diff --git a/src/finder.h b/src/finder.h index 41aafed..404f74c 100644 --- a/src/finder.h +++ b/src/finder.h @@ -406,10 +406,8 @@ public: bool get(ModelClass & result) { bool res = false; - result.clear(); // here has to be a model connector (it clears all fields) - - // what about setting a model connector for the result? - // it can be a different object + result.set_connector(model_connector); + result.clear(); if( model_connector && out_stream ) { diff --git a/src/model.h b/src/model.h index 7833d99..a9baf73 100644 --- a/src/model.h +++ b/src/model.h @@ -156,6 +156,20 @@ protected: virtual int get_connector_mode(); + // temporarily workaround + // these templates will be removed + void fieldb(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) + { + if( model_connector ) + { + model_connector->field(db_field_name, flat_field_name, field_value, insertable, updatable, is_primary_key); + } + } + ///////////////////////////////// + + + + template void field(const wchar_t * field_name, FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false) { @@ -201,6 +215,18 @@ protected: } } + template + void field_model(const wchar_t * field_name, ModelClass & field_model, bool insertable = true, bool updatable = true, bool is_primary_key = false) + { + if( model_connector ) + { + // is there a possibility for the childs to be connected to different model connectors? + field_model.set_connector(model_connector); + model_connector->field_model(field_name, field_model, insertable, updatable, is_primary_key); + } + } + + template void get_last_sequence(const wchar_t * sequence_table_name, FieldValue & field_value) { diff --git a/src/modelconnector.h b/src/modelconnector.h index 8030259..2748745 100644 --- a/src/modelconnector.h +++ b/src/modelconnector.h @@ -178,6 +178,7 @@ protected: template void field_list(const wchar_t * field_name, std::list & field_list, bool insertable = true, bool updatable = true, bool is_primary_key = false) { + // IMPLEMENTME what about db? if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING && flat_connector ) { FlatExpression * flat_expression = flat_connector->get_expression(); @@ -187,6 +188,31 @@ protected: flat_expression->field_list(field_name, field_list, insertable, updatable, is_primary_key); } } + + if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) + { + field_list.clear(); + } + } + + template + void field_model(const wchar_t * field_name, ModelClass & field_model, bool insertable = true, bool updatable = true, bool is_primary_key = false) + { + // IMPLEMENTME what about db? + if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING && flat_connector ) + { + FlatExpression * flat_expression = flat_connector->get_expression(); + + if( flat_expression && !is_empty_field(field_name) ) + { + flat_expression->field_model(field_name, field_model, insertable, updatable, is_primary_key); + } + } + + if( model_connector_mode == MORM_MODEL_CONNECTOR_MODE_CLEARING_VALUE ) + { + field_model.clear(); + } } template