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:
2023-02-26 18:28:16 +01:00
parent d1c86c84cf
commit 0fbd988eda
7 changed files with 114 additions and 42 deletions

View File

@@ -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;
}