Hyper API for C++ 0.0.24081
Hyper client library for C++ applications
Loading...
Searching...
No Matches
Result.hpp
Go to the documentation of this file.
1
5#ifndef TABLEAU_HYPER_RESULT_HPP
6#define TABLEAU_HYPER_RESULT_HPP
7
8#include <hyperapi/Date.hpp>
11#include <hyperapi/hyperapi.h>
12
13#include <functional>
14#include <iterator>
15#include <string>
16
17namespace hyperapi {
18
19class ChunkIterator;
20struct Chunks;
21class ColumnIterator;
22class Connection;
23class Result;
24class Row;
25class ChunkedResultIterator;
26class ResultIterator;
27namespace internal {
28inline bool hasCopyData(Result& result);
29struct CopyData;
30inline CopyData getCopyData(Result& result);
31inline hyper_rowset_type_t getResultType(Result& result);
32}
33
37class Value final {
38 public:
40 Value(hyper_value_t value, SqlType type, string_view columnName) noexcept
41 : value_(value), type_(type), columnName_(columnName) {
42 }
43
45 Value() noexcept {}
46
51 template <typename ReturnType>
52 operator ReturnType() const { return get<ReturnType>(); }
53
81 template <typename ReturnType>
82 ReturnType get() const;
83
85 SqlType getType() const noexcept { return type_; }
86
88 bool isNull() const noexcept { return !value_.value; }
89
91 friend std::ostream& operator<<(std::ostream& os, const Value& value);
92
94 friend bool operator==(const Value& lhs, const Value& rhs) noexcept { return lhs.value_.value == rhs.value_.value; }
95
97 friend bool operator!=(const Value& lhs, const Value& rhs) noexcept { return !(lhs == rhs); }
98
99 private:
100 friend class ColumnIterator;
101 template <typename ReturnType>
102 friend struct internal::ValueAccess;
103 friend class Connection;
104
106 Value(const Value&) = default;
107 Value(Value&&) = default;
108 Value& operator=(const Value&) = default;
109 Value& operator=(Value&&) = default;
110
112 hyper_value_t value_{nullptr, 0};
114 SqlType type_{TypeTag::Unsupported, 0};
116 string_view columnName_ = "";
117};
118
122class Chunk final {
123 public:
127 Chunk() noexcept = default;
128
130 ~Chunk() noexcept;
131
133 Chunk(Chunk& other) = delete;
135 Chunk& operator=(Chunk& other) = delete;
136
138 Chunk(Chunk&& other) noexcept;
140 Chunk& operator=(Chunk&& other) noexcept;
141
148 Row getRowAt(hyper_row_index_t chunkRowIndex) const noexcept;
149
154 size_t getRowCount() const noexcept { return rowCount_; }
155
157 bool isOpen() const noexcept { return (chunk_ != nullptr); }
158
160 operator bool() const noexcept { return isOpen(); }
161
163 friend bool operator==(const Chunk& lhs, const Chunk& rhs) noexcept { return lhs.chunk_ == rhs.chunk_; }
164
166 friend bool operator!=(const Chunk& lhs, const Chunk& rhs) noexcept { return !(lhs == rhs); }
167
168 private:
174 Chunk(hyper_rowset_chunk_t* chunk, const Result& result) noexcept;
175
177 hyper_rowset_chunk_t* chunk_ = nullptr;
179 mutable const uint8_t* const* values_ = nullptr;
181 mutable const size_t* valuesSizes_ = nullptr;
183 size_t chunkSize_ = 0;
185 const Result* result_ = nullptr;
187 size_t rowCount_ = 0;
188
190 const uint8_t* const* getValues() const noexcept;
192 const size_t* getValuesSizes() const noexcept;
193
194 friend class Row;
195 friend class ColumnIterator;
196 friend class Result;
197};
198
203class Row final {
204 public:
215 template <typename ReturnType = Value>
216 ReturnType get(hyper_field_index_t columnIndex) const;
217
223 const ResultSchema& getSchema() const noexcept;
224
225 private:
231 Row(const Chunk& chunk, hyper_row_index_t chunkRowIndex) noexcept;
232
234 Row(const Row&) = default;
235 Row(Row&&) = default;
236 Row& operator=(const Row&) = default;
237 Row& operator=(Row&&) = default;
238
240 std::reference_wrapper<const Chunk> chunk_;
242 hyper_row_index_t chunkRowIndex_;
243
244 friend class Chunk;
245 friend class ResultIterator;
246 friend class ColumnIterator;
247 friend class ChunkIterator;
248};
249
252};
253static constexpr IteratorBeginTag iteratorBeginTag = {};
254
257};
258static constexpr IteratorEndTag iteratorEndTag = {};
259
261class ChunkIterator final {
262 public:
263 using iterator_category = std::input_iterator_tag;
264 using value_type = Row;
265 using difference_type = std::ptrdiff_t;
266 using pointer = const Row*;
267 using reference = const Row&;
268
270 ChunkIterator(const Chunk& chunk, IteratorBeginTag) noexcept
271 : chunk_(chunk), rowIndex_(0), currentRow_(chunk, 0) {
272 }
273
275 ChunkIterator(const Chunk& chunk, IteratorEndTag) noexcept
276 : chunk_(chunk), rowIndex_(static_cast<hyper_row_index_t>(chunk.getRowCount())), currentRow_(chunk, 0) {
277 }
278
280 reference operator*() const noexcept;
281
283 pointer operator->() const noexcept { return &**this; }
284
287
289 ChunkIterator operator++(int) noexcept;
290
292 friend bool operator==(const ChunkIterator& lhs, const ChunkIterator& rhs) noexcept { return (lhs.chunk_.get() == rhs.chunk_.get()) && (lhs.rowIndex_ == rhs.rowIndex_); }
293
295 friend bool operator!=(const ChunkIterator& lhs, const ChunkIterator& rhs) noexcept { return !(lhs == rhs); }
296
297 private:
298 std::reference_wrapper<const Chunk> chunk_;
299 hyper_row_index_t rowIndex_;
300 mutable Row currentRow_;
301
302 friend class ResultIterator;
303};
304
306inline ChunkIterator begin(const Chunk& chunk) {
307 return {chunk, iteratorBeginTag};
308}
309
311inline ChunkIterator end(const Chunk& chunk) noexcept {
312 return {chunk, iteratorEndTag};
313}
314
319class Result final {
320 public:
326 Result() : currentChunkIterator_(end(currentChunk_)) {}
327
328 ~Result() noexcept;
329
331 Result(Result&& other) noexcept;
332
334 Result& operator=(Result&& other) noexcept;
335
337 Result& operator=(const Result& other) = delete;
338 Result(const Result& other) = delete;
339
344 const ResultSchema& getSchema() const noexcept { return *schema_; }
345
354
361
366 bool isOpen() const noexcept;
367
372 void close() noexcept;
373
374 private:
385 explicit Result(hyper_rowset_t* rowset, Connection& conn);
386
388 void fetchNextChunk();
389
391 Chunk& getCurrentChunk();
392
394 ChunkIterator& getCurrentChunkIterator();
395
397 void createSchema();
398
400 hyper_rowset_t* rowset_ = nullptr;
401
403 Connection* conn_ = nullptr;
404
406 mutable optional<ResultSchema> schema_;
407
409 Chunk currentChunk_;
411 ChunkIterator currentChunkIterator_;
412
413 friend class Row;
414 friend class Connection;
415 friend class Chunk;
416 friend class ChunkedResultIterator;
417 friend class ResultIterator;
418 friend Result internal::executePreparedQuery(Connection& connection, const std::string& statement_name, hyper_rowset_result_format_t result_format);
419 friend Result internal::executeQueryParams(Connection& connection, const std::string& query, hyper_rowset_result_format_t result_format);
420 friend bool operator==(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept;
421 friend bool operator==(const ResultIterator& lhs, const ResultIterator& rhs) noexcept;
422 friend inline bool internal::hasCopyData(Result&);
423 friend inline internal::CopyData internal::getCopyData(Result& result);
424 friend inline hyper_rowset_type_t internal::getResultType(Result& result);
425};
426
428struct Chunks {
430 Chunks(Result& result) : result(result) {
431 }
432
435};
436
438class ColumnIterator final {
439 public:
440 using iterator_category = std::input_iterator_tag;
441 using value_type = Value;
442 using difference_type = std::ptrdiff_t;
443 using pointer = const Value*;
444 using reference = const Value&;
445
447 ColumnIterator(const Row& row, IteratorBeginTag) noexcept
448 : row_(row), columnIndex_(0) {
449 }
450
452 ColumnIterator(const Row& row, IteratorEndTag) noexcept
453 : row_(row), columnIndex_(static_cast<hyper_field_index_t>(row.getSchema().getColumnCount())) {
454 }
455
457 reference operator*() const noexcept;
458
460 pointer operator->() const noexcept { return &**this; }
461
464
467
469 friend bool operator==(const ColumnIterator& lhs, const ColumnIterator& rhs) noexcept { return (&lhs.row_.get() == &rhs.row_.get()) && (lhs.columnIndex_ == rhs.columnIndex_); }
470
472 friend bool operator!=(const ColumnIterator& lhs, const ColumnIterator& rhs) noexcept { return !(lhs == rhs); }
473
474 private:
475 std::reference_wrapper<const Row> row_;
476 hyper_field_index_t columnIndex_;
477 mutable Value currentValue_;
478};
479
481inline ColumnIterator begin(const Row& row) {
482 return {row, iteratorBeginTag};
483}
484
486inline ColumnIterator end(const Row& row) noexcept {
487 return {row, iteratorEndTag};
488}
489
492 public:
493 using iterator_category = std::input_iterator_tag;
494 using value_type = Chunk;
495 using difference_type = std::ptrdiff_t;
496 using pointer = Chunk*;
497 using reference = Chunk&;
498
503 : result_(result), isEndIterator_(true) {
504 }
505
507 reference operator*() noexcept { return result_.get().currentChunk_; }
508
510 pointer operator->() noexcept { return &**this; }
511
514
516 friend bool operator==(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept;
517
519 friend bool operator!=(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept { return !(lhs == rhs); }
520
521 private:
523 std::reference_wrapper<Result> result_;
525 bool isEndIterator_;
526};
527
529inline ChunkedResultIterator begin(const Chunks& chunks) {
530 return {chunks.result, iteratorBeginTag};
531}
532
534inline ChunkedResultIterator end(const Chunks& chunks) noexcept {
535 return {chunks.result, iteratorEndTag};
536}
537
544class ResultIterator final {
545 public:
546 using iterator_category = std::input_iterator_tag;
547 using value_type = Row;
548 using difference_type = std::ptrdiff_t;
549 using pointer = const Row*;
550 using reference = const Row&;
551
556 : result_(result), isEndIterator_(true) {
557 }
558
560 reference operator*() const noexcept { return *result_.get().getCurrentChunkIterator(); }
561
563 pointer operator->() const noexcept { return &**this; }
564
567
569 friend bool operator==(const ResultIterator& lhs, const ResultIterator& rhs) noexcept;
570
572 friend bool operator!=(const ResultIterator& lhs, const ResultIterator& rhs) noexcept { return !(lhs == rhs); }
573
574 private:
576 std::reference_wrapper<Result> result_;
578 bool isEndIterator_;
579};
580
582inline ResultIterator begin(Result& result) {
583 return {result, iteratorBeginTag};
584}
585
587inline ResultIterator end(Result& result) noexcept {
588 return {result, iteratorEndTag};
589}
590}
591
592#include <hyperapi/impl/Result.impl.hpp>
593
594#endif
Iterates over a hyperapi::Chunk in rows (hyperapi::Row).
Definition Result.hpp:261
friend bool operator!=(const ChunkIterator &lhs, const ChunkIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:295
ChunkIterator & operator++() noexcept
Advances the iterator.
ChunkIterator(const Chunk &chunk, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:275
reference operator*() const noexcept
Returns a reference to the current value.
ChunkIterator(const Chunk &chunk, IteratorBeginTag) noexcept
Constructs the begin-iterator.
Definition Result.hpp:270
A chunk of a result.
Definition Result.hpp:122
friend bool operator==(const Chunk &lhs, const Chunk &rhs) noexcept
Comparison operator.
Definition Result.hpp:163
bool isOpen() const noexcept
Returns whether the chunk is valid.
Definition Result.hpp:157
Row getRowAt(hyper_row_index_t chunkRowIndex) const noexcept
Retrieves the row at the given index inside the chunk (starting at 0).
size_t getRowCount() const noexcept
Definition Result.hpp:154
Chunk() noexcept=default
Constructor, constructs a closed chunk.
friend bool operator!=(const Chunk &lhs, const Chunk &rhs) noexcept
Comparison operator.
Definition Result.hpp:166
Iterates over a hyperapi::Result in hyperapi::Chunk.
Definition Result.hpp:491
reference operator*() noexcept
Returns a reference to the current value.
Definition Result.hpp:507
friend bool operator!=(const ChunkedResultIterator &lhs, const ChunkedResultIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:519
pointer operator->() noexcept
Returns a pointer to the current value.
Definition Result.hpp:510
friend bool operator==(const ChunkedResultIterator &lhs, const ChunkedResultIterator &rhs) noexcept
Comparison operator.
ChunkedResultIterator & operator++()
Advances the iterator.
ChunkedResultIterator(Result &result, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:502
ChunkedResultIterator(Result &result, IteratorBeginTag)
Constructs the begin-iterator.
Iterates over a hyperapi::Row in values (hyperapi::Value).
Definition Result.hpp:438
reference operator*() const noexcept
Returns a reference to the current value.
ColumnIterator & operator++()
Advances the iterator.
friend bool operator==(const ColumnIterator &lhs, const ColumnIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:469
ColumnIterator operator++(int)
Advances the iterator.
friend bool operator!=(const ColumnIterator &lhs, const ColumnIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:472
ColumnIterator(const Row &row, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:452
ColumnIterator(const Row &row, IteratorBeginTag) noexcept
Constructs the begin-iterator.
Definition Result.hpp:447
Defines a Hyper connection.
Iterates over a hyperapi::Result in rows (hyperapi::Row).
Definition Result.hpp:544
ResultIterator(Result &result, IteratorBeginTag)
Constructs the begin-iterator.
friend bool operator==(const ResultIterator &lhs, const ResultIterator &rhs) noexcept
Comparison operator.
friend bool operator!=(const ResultIterator &lhs, const ResultIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:572
ResultIterator(Result &result, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:555
reference operator*() const noexcept
Returns a reference to the current value.
Definition Result.hpp:560
pointer operator->() const noexcept
Returns a pointer to the current value.
Definition Result.hpp:563
ResultIterator & operator++()
Advances the iterator.
Base class for a result of a query.
Definition Result.hpp:319
Connection & getConnection()
Returns the connection of the SQL statement that yielded this result.
bool isOpen() const noexcept
Checks whether the result is open.
optional< size_t > getAffectedRowCount() const
Get the affected row count, if the statement had any.
Result()
Constructs an empty Result object.
Definition Result.hpp:326
A Row inside a chunk.
Definition Result.hpp:203
ReturnType get(hyper_field_index_t columnIndex) const
Returns the value of field at position columnIndex.
const ResultSchema & getSchema() const noexcept
Returns the schema of the row.
A Hyper SQL type.
Definition SqlType.hpp:46
A value inside a row.
Definition Result.hpp:37
Value(hyper_value_t value, SqlType type, string_view columnName) noexcept
Constructs a Value object.
Definition Result.hpp:40
Value() noexcept
Default constructs a Value object.
Definition Result.hpp:45
bool isNull() const noexcept
Returns whether the value is null.
Definition Result.hpp:88
SqlType getType() const noexcept
Get the type of the value.
Definition Result.hpp:85
ReturnType get() const
Get the value as one of the supported types.
friend std::ostream & operator<<(std::ostream &os, const Value &value)
Stream output operator.
friend bool operator==(const Value &lhs, const Value &rhs) noexcept
Comparison operator.
Definition Result.hpp:94
friend bool operator!=(const Value &lhs, const Value &rhs) noexcept
Comparison operator.
Definition Result.hpp:97
Surrogate for C++17 std::optional
Definition optional.hpp:40
Describes an object that can refer to a constant, contiguous sequence of char-like objects.
The primary namespace of the Hyper API for C++.
Definition ByteSpan.hpp:14
ChunkIterator begin(const Chunk &chunk)
Returns the begin-iterator for the rows of the given chunk.
Definition Result.hpp:306
ChunkIterator end(const Chunk &chunk) noexcept
Returns the end-iterator for the rows of the given chunk.
Definition Result.hpp:311
A tag for an iterator-begin constructor.
Definition Result.hpp:251
A tag for an iterator-end constructor.
Definition Result.hpp:256
A tag that makes a result iterable in chunks.
Definition Result.hpp:428
Result & result
the result
Definition Result.hpp:434
Chunks(Result &result)
Construct a Chunks object.
Definition Result.hpp:430