changed the way how we get a specific field value - now we do not use expressions (BaseExpression), to get the raw value we don't need an expression object:

- removed MORM_WORK_MODE_GET_SPECIFIC_FIELD_VALUE from expression work mode
- removed: void BaseExpression::field(const wchar_t * field_name, void (Model::*getter_method)(pt::TextStream &), const FT & field_type, ModelEnv * model_env)
- removed from BaseExpression: template<typename FunInfoStreamType> void field(const wchar_t * field_name, void (Model::*fun)(Ezc::FunInfo<FunInfoStreamType> &), const FT & field_type, ModelEnv * model_env)
- removed: void FlatConnector::to_text(const wchar_t * flat_field_name, pt::TextStream & stream, Model & model)
- renamed/changed: Model::put_field_value(...) -> Model::get_raw_value()

added classes:
class ModelWrapper - base wrapper class for a model or a model container
class ModelWrapperModel : public ModelWrapper - wrapper for a model
template<typename VectorType> class ModelWrapperVector : public ModelWrapper - wrapper for vector of models
template<typename ListType> class ModelWrapperList : public ModelWrapper - wrapper for list of models
ModelWrapper... classes are used by ezc library for iterating through child models and for iterating in [for...] statements

added to Model:
Model * get_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool put_log_if_not_found = true);
ModelWrapper * get_model_wrapper(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool put_log_if_not_found = true);
This commit is contained in:
2021-06-16 14:01:07 +02:00
parent dd01fafa40
commit aeb02f82b1
11 changed files with 567 additions and 256 deletions

View File

@@ -240,11 +240,12 @@ void Model::get_table_name(std::string & str, bool with_schema_name, ModelData *
}
Model * Model::get_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name)
Model * Model::get_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool put_log_if_not_found)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_GET_FIELD_MODEL;
model_env->db_field_name = db_field_name;
model_env->flat_field_name = flat_field_name;
model_env->model = this;
Model * model = nullptr;
@@ -260,7 +261,7 @@ Model * Model::get_field_model(const wchar_t * db_field_name, const wchar_t * fl
throw;
}
if( !model_env->model && model_connector )
if( !model_env->model && model_connector && put_log_if_not_found )
{
pt::Log * plog = model_connector->get_logger();
@@ -277,13 +278,52 @@ Model * Model::get_field_model(const wchar_t * db_field_name, const wchar_t * fl
}
void Model::put_field_value(const wchar_t * flat_field_name, pt::TextStream & stream, bool clear_stream)
ModelWrapper * Model::get_model_wrapper(const wchar_t * db_field_name, const wchar_t * flat_field_name, bool put_log_if_not_found)
{
put_field_value(flat_field_name, nullptr, stream, clear_stream);
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_GET_MODEL_WRAPPER;
model_env->db_field_name = db_field_name;
model_env->flat_field_name = flat_field_name;
model_env->model = this;
ModelWrapper * models_base = nullptr;
try
{
fields();
models_base = model_env->model_wrapper;
}
catch(...)
{
model_env = nullptr;
throw;
}
if( !model_env->model_wrapper && model_connector && put_log_if_not_found )
{
pt::Log * plog = model_connector->get_logger();
if( plog )
{
(*plog) << pt::Log::log1 << "Morm: I cannot find such a property: ";
put_fields_to_log(*plog, db_field_name, flat_field_name);
(*plog) << pt::Log::logend;
}
}
model_env = nullptr;
return models_base;
}
void Model::put_field_value(const wchar_t * flat_field_name, ModelData * model_data, pt::TextStream & stream, bool clear_stream)
void Model::get_raw_value(const wchar_t * db_field_name, const wchar_t * flat_field_name, pt::TextStream & stream, bool clear_stream, bool put_log_if_not_found)
{
get_raw_value(db_field_name, flat_field_name, nullptr, stream, clear_stream, put_log_if_not_found);
}
void Model::get_raw_value(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelData * model_data, pt::TextStream & stream, bool clear_stream, bool put_log_if_not_found)
{
if( clear_stream )
{
@@ -293,25 +333,32 @@ void Model::put_field_value(const wchar_t * flat_field_name, ModelData * model_d
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->has_primary_key_set = has_primary_key_set;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_PUT_FIELD_RAW_VALUE_TO_STREAM;
model_env->db_field_name = db_field_name;
model_env->flat_field_name = flat_field_name;
model_env->model_data = model_data;
model_env->stream = &stream;
model_env->model = this;
if( model_connector )
try
{
FlatConnector * flat_connector = model_connector->get_flat_connector();
fields();
}
catch(...)
{
model_env = nullptr;
throw;
}
if( flat_connector )
if( !model_env->model_wrapper && model_connector && put_log_if_not_found )
{
pt::Log * plog = model_connector->get_logger();
if( plog )
{
try
{
flat_connector->to_text(flat_field_name, stream, *this);
}
catch(...)
{
model_env = nullptr;
throw;
}
(*plog) << pt::Log::log1 << "Morm: I cannot find such a property: ";
put_fields_to_log(*plog, db_field_name, flat_field_name);
(*plog) << pt::Log::logend;
}
}
@@ -1470,6 +1517,7 @@ void Model::field_model_clear_values(Model & field_model)
}
void Model::field_model_read_values_from_queryresult(const wchar_t * db_field_name, Model & field_model, const FT & field_type)
{
DbConnector * db_connector = model_connector->get_db_connector();
@@ -1548,9 +1596,21 @@ 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_GET_FIELD_MODEL )
{
//if( pt::is_equal(db_field_name, model_env->db_field_model) && pt::is_equal(flat_field_name, model_env->flat_field_name) )
if( flat_field_name && model_env->flat_field_name && pt::is_equal(flat_field_name, model_env->flat_field_name) )
if( is_the_same_field(db_field_name, model_env->db_field_name) &&
is_the_same_field(flat_field_name, model_env->flat_field_name) )
{
model_env->child_model = &field_model;
}
}
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_wrapper )
{
model_env->model_wrapper = new ModelWrapperModel(&field_model);
}
}
field_model.model_env = nullptr;
@@ -1769,6 +1829,23 @@ void Model::field_member_read_value_from_db_resultset(
}
void Model::field_member_put_field_raw_value_to_stream(
const wchar_t * db_field_name,
const wchar_t * flat_field_name,
void (Model::*getter_method)(pt::TextStream &),
const FT & field_type)
{
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)) )
{
if( model_env->stream )
{
(model_env->model->*getter_method)(*model_env->stream);
}
}
}
void Model::field_member_clear_value(
void (Model::*setter_method)(const char * input_str),
const FT & field_type)
@@ -1817,6 +1894,11 @@ void Model::field_member(
field_member_read_value_from_db_resultset(db_field_name, setter_method, field_type);
}
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_PUT_FIELD_RAW_VALUE_TO_STREAM )
{
field_member_put_field_raw_value_to_stream(db_field_name, flat_field_name, getter_method, field_type);
}
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_CLEARING_VALUE )
{
field_member_clear_value(setter_method, field_type);