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:
122
src/model.cpp
122
src/model.cpp
@@ -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);
|
||||
|
Reference in New Issue
Block a user