diff options
author | Marco Bubke <marco.bubke@qt.io> | 2021-02-10 15:52:58 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2021-02-15 10:39:45 +0000 |
commit | e3d12e659aa0779cb3cca3b8988abaedb3249748 (patch) | |
tree | 6b136d714538e327479e7301f03fca3ae42627ba /src/libs/sqlite/sqlitebasestatement.h | |
parent | 18fe4233f8a5dedb3740d59af73ae6f312c591a9 (diff) |
Sqlite: Add readTo method
There are cases when you want to read to an already existing container.
This will prepare for the RETURNING extension in the next Sqlite version
where you can write and read. That will simplify quite some code.
Change-Id: I740ffbedecf72bb5518392f3707a0a6b2221db56
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Diffstat (limited to 'src/libs/sqlite/sqlitebasestatement.h')
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 3b68d8a3fc6..01ae9161318 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -336,6 +336,21 @@ public: resetter.reset(); } + template<int ResultTypeCount = 1, typename Container, typename... QueryTypes> + void readTo(Container &container, const QueryTypes &...queryValues) + { + BaseStatement::checkColumnCount(ResultTypeCount); + + Resetter resetter{*this}; + + bindValues(queryValues...); + + while (BaseStatement::next()) + pushBackToContainer<ResultTypeCount>(container); + + resetter.reset(); + } + protected: ~StatementImplementation() = default; @@ -430,6 +445,18 @@ private: return callCallable(callable, std::make_integer_sequence<int, ResultTypeCount>{}); } + template<typename Container, int... ColumnIndices> + void pushBackToContainer(Container &container, std::integer_sequence<int, ColumnIndices...>) + { + container.push_back(Container::value_type(ValueGetter(*this, ColumnIndices)...)); + } + + template<int ResultTypeCount, typename Container> + void pushBackToContainer(Container &container) + { + pushBackToContainer(container, std::make_integer_sequence<int, ResultTypeCount>{}); + } + template<typename ValueType> void bindValuesByIndex(int index, const ValueType &value) { |