diff --git a/src/model.cpp b/src/model.cpp index 2d4e1d0..908e9ca 100644 --- a/src/model.cpp +++ b/src/model.cpp @@ -1576,6 +1576,15 @@ void Model::field_model(const wchar_t * db_field_name, const wchar_t * flat_fiel } } + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_PUT_FIELD_RAW_VALUE_TO_STREAM ) + { + if( (is_empty_field(model_env->db_field_name) || is_the_same_field(db_field_name, model_env->db_field_name)) && + (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) ) + { + model_env->model = &field_model; + } + } + field_model.model_env = nullptr; } } @@ -1888,7 +1897,7 @@ void Model::field_member( } - +/* bool Model::convert_to_bool(char v) { return v != 0; @@ -2009,7 +2018,7 @@ bool Model::convert_to_bool(const pt::Space & space) { return false; } - +*/ diff --git a/src/model.h b/src/model.h index a7fdb15..53801ef 100644 --- a/src/model.h +++ b/src/model.h @@ -112,16 +112,6 @@ typedef bool (Model::*ModelMember)() const; \ ModelMember model_member = static_cast(method); \ field_member_ezc(db_field_name, flat_field_name, model_member, field_type); \ - } \ - void field(const wchar_t * field_name, void (ClassName::*method)(morm::Wrapper &), const morm::FT & field_type = morm::FT::default_type) \ - { \ - field(field_name, field_name, method, field_type); \ - } \ - void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, void (ClassName::*method)(morm::Wrapper &), const morm::FT & field_type = morm::FT::default_type) \ - { \ - typedef void (Model::*ModelMember)(morm::Wrapper &); \ - ModelMember model_member = static_cast(method); \ - field_member_ezc(db_field_name, flat_field_name, model_member, field_type); \ } #endif @@ -273,8 +263,11 @@ public: model_env->db_field_name = db_field_name; model_env->flat_field_name = flat_field_name; model_env->model_data = model_data; + + model_env->ezc_fun_info = &fun_info; model_env->ezc_fun_info_typeinfo = &typeid(fun_info); + model_env->ezc_var_space_local = &fun_info.res.space_local; model_env->model = this; try @@ -288,6 +281,23 @@ public: throw; } + if( model_env->ezc_var_space_local && model_env->ezc_var_space_local->type != pt::Space::Type::type_null ) + { + fun_info.res.type = Ezc::Var::Type::TYPE_SPACE_LOCAL; + } + else + if( model_env->ezc_var_date ) + { + fun_info.res.type = Ezc::Var::Type::TYPE_DATE; + fun_info.res.date = model_env->ezc_var_date; + } + else + if( model_env->model ) + { + fun_info.res.type = Ezc::Var::Type::TYPE_MODEL; + fun_info.res.model = model_env->model; + } + model_env = nullptr; return model_env_local.was_field_found; } @@ -758,14 +768,10 @@ protected: { model_env->was_field_found = true; - if( model_env->stream ) + if( model_env->ezc_var_space_local ) { - (*model_env->stream) << field_value; + model_env->ezc_var_space_local->set(field_value); } - - #ifdef MORM_HAS_EZC_LIBRARY - model_env->ezc_fun_result = convert_to_bool(field_value); - #endif } } @@ -832,6 +838,20 @@ protected: } } else + if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_PUT_FIELD_RAW_VALUE_TO_STREAM ) + { + if( (is_empty_field(model_env->db_field_name) || is_the_same_field(db_field_name, model_env->db_field_name)) && + (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) ) + { + model_env->was_field_found = true; + + if( model_env->ezc_var_date ) + { + model_env->ezc_var_date = &field_value; + } + } + } + else { field_generic(db_field_name, flat_field_name, field_value, field_type); } @@ -936,7 +956,6 @@ protected: { Ezc::Env * ezc_fun_info = reinterpret_cast*>(model_env->ezc_fun_info); (model_env->model->*method)(*ezc_fun_info); - model_env->ezc_fun_result = ezc_fun_info->res; // ezc_fun_info->res is overwritten in get_raw_value() after fields() method call so we have to remember it in model_env } else { @@ -971,7 +990,12 @@ protected: (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) ) { model_env->was_field_found = true; - model_env->ezc_fun_result = (model_env->model->*method)(); + bool res = (model_env->model->*method)(); + + if( model_env->ezc_var_space_local ) + { + model_env->ezc_var_space_local->set(res); + } } } } @@ -998,33 +1022,12 @@ protected: (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) ) { model_env->was_field_found = true; - model_env->ezc_fun_result = (model_env->model->*method)(); - } - } - } - } + bool res = (model_env->model->*method)(); - - void field_member_ezc(const wchar_t * db_field_name, const wchar_t * flat_field_name, void (Model::*method)(Wrapper & wrapper), const FT & field_type) - { - if( model_connector && model_env && model_env->model ) - { - if( field_type.is_primary_key() ) - { - pt::Log * plog = model_connector->get_logger(); - - if( plog ) - { - (*plog) << pt::Log::log1 << "Morm:: an ezc method cannot be used as a primary key" << pt::Log::logend; - } - } - - if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GET_MODEL_WRAPPER ) - { - if( (is_empty_field(model_env->db_field_name) || is_the_same_field(db_field_name, model_env->db_field_name)) && - (is_empty_field(model_env->flat_field_name) || is_the_same_field(flat_field_name, model_env->flat_field_name)) ) - { - (model_env->model->*method)(model_env->wrapper); + if( model_env->ezc_var_space_local ) + { + model_env->ezc_var_space_local->set(res); + } } } } @@ -1556,29 +1559,29 @@ protected: } // those methods are used when converting fields to bool for Ezc library - virtual bool convert_to_bool(char v); - virtual bool convert_to_bool(unsigned char v); - virtual bool convert_to_bool(wchar_t v); - virtual bool convert_to_bool(const std::wstring & str); - virtual bool convert_to_bool(const wchar_t * str); - virtual bool convert_to_bool(const std::string & str); - virtual bool convert_to_bool(const char * str); - virtual bool convert_to_bool(bool v); - virtual bool convert_to_bool(short v); - virtual bool convert_to_bool(unsigned short v); - virtual bool convert_to_bool(int v); - virtual bool convert_to_bool(unsigned int v); - virtual bool convert_to_bool(long v); - virtual bool convert_to_bool(unsigned long v); - virtual bool convert_to_bool(long long v); - virtual bool convert_to_bool(unsigned long long v); - virtual bool convert_to_bool(float v); - virtual bool convert_to_bool(double v); - virtual bool convert_to_bool(long double v); - virtual bool convert_to_bool(const pt::Date & date); - virtual bool convert_to_bool(const pt::TextStream & val); - virtual bool convert_to_bool(const pt::WTextStream & val); - virtual bool convert_to_bool(const pt::Space & space); +// virtual bool convert_to_bool(char v); +// virtual bool convert_to_bool(unsigned char v); +// virtual bool convert_to_bool(wchar_t v); +// virtual bool convert_to_bool(const std::wstring & str); +// virtual bool convert_to_bool(const wchar_t * str); +// virtual bool convert_to_bool(const std::string & str); +// virtual bool convert_to_bool(const char * str); +// virtual bool convert_to_bool(bool v); +// virtual bool convert_to_bool(short v); +// virtual bool convert_to_bool(unsigned short v); +// virtual bool convert_to_bool(int v); +// virtual bool convert_to_bool(unsigned int v); +// virtual bool convert_to_bool(long v); +// virtual bool convert_to_bool(unsigned long v); +// virtual bool convert_to_bool(long long v); +// virtual bool convert_to_bool(unsigned long long v); +// virtual bool convert_to_bool(float v); +// virtual bool convert_to_bool(double v); +// virtual bool convert_to_bool(long double v); +// virtual bool convert_to_bool(const pt::Date & date); +// virtual bool convert_to_bool(const pt::TextStream & val); +// virtual bool convert_to_bool(const pt::WTextStream & val); +// virtual bool convert_to_bool(const pt::Space & space); template friend class Finder; diff --git a/src/modelenv.h b/src/modelenv.h index 2ef6462..638b92d 100644 --- a/src/modelenv.h +++ b/src/modelenv.h @@ -101,8 +101,9 @@ public: #ifdef MORM_HAS_EZC_LIBRARY void * ezc_fun_info; - bool ezc_fun_result; const std::type_info * ezc_fun_info_typeinfo; + pt::Space * ezc_var_space_local; + pt::Date * ezc_var_date; #endif ModelEnv() @@ -141,8 +142,9 @@ public: #ifdef MORM_HAS_EZC_LIBRARY ezc_fun_info = e.ezc_fun_info; - ezc_fun_result = e.ezc_fun_result; ezc_fun_info_typeinfo = e.ezc_fun_info_typeinfo; + ezc_var_space_local = e.ezc_var_space_local; + ezc_var_date = e.ezc_var_date; #endif // schema_name and table_name don't have to be copied @@ -192,8 +194,9 @@ public: #ifdef MORM_HAS_EZC_LIBRARY ezc_fun_info = nullptr; - ezc_fun_result = false; ezc_fun_info_typeinfo = nullptr; + ezc_var_space_local = nullptr; + ezc_var_date = nullptr; #endif }