From d61fc31b5cf56d4a3a1607d40a79aead9782704e Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Tue, 28 Feb 2023 09:51:05 +0100 Subject: [PATCH] allow to set a custom name for the auto generated rows counter column --- src/dbexpression.cpp | 28 +++++++++++++++++++--------- src/finder.h | 22 +++++++++++++++++++++- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/dbexpression.cpp b/src/dbexpression.cpp index c88769c..2ba5ec6 100644 --- a/src/dbexpression.cpp +++ b/src/dbexpression.cpp @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2018-2022, Tomasz Sowa + * Copyright (c) 2018-2023, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -350,19 +350,29 @@ void DbExpression::add_rows_counter_column(Model & model) { field_before(); (*out_stream) << "COUNT(*) OVER() AS "; + before_field_name(); - pt::TextStream str; - generate_rows_counter_column_name(*model.model_env, str); - - if( !model.model_env->has_autogenerated_select ) + if( model.model_env->rows_counter_column_name.empty() ) { - str.to_str(model.model_env->rows_counter_column_name); + pt::TextStream str; + generate_rows_counter_column_name(*model.model_env, str); + esc(str, *out_stream); + + /* + * for autogenerated selects we don't have to copy the rows_counter_column_name + * because a field() method will use an index instead of this name + */ + if( !model.model_env->has_autogenerated_select ) + { + str.to_str(model.model_env->rows_counter_column_name); + } + } + else + { + esc(model.model_env->rows_counter_column_name, *out_stream); } - before_field_name(); - esc(str, *out_stream); after_field_name(); - field_after(); } } diff --git a/src/finder.h b/src/finder.h index d85b737..70a6879 100644 --- a/src/finder.h +++ b/src/finder.h @@ -63,6 +63,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; } @@ -73,6 +74,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; } Finder(ModelConnector & model_connector) @@ -82,6 +84,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; set_out_stream(); } @@ -92,6 +95,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; set_out_stream(); } @@ -102,6 +106,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; } Finder(pt::TextStream & out_stream, ModelConnector * model_connector) @@ -111,6 +116,7 @@ public: db_expression = nullptr; was_query_error = false; model_data = nullptr; + rows_counter_name = nullptr; } Finder & set_connector(ModelConnector * model_connector) @@ -151,6 +157,17 @@ public: return *this; } + Finder & set_rows_counter_name(const wchar_t * rows_counter_name) + { + this->rows_counter_name = rows_counter_name; + return *this; + } + + Finder & set_rows_counter_name(const std::wstring & rows_counter_name) + { + this->rows_counter_name = &rows_counter_name; + return *this; + } bool was_error() { @@ -1228,6 +1245,9 @@ protected: model_env.finder_helper = &finder_helper; model_env.model = &model; + if( rows_counter_name ) + model_env.rows_counter_column_name = rows_counter_name; + model.model_env = &model_env; model.table(); model.model_env->add_table_name_to_finder_helper(); @@ -1340,7 +1360,7 @@ private: FinderHelper finder_helper; ModelData * model_data; bool use_table_prefix_for_fetching; - + const wchar_t * rows_counter_name; void set_db_expression()