add possibility of calculating how many rows there were before LIMIT was applied
The Finder has get_rows_counter() method which returns how many rows there were before LIMIT clause was applied. The select(...) method should be called with Select::with_rows_counter flag in such a case. while here: - change the semantic of Finder, now the select(...) method takes a morm::Select flags, and we have such flags: - Select::no_auto_generated_columns - do not generate columns from models - with_rows_counter - add an additional column for the rows counter - remove Finder::prepare_to_select() - now use select(...) with no_auto_generated_columns flag
This commit is contained in:
72
src/cursor.h
72
src/cursor.h
@@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2018-2021, Tomasz Sowa
|
||||
* Copyright (c) 2018-2022, Tomasz Sowa
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -64,6 +64,8 @@ public:
|
||||
use_table_prefix_for_fetching = c.use_table_prefix_for_fetching;
|
||||
query_result = c.query_result;
|
||||
select_status = c.select_status;
|
||||
select_flags = c.select_flags;
|
||||
rows_counter = c.rows_counter;
|
||||
|
||||
if( query_result )
|
||||
{
|
||||
@@ -106,6 +108,8 @@ public:
|
||||
finder_helper.clear();
|
||||
query_result = nullptr;
|
||||
select_status = false;
|
||||
select_flags = Select::default_type;
|
||||
rows_counter = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +149,18 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual void set_select_flags(const Select & select_flags)
|
||||
{
|
||||
this->select_flags = select_flags;
|
||||
}
|
||||
|
||||
|
||||
virtual void set_rows_counter_column_name(const std::wstring & column_name)
|
||||
{
|
||||
this->rows_counter_column_name = column_name;
|
||||
}
|
||||
|
||||
|
||||
virtual QueryResult * get_query_result()
|
||||
{
|
||||
return query_result;
|
||||
@@ -164,6 +180,23 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual void prepare_model_env_for_new_object(ModelEnv & model_env)
|
||||
{
|
||||
model_env.cursor_helper = &cursor_helper;
|
||||
model_env.finder_helper = &finder_helper;
|
||||
model_env.select_flags = select_flags;
|
||||
model_env.rows_counter = 0;
|
||||
|
||||
if( model_env.select_flags.is_with_rows_counter() )
|
||||
{
|
||||
if( cursor_helper.current_row == 0 )
|
||||
{
|
||||
model_env.rows_counter_column_name = rows_counter_column_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual bool get(ModelClass & result)
|
||||
{
|
||||
bool res = false;
|
||||
@@ -177,20 +210,21 @@ public:
|
||||
|
||||
if( db_connector )
|
||||
{
|
||||
ModelEnv model_env_local;
|
||||
result.model_env = &model_env_local;
|
||||
result.model_env->cursor_helper = &cursor_helper;
|
||||
result.model_env->finder_helper = &finder_helper;
|
||||
result.model_env->model = &result;
|
||||
|
||||
try
|
||||
{
|
||||
ModelEnv model_env_local;
|
||||
result.model_env = &model_env_local;
|
||||
result.model_env->model = &result;
|
||||
result.model_env->model_data = model_data;
|
||||
|
||||
finder_helper.clear(); // at the moment used only for calculating table prefixes (indices)
|
||||
cursor_helper.clear();
|
||||
cursor_helper.query_result = query_result;
|
||||
cursor_helper.has_autogenerated_select = has_autogenerated_select;
|
||||
cursor_helper.use_table_prefix_for_fetching_values = use_table_prefix_for_fetching;
|
||||
result.model_env->model_data = model_data;
|
||||
cursor_helper.current_row = 0;
|
||||
|
||||
prepare_model_env_for_new_object(model_env_local);
|
||||
|
||||
if( !cursor_helper.has_autogenerated_select && cursor_helper.use_table_prefix_for_fetching_values )
|
||||
{
|
||||
@@ -205,6 +239,7 @@ public:
|
||||
if( query_result->cur_row < query_result->result_rows )
|
||||
{
|
||||
result.map_values_from_query();
|
||||
rows_counter = model_env_local.rows_counter;
|
||||
|
||||
if( result.found() )
|
||||
{
|
||||
@@ -273,6 +308,7 @@ public:
|
||||
return get_list_generic(result, clear_list);
|
||||
}
|
||||
|
||||
|
||||
virtual std::vector<ModelClass> get_vector()
|
||||
{
|
||||
std::vector<ModelClass> result;
|
||||
@@ -282,6 +318,12 @@ public:
|
||||
}
|
||||
|
||||
|
||||
virtual size_t get_rows_counter()
|
||||
{
|
||||
return rows_counter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
@@ -293,6 +335,9 @@ protected:
|
||||
FinderHelper finder_helper; // may CursorHelper and FinderHelper should be one class?
|
||||
QueryResult * query_result;
|
||||
bool select_status;
|
||||
Select select_flags;
|
||||
size_t rows_counter;
|
||||
std::wstring rows_counter_column_name;
|
||||
|
||||
|
||||
|
||||
@@ -359,15 +404,15 @@ protected:
|
||||
cursor_helper.query_result = query_result;
|
||||
cursor_helper.has_autogenerated_select = has_autogenerated_select;
|
||||
cursor_helper.use_table_prefix_for_fetching_values = use_table_prefix_for_fetching;
|
||||
cursor_helper.current_row = query_result->cur_row;
|
||||
|
||||
added_model.set_connector(model_connector);
|
||||
added_model.clear();
|
||||
|
||||
prepare_model_env_for_new_object(model_env_local);
|
||||
added_model.model_env = &model_env_local;
|
||||
added_model.model_env->cursor_helper = &cursor_helper;
|
||||
added_model.model_env->finder_helper = &finder_helper;
|
||||
added_model.model_env->model_data = model_data;
|
||||
added_model.model_env->model = &added_model;
|
||||
added_model.model_env->model_data = model_data;
|
||||
|
||||
if( !cursor_helper.has_autogenerated_select && cursor_helper.use_table_prefix_for_fetching_values )
|
||||
{
|
||||
@@ -377,6 +422,11 @@ protected:
|
||||
added_model.before_select();
|
||||
added_model.map_values_from_query();
|
||||
|
||||
if( model_env_local.select_flags.is_with_rows_counter() && query_result->cur_row == 0 )
|
||||
{
|
||||
rows_counter = model_env_local.rows_counter;
|
||||
}
|
||||
|
||||
if( added_model.found() )
|
||||
{
|
||||
added_model.after_select();
|
||||
|
Reference in New Issue
Block a user