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

@@ -166,7 +166,7 @@ protected:
virtual ModelData * get_model_data();
// used by Cursor
virtual void map_values_from_query();
@@ -636,7 +636,7 @@ protected:
template<typename FieldValue>
void field_generic(const wchar_t * db_field_name, const wchar_t * flat_field_name, FieldValue & field_value, bool insertable, bool updatable, bool is_primary_key)
{
if( model_connector )
if( model_connector && model_env )
{
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
{
@@ -649,7 +649,7 @@ protected:
if( flat_expression && !is_empty_field(flat_field_name) )
{
// insertable, updatable and is_primary_key are ignored here
flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data);
flat_expression->field(flat_field_name, field_value, insertable, updatable, is_primary_key, true, model_env);
}
}
}
@@ -664,12 +664,7 @@ protected:
if( db_expression && !is_empty_field(db_field_name) )
{
db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_env->model_data);
if( model_env->model_data )
{
model_env->model_data->current_column += 1;
}
db_expression->field(db_field_name, field_value, insertable, updatable, is_primary_key, true, model_env);
}
}
}
@@ -682,10 +677,10 @@ protected:
{
if( !is_empty_field(db_field_name) )
{
if( model_env->model_data && model_env->model_data->has_autogenerated_select )
if( model_env->model_data && model_env->cursor_helper && model_env->cursor_helper->has_autogenerated_select )
{
get_value_by_field_index(model_env->model_data->current_column, field_value);
model_env->model_data->current_column += 1;
get_value_by_field_index(model_env->cursor_helper->current_column, field_value);
model_env->cursor_helper->current_column += 1;
}
else
{
@@ -727,14 +722,14 @@ protected:
void field_model_left_join(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key, DbExpression * db_expression)
{
if( model_env->model_data )
if( model_env->finder_helper )
{
model_env->model_data->morm_current_max_column += 1;
model_env->model_data->morm_foreign_keys.clear();
//model_env->select_helper->morm_current_max_column += 1;
model_env->finder_helper->morm_foreign_keys.clear();
model_env->model_data->morm_finder_join_tables << "LEFT JOIN ";
field_model.table_name(model_env->model_data->morm_finder_join_tables);
model_env->model_data->morm_finder_join_tables << " AS ";
model_env->finder_helper->morm_finder_join_tables << "LEFT JOIN ";
field_model.table_name(model_env->finder_helper->morm_finder_join_tables);
model_env->finder_helper->morm_finder_join_tables << " AS ";
//////////////
@@ -749,14 +744,14 @@ protected:
PT::TextStream join_table_name;
field_model.table_name_for_join_as(join_table_name);
field_model.model_env->table_index = model_env->model_data->add_join_table(join_table_name);
field_model.model_env->table_index = model_env->finder_helper->add_join_table(join_table_name);
if( field_model.model_env->table_index > 1 )
join_table_name << field_model.model_env->table_index;
//////////
model_env->model_data->morm_finder_join_tables << join_table_name;
model_env->finder_helper->morm_finder_join_tables << join_table_name;
int expr_work_mode = db_expression->get_work_mode();
int expr_output_type = db_expression->get_output_type();
@@ -770,29 +765,29 @@ protected:
{
field_model.map_fields();
model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape?
model_env->model_data->morm_finder_join_tables << " = " << join_table_name << '.';
model_env->finder_helper->morm_finder_join_tables << " ON " << join_table_name_this << '.' << db_field_name; // escape?
model_env->finder_helper->morm_finder_join_tables << " = " << join_table_name << '.';
if( !model_env->model_data->morm_foreign_keys.empty() )
if( !model_env->finder_helper->morm_foreign_keys.empty() )
{
model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front();
model_env->finder_helper->morm_finder_join_tables << model_env->finder_helper->morm_foreign_keys.front();
}
}
else
{
map_fields();
model_env->model_data->morm_finder_join_tables << " ON " << join_table_name_this << '.';
model_env->finder_helper->morm_finder_join_tables << " ON " << join_table_name_this << '.';
if( !model_env->model_data->morm_foreign_keys.empty() )
if( !model_env->finder_helper->morm_foreign_keys.empty() )
{
model_env->model_data->morm_finder_join_tables << model_env->model_data->morm_foreign_keys.front();
model_env->finder_helper->morm_finder_join_tables << model_env->finder_helper->morm_foreign_keys.front();
}
model_env->model_data->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name;
model_env->finder_helper->morm_finder_join_tables << " = " << (join_table_name) << '.' << db_field_name;
}
model_env->model_data->morm_finder_join_tables << ' ';
model_env->finder_helper->morm_finder_join_tables << ' ';
db_expression->set_work_mode(expr_work_mode);
db_expression->set_output_type(expr_output_type);
@@ -860,11 +855,6 @@ protected:
}
field_model.model_env->model_connector_mode = MORM_MODEL_CONNECTOR_MODE_NONE;
if( model_env->model_data )
{
model_env->model_data->current_column += 1;
}
}
}
}
@@ -920,7 +910,7 @@ protected:
void field_model(const wchar_t * db_field_name, const wchar_t * flat_field_name, Model & field_model, bool insertable, bool updatable, bool has_foreign_key)
{
if( model_connector )
if( model_connector && model_env )
{
ModelEnv model_env_local(*model_env);
field_model.model_env = &model_env_local;
@@ -959,7 +949,7 @@ protected:
template<typename ModelContainer, typename ModelContainerType>
void field_list(const wchar_t * db_field_name, const wchar_t * flat_field_name, ModelContainer & field_container, ModelContainerType * model_container_type, bool insertable, bool updatable)
{
if( model_connector )
if( model_connector && model_env )
{
if( model_env->model_connector_mode == MORM_MODEL_CONNECTOR_MODE_GENERATING_FLAT_STRING )
{
@@ -974,7 +964,7 @@ protected:
// IMPROVE ME
// what about model_data and save_mode?
// may it should be placed inside some structure?
flat_expression->field_list(flat_field_name, field_container, insertable, updatable, false, model_connector, model_env->model_connector_mode, model_env->model_data);
flat_expression->field_list(flat_field_name, field_container, insertable, updatable, false, model_connector, model_env);
}
}
}
@@ -1030,9 +1020,9 @@ protected:
template<typename FieldValue>
void get_value_by_field_index(int field_index, FieldValue & field_value)
{
if( model_env->model_data && model_env->model_data->query_result )
if( model_env->cursor_helper && model_env->cursor_helper->query_result )
{
const char * val_str = model_env->model_data->query_result->get_field_string_value(field_index);
const char * val_str = model_env->cursor_helper->query_result->get_field_string_value(field_index);
if( val_str )
{
@@ -1050,9 +1040,9 @@ protected:
template<typename FieldValue>
void get_value_by_field_name(const wchar_t * field_name, FieldValue & field_value)
{
if( model_env->model_data && model_env->model_data->query_result )
if( model_env->cursor_helper && model_env->cursor_helper->query_result )
{
const char * val_str = model_env->model_data->query_result->get_field_string_value(field_name);
const char * val_str = model_env->cursor_helper->query_result->get_field_string_value(field_name);
if( val_str )
{