serialize a model to flat string even when a DO_NOTHING_ON_SAVE flag is set
while here: - add FT::serialize_to_null_if_null and FT::do_not_serialize_if_null flags
This commit is contained in:
@@ -75,6 +75,7 @@ public:
|
||||
virtual void clear();
|
||||
|
||||
virtual void generate_from_model(pt::TextStream & stream, Model & model);
|
||||
virtual void generate_from_model(pt::TextStream & stream, Model & model, const FT & field_type);
|
||||
|
||||
virtual pt::TextStream * get_current_stream();
|
||||
|
||||
@@ -232,7 +233,7 @@ public:
|
||||
{
|
||||
put_field_name_and_table_if_needed(field_name, field_type, model_env);
|
||||
put_name_value_separator();
|
||||
put_field_value_list(field_value, model_container_type, model_connector, model_env, foo);
|
||||
put_field_value_list(field_value, model_container_type, field_type, model_connector, model_env, foo);
|
||||
}
|
||||
else
|
||||
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES_FIELDS )
|
||||
@@ -240,7 +241,7 @@ public:
|
||||
(*out_stream) << '\n';
|
||||
put_field_name_and_table_if_needed(field_name, field_type, model_env);
|
||||
put_name_value_separator();
|
||||
put_field_value_list(field_value, model_container_type, model_connector, model_env, foo);
|
||||
put_field_value_list(field_value, model_container_type, field_type, model_connector, model_env, foo);
|
||||
put_name_value_separator();
|
||||
/*
|
||||
* IMPROVEME currently only used in XML serializer so we put / directly here
|
||||
@@ -267,7 +268,7 @@ public:
|
||||
template<typename ModelClass>
|
||||
void field_model(const wchar_t * field_name, ModelClass & field_model, const FT & field_type, ModelEnv * model_env)
|
||||
{
|
||||
if( out_stream && can_field_be_generated(field_type) )
|
||||
if( out_stream && can_field_be_generated(field_type) && can_field_model_be_generated(field_model.get_has_primary_key_set(), field_type) )
|
||||
{
|
||||
field_before();
|
||||
|
||||
@@ -278,14 +279,14 @@ public:
|
||||
else
|
||||
if( work_mode == MORM_WORK_MODE_MODEL_VALUES )
|
||||
{
|
||||
generate_from_model(field_model); // is it ok as a value?
|
||||
generate_from_model(field_model, field_type); // is it ok as a value?
|
||||
}
|
||||
else
|
||||
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES )
|
||||
{
|
||||
put_field_name_and_table_if_needed(field_name, field_type, model_env);
|
||||
put_name_value_separator();
|
||||
generate_from_model(field_model);
|
||||
generate_from_model(field_model, field_type);
|
||||
}
|
||||
else
|
||||
if( work_mode == MORM_WORK_MODE_MODEL_FIELDS_VALUES_FIELDS )
|
||||
@@ -293,7 +294,7 @@ public:
|
||||
(*out_stream) << '\n';
|
||||
put_field_name_and_table_if_needed(field_name, field_type, model_env);
|
||||
put_name_value_separator();
|
||||
generate_from_model(field_model);
|
||||
generate_from_model(field_model, field_type);
|
||||
put_name_value_separator();
|
||||
/*
|
||||
* IMPROVEME currently only used in XML serializer so we put / directly here
|
||||
@@ -450,11 +451,15 @@ protected:
|
||||
pt::TextStream scratch_buffer_local;
|
||||
pt::TextStream * scratch_buffer;
|
||||
|
||||
virtual void generate_from_model(Model & model);
|
||||
virtual void generate_from_model(Model & model, const FT & field_type);
|
||||
|
||||
virtual void before_generate_from_model();
|
||||
virtual void after_generate_from_model();
|
||||
|
||||
virtual bool can_field_be_generated(const FT &);
|
||||
virtual bool can_field_model_be_generated(bool has_model_primary_key, const FT & field_type);
|
||||
virtual bool should_field_model_be_generated_as_null(bool has_model_primary_key, const FT & field_type);
|
||||
|
||||
virtual void field_before();
|
||||
virtual void field_after();
|
||||
|
||||
@@ -527,18 +532,18 @@ protected:
|
||||
|
||||
|
||||
template<typename ModelContainer, typename ModelContainerType, typename IsContainerByValueRenameMe>
|
||||
void put_field_value_list(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector,
|
||||
ModelEnv * model_env, IsContainerByValueRenameMe * foo)
|
||||
void put_field_value_list(ModelContainer & field_value, ModelContainerType * model_container_type, const FT & field_type,
|
||||
ModelConnector * model_connector, ModelEnv * model_env, IsContainerByValueRenameMe * foo)
|
||||
{
|
||||
if constexpr (std::is_base_of<Model, ModelContainerType>())
|
||||
{
|
||||
if constexpr (std::is_base_of<Model, IsContainerByValueRenameMe>())
|
||||
{
|
||||
put_field_value_list_model_by_value(field_value, model_container_type, model_connector, model_env);
|
||||
put_field_value_list_model_by_value(field_value, model_container_type, field_type, model_connector, model_env);
|
||||
}
|
||||
else
|
||||
{
|
||||
put_field_value_list_model_by_pointer(field_value, model_container_type, model_connector, model_env);
|
||||
put_field_value_list_model_by_pointer(field_value, model_container_type, field_type, model_connector, model_env);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -549,8 +554,8 @@ protected:
|
||||
|
||||
|
||||
template<typename ModelContainer, typename ModelContainerType>
|
||||
void put_field_value_list_model_by_value(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector,
|
||||
ModelEnv * model_env)
|
||||
void put_field_value_list_model_by_value(ModelContainer & field_value, ModelContainerType * model_container_type, const FT & field_type,
|
||||
ModelConnector * model_connector, ModelEnv * model_env)
|
||||
{
|
||||
if( model_connector && model_env && out_stream )
|
||||
{
|
||||
@@ -559,13 +564,16 @@ protected:
|
||||
|
||||
for(auto & child_model_item : field_value)
|
||||
{
|
||||
if( !is_first )
|
||||
if( can_field_model_be_generated(child_model_item.get_has_primary_key_set(), field_type) )
|
||||
{
|
||||
field_value_list_separator();
|
||||
}
|
||||
if( !is_first )
|
||||
{
|
||||
field_value_list_separator();
|
||||
}
|
||||
|
||||
put_field_value_list_model(child_model_item, model_connector, model_env);
|
||||
is_first = false;
|
||||
put_field_value_list_model(child_model_item, model_connector, model_env);
|
||||
is_first = false;
|
||||
}
|
||||
}
|
||||
|
||||
after_field_value_list();
|
||||
@@ -574,8 +582,8 @@ protected:
|
||||
|
||||
|
||||
template<typename ModelContainer, typename ModelContainerType>
|
||||
void put_field_value_list_model_by_pointer(ModelContainer & field_value, ModelContainerType * model_container_type, ModelConnector * model_connector,
|
||||
ModelEnv * model_env)
|
||||
void put_field_value_list_model_by_pointer(ModelContainer & field_value, ModelContainerType * model_container_type, const FT & field_type,
|
||||
ModelConnector * model_connector, ModelEnv * model_env)
|
||||
{
|
||||
if( model_connector && model_env && out_stream )
|
||||
{
|
||||
@@ -584,13 +592,16 @@ protected:
|
||||
|
||||
for(auto * child_model_item : field_value)
|
||||
{
|
||||
if( !is_first )
|
||||
if( can_field_model_be_generated(child_model_item->get_has_primary_key_set(), field_type) )
|
||||
{
|
||||
field_value_list_separator();
|
||||
}
|
||||
if( !is_first )
|
||||
{
|
||||
field_value_list_separator();
|
||||
}
|
||||
|
||||
put_field_value_list_model(*child_model_item, model_connector, model_env);
|
||||
is_first = false;
|
||||
put_field_value_list_model(*child_model_item, model_connector, model_env);
|
||||
is_first = false;
|
||||
}
|
||||
}
|
||||
|
||||
after_field_value_list();
|
||||
@@ -607,7 +618,8 @@ protected:
|
||||
child_model.model_env->model = &child_model;
|
||||
child_model.set_connector(model_connector);
|
||||
|
||||
generate_from_model(child_model);
|
||||
FT field_type = FT::default_type;
|
||||
generate_from_model(child_model, field_type);
|
||||
|
||||
child_model.model_env = nullptr;
|
||||
}
|
||||
|
Reference in New Issue
Block a user