diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-06-06 00:59:03 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-06-06 00:59:03 +0100 |
commit | 51ac5d2007f1caf6bc6e65b485ba896357696654 (patch) | |
tree | db0566c8ca0c1ba1131e3c22d6cb886c6eefa2fb /lib/dbRecordSet.h | |
parent | Add conversion operators to get common types from DbValues (diff) | |
download | mygrate-51ac5d2007f1caf6bc6e65b485ba896357696654.tar.bz2 mygrate-51ac5d2007f1caf6bc6e65b485ba896357696654.tar.xz mygrate-51ac5d2007f1caf6bc6e65b485ba896357696654.zip |
Add RecordSet RowView
This represents a view into a recordset by row number and provides easy
access to values in a column by index and the ability to create a new
object instance by N columns which are passed to the object's
constructor.
Diffstat (limited to 'lib/dbRecordSet.h')
-rw-r--r-- | lib/dbRecordSet.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/dbRecordSet.h b/lib/dbRecordSet.h index 9bddc01..5bd6967 100644 --- a/lib/dbRecordSet.h +++ b/lib/dbRecordSet.h @@ -5,6 +5,31 @@ #include <memory> namespace MyGrate { + class RecordSet; + + class RowView { + public: + RowView(const RecordSet * rs, std::size_t rw = 0); + + DbValue operator[](std::size_t col) const; + + template<typename S, std::size_t N, typename Indices = std::make_index_sequence<N>> + auto + create() const + { + return create<S>(Indices {}); + } + + template<typename S, std::size_t... I> auto create(std::index_sequence<I...>) const + { + return std::make_unique<S>((*this)[I]...); + } + + private: + const RecordSet * recordSet; + std::size_t row; + }; + class RecordSet { public: virtual ~RecordSet() = default; @@ -12,6 +37,7 @@ namespace MyGrate { virtual std::size_t rows() const = 0; virtual std::size_t columns() const = 0; virtual DbValue at(std::size_t, std::size_t) const = 0; + RowView operator[](std::size_t row) const; }; using RecordSetPtr = std::unique_ptr<RecordSet>; } |