some work in branches/join_models

- added FinderHelper class - used as a global object for the whole model tree in Finder
  (some fields moved from ModelData)
- added CursorHelper class - used as a global object for the whole model tree in Cursor
  (some fields moved from ModelData)







git-svn-id: svn://ttmath.org/publicrep/morm/branches/join_models@1192 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2019-05-21 15:51:13 +00:00
parent b37a577713
commit 958e89fb02
13 changed files with 349 additions and 238 deletions

View File

@@ -75,12 +75,13 @@ public:
virtual void allow_to_use_prefix(bool use_prefix);
// give me a better name
virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelData * model_data);
virtual void put_field_doc(Model & model, const void * field_pointer, bool insertable, bool updatable, bool is_primary_key, ModelEnv * model_env);
template<typename FieldValue>
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false, bool add_column_prefix = true, ModelData * model_data = nullptr)
void field(const wchar_t * field_name, const FieldValue & field_value, bool insertable = true, bool updatable = true, bool is_primary_key = false,
bool add_column_prefix = true, ModelEnv * model_env = nullptr)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -100,10 +101,10 @@ public:
put_field_name(field_name, add_column_prefix);
out_stream = old_out_stream;
if( model_data )
if( model_env && model_env->finder_helper )
{
model_data->morm_foreign_keys.emplace_back();
std::string & key_str = model_data->morm_foreign_keys.back();
model_env->finder_helper->morm_foreign_keys.emplace_back();
std::string & key_str = model_env->finder_helper->morm_foreign_keys.back();
str.to_string(key_str, false);
}
}
@@ -131,7 +132,7 @@ public:
void field_doc(Model & model, const wchar_t * field_name, const FieldValue & field_value,
bool insertable = true, bool updatable = true,
bool is_primary_key = false, bool add_column_prefix = true,
ModelData * model_data = nullptr)
ModelEnv * model_env = nullptr)
{
if( out_stream )
{
@@ -140,7 +141,7 @@ public:
put_field_name(field_name, add_column_prefix);
put_name_value_separator();
put_field_doc(model, reinterpret_cast<const void*>(&field_value), insertable, updatable, is_primary_key, model_data);
put_field_doc(model, reinterpret_cast<const void*>(&field_value), insertable, updatable, is_primary_key, model_env);
put_name_value_separator();
put_type(field_value, *out_stream);
@@ -181,7 +182,7 @@ public:
template<typename ModelContainer>
void field_list(const wchar_t * field_name, ModelContainer & field_value, bool insertable, bool updatable, bool is_primary_key,
ModelConnector * model_connector, int model_connector_mode, ModelData * model_data)
ModelConnector * model_connector, ModelEnv * model_env)
{
if( out_stream && can_field_be_generated(insertable, updatable, is_primary_key) )
{
@@ -196,7 +197,7 @@ public:
{
put_field_name(field_name);
put_name_value_separator();
put_field_value_list(field_value, model_connector, model_connector_mode, model_data);
put_field_value_list(field_value, model_connector, model_env);
}
field_after();
@@ -309,44 +310,50 @@ protected:
}
}
virtual void before_field_value_list()
{
}
virtual void after_field_value_list()
{
}
virtual void field_value_list_separator()
{
(*out_stream) << ",";
}
// what about lists with a pod types? e.g. list<int>
template<typename ModelContainer>
void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, int model_connector_mode, ModelData * model_data)
void put_field_value_list(ModelContainer & field_value, ModelConnector * model_connector, ModelEnv * model_env)
{
if( out_stream )
if( model_connector && model_env && out_stream )
{
(*out_stream) << "[";// make a virtual method
}
bool is_first = true;
before_field_value_list();
bool is_first = true;
for(auto & m : field_value)
{
if( out_stream )
for(auto & m : field_value)
{
if( !is_first )
{
if( out_stream )
(*out_stream) << ","; // make a virtual method
field_value_list_separator();
}
ModelEnv model_env_local;
ModelEnv model_env_local(*model_env);
m.model_env = &model_env_local;
//before_field_value(field_value);
m.set_connector(model_connector);
m.model_env->model_connector_mode = model_connector_mode;
m.model_env->model_data = model_data;
generate_from_model(m);
m.model_env = nullptr;
//after_field_value(field_value);
is_first = false;
}
}
if( out_stream )
{
(*out_stream) << "]";// make a virtual method
after_field_value_list();
}
}