start adding support for Ezc library - Ezc::Generator is able to get variable value and call a static function

This commit is contained in:
2021-05-31 18:40:28 +02:00
parent 284cbc5c66
commit 515e806a50
8 changed files with 321 additions and 11 deletions

View File

@@ -50,6 +50,11 @@
#include "ft.h"
// use a macro
#include "funinfo.h"
////////////////////
namespace morm
{
@@ -137,7 +142,6 @@ public:
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_SET_FIELD_VALUE;
model_env->field_index = 0;
table(); // CHECK ME it is needed to set table name?
FieldValueHelper field_value_helper;
@@ -169,6 +173,86 @@ public:
}
Model * get_field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name)
{
ModelEnv model_env_local;
model_env = &model_env_local;
model_env->model_work_mode = MORM_MODEL_WORK_MODE_GET_FIELD_MODEL;
model_env->flat_field_name = flat_field_name;
Model * model = nullptr;
try
{
fields();
model = model_env->model;
}
catch(...)
{
model_env = nullptr;
throw;
}
if( !model_env->model && model_connector )
{
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 model;
}
void put_field_value(const wchar_t * flat_field_name, pt::TextStream & stream, bool clear_stream = true);
void put_field_value(const wchar_t * flat_field_name, ModelData * model_data, pt::TextStream & stream, bool clear_stream = true);
// put in macro
template<typename FunInfoStreamType>
void put_field_value(const wchar_t * flat_field_name, ModelData * model_data, Ezc::FunInfo<FunInfoStreamType> & fun_info, pt::TextStream & stream, bool clear_stream)
{
if( clear_stream )
{
stream.clear();
}
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_data = model_data;
model_env->ezc_fun_info = &fun_info;
model_env->ezc_fun_info_typeinfo = &typeid(fun_info);
if( model_connector )
{
FlatConnector * flat_connector = model_connector->get_flat_connector();
if( flat_connector )
{
try
{
flat_connector->to_text(flat_field_name, stream, *this);
}
catch(...)
{
model_env = nullptr;
throw;
}
}
}
model_env = nullptr;
}
protected:
ModelConnector * model_connector;
@@ -341,6 +425,12 @@ protected:
field_list(field_name, field_name, field_value, list_model_null_pointer, field_type);
}
template<typename FunInfoStreamType>
void field(const wchar_t * field_name, void (*fun)(Ezc::FunInfo<FunInfoStreamType> &), const FT & field_type = FT::default_type)
{
field_fun(field_name, field_name, fun, field_type);
}
/*
* field methods which take two names: db_field_name and flat_field_name
@@ -461,6 +551,11 @@ protected:
field_list(db_field_name, flat_field_name, field_value, list_model_null_pointer, field_type);
}
template<typename FunInfoStreamType>
void field(const wchar_t * db_field_name, const wchar_t * flat_field_name, void (*fun)(Ezc::FunInfo<FunInfoStreamType> &), const FT & field_type = FT::default_type)
{
field_fun(db_field_name, flat_field_name, fun, field_type);
}
protected:
@@ -528,7 +623,7 @@ protected:
template<typename FieldValue>
void field_generic_generate_flat_string(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, const FT & field_type)
void field_generic_generate_flat_string(const wchar_t * flat_field_name, FieldValue & field_value, const FT & field_type)
{
FlatConnector * flat_connector = model_connector->get_flat_connector();
@@ -618,7 +713,7 @@ protected:
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING )
{
field_generic_generate_flat_string(db_field_name, flat_field_name, field_value, field_type);
field_generic_generate_flat_string(flat_field_name, field_value, field_type);
}
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_DB_SQL )
@@ -639,6 +734,47 @@ protected:
}
template<typename FunInfoStreamType>
void field_fun(const wchar_t * db_field_name, const wchar_t * flat_field_name, void (*fun)(Ezc::FunInfo<FunInfoStreamType> &), const FT & field_type)
{
if( model_connector && model_env )
{
if( field_type.is_primary_key() )
{
model_env->was_primary_key_read = true;
}
if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_FLAT_STRING )
{
field_fun_generate_flat_string(flat_field_name, fun, field_type);
}
// if( model_env->model_work_mode == MORM_MODEL_WORK_MODE_GENERATING_DB_SQL )
// {
// field_generic_generate_db_sql(db_field_name, flat_field_name, field_value, field_type);
// }
}
}
template<typename FunInfoStreamType>
void field_fun_generate_flat_string(const wchar_t * flat_field_name, void (*fun)(Ezc::FunInfo<FunInfoStreamType> &), const FT & field_type)
{
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) )
{
flat_expression->field(flat_field_name, fun, field_type, model_env);
}
}
}
void field_model_left_join(const wchar_t * db_field_name, Model & field_model, const FT & field_type, DbExpression * db_expression);
void field_model_save_key(const wchar_t * db_field_name);
void field_model_set_parent_key_in_child(const wchar_t * db_field_name, Model & field_model);
@@ -1008,6 +1144,7 @@ protected:
template<typename ModelClass> friend class Cursor;
friend class BaseExpression;
friend class DbConnector;
friend class FlatConnector;
};