Hyper API for C++ 0.0.18825
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
9#include <hyperapi/Date.hpp>
11#include <hyperapi/Interval.hpp>
12#include <hyperapi/Numeric.hpp>
15#include <hyperapi/Time.hpp>
18#include <hyperapi/hyperapi.h>
19
20#include <functional>
21#include <iterator>
22#include <string>
23
24namespace hyperapi {
25
26class ChunkIterator;
27struct Chunks;
28class ColumnIterator;
29class Connection;
30class Result;
31class Row;
32class ChunkedResultIterator;
33class ResultIterator;
34namespace internal {
35inline bool hasCopyData(Result& result);
36struct CopyData;
37inline CopyData getCopyData(Result& result);
38inline hyper_rowset_type_t getResultType(Result& result);
39}
40
44class Value final {
45 public:
47 Value(hyper_value_t value, SqlType type, string_view columnName) noexcept
48 : value_(value), type_(type), columnName_(columnName) {
49 }
50
52 Value() noexcept {}
53
58 template <typename ReturnType>
59 operator ReturnType() const { return get<ReturnType>(); }
60
87 template <typename ReturnType>
88 ReturnType get() const;
89
91 SqlType getType() const noexcept { return type_; }
92
94 bool isNull() const noexcept { return !value_.value; }
95
97 friend std::ostream& operator<<(std::ostream& os, const Value& value);
98
100 friend bool operator==(const Value& lhs, const Value& rhs) noexcept { return lhs.value_.value == rhs.value_.value; }
101
103 friend bool operator!=(const Value& lhs, const Value& rhs) noexcept { return !(lhs == rhs); }
104
105 private:
106 friend class ColumnIterator;
107 template <typename ReturnType>
108 friend struct internal::ValueAccess;
109 friend class Connection;
110
112 Value(const Value&) = default;
113 Value(Value&&) = default;
114 Value& operator=(const Value&) = default;
115 Value& operator=(Value&&) = default;
116
118 hyper_value_t value_{nullptr, 0};
120 SqlType type_{TypeTag::Unsupported, 0};
122 string_view columnName_ = "";
123};
124
128class Chunk final {
129 public:
133 Chunk() noexcept = default;
134
136 ~Chunk() noexcept;
137
139 Chunk(Chunk& other) = delete;
141 Chunk& operator=(Chunk& other) = delete;
142
144 Chunk(Chunk&& other) noexcept;
146 Chunk& operator=(Chunk&& other) noexcept;
147
154 Row getRowAt(hyper_row_index_t chunkRowIndex) const noexcept;
155
160 size_t getRowCount() const noexcept { return rowCount_; }
161
163 bool isOpen() const noexcept { return (chunk_ != nullptr); }
164
166 operator bool() const noexcept { return isOpen(); }
167
169 friend bool operator==(const Chunk& lhs, const Chunk& rhs) noexcept { return lhs.chunk_ == rhs.chunk_; }
170
172 friend bool operator!=(const Chunk& lhs, const Chunk& rhs) noexcept { return !(lhs == rhs); }
173
174 private:
180 Chunk(hyper_rowset_chunk_t* chunk, const Result& result) noexcept;
181
183 hyper_rowset_chunk_t* chunk_ = nullptr;
185 mutable const uint8_t* const* values_ = nullptr;
187 mutable const size_t* valuesSizes_ = nullptr;
189 size_t chunkSize_ = 0;
191 const Result* result_ = nullptr;
193 size_t rowCount_ = 0;
194
196 const uint8_t* const* getValues() const noexcept;
198 const size_t* getValuesSizes() const noexcept;
199
200 friend class Row;
201 friend class ColumnIterator;
202 friend class Result;
203};
204
209class Row final {
210 public:
221 template <typename ReturnType = Value>
222 ReturnType get(hyper_field_index_t columnIndex) const;
223
229 const ResultSchema& getSchema() const noexcept;
230
231 private:
237 Row(const Chunk& chunk, hyper_row_index_t chunkRowIndex) noexcept;
238
240 Row(const Row&) = default;
241 Row(Row&&) = default;
242 Row& operator=(const Row&) = default;
243 Row& operator=(Row&&) = default;
244
246 std::reference_wrapper<const Chunk> chunk_;
248 hyper_row_index_t chunkRowIndex_;
249
250 friend class Chunk;
251 friend class ResultIterator;
252 friend class ColumnIterator;
253 friend class ChunkIterator;
254};
255
258};
259static constexpr IteratorBeginTag iteratorBeginTag = {};
260
263};
264static constexpr IteratorEndTag iteratorEndTag = {};
265
267class ChunkIterator final {
268 public:
269 using iterator_category = std::input_iterator_tag;
270 using value_type = Row;
271 using difference_type = std::ptrdiff_t;
272 using pointer = const Row*;
273 using reference = const Row&;
274
276 ChunkIterator(const Chunk& chunk, IteratorBeginTag) noexcept
277 : chunk_(chunk), rowIndex_(0), currentRow_(chunk, 0) {
278 }
279
281 ChunkIterator(const Chunk& chunk, IteratorEndTag) noexcept
282 : chunk_(chunk), rowIndex_(static_cast<hyper_row_index_t>(chunk.getRowCount())), currentRow_(chunk, 0) {
283 }
284
286 reference operator*() const noexcept;
287
289 pointer operator->() const noexcept { return &**this; }
290
293
295 ChunkIterator operator++(int) noexcept;
296
298 friend bool operator==(const ChunkIterator& lhs, const ChunkIterator& rhs) noexcept { return (lhs.chunk_.get() == rhs.chunk_.get()) && (lhs.rowIndex_ == rhs.rowIndex_); }
299
301 friend bool operator!=(const ChunkIterator& lhs, const ChunkIterator& rhs) noexcept { return !(lhs == rhs); }
302
303 private:
304 std::reference_wrapper<const Chunk> chunk_;
305 hyper_row_index_t rowIndex_;
306 mutable Row currentRow_;
307
308 friend class ResultIterator;
309};
310
312inline ChunkIterator begin(const Chunk& chunk) {
313 return {chunk, iteratorBeginTag};
314}
315
317inline ChunkIterator end(const Chunk& chunk) noexcept {
318 return {chunk, iteratorEndTag};
319}
320
325class Result final {
326 public:
332 Result() : currentChunkIterator_(end(currentChunk_)) {}
333
334 ~Result() noexcept;
335
337 Result(Result&& other) noexcept;
338
340 Result& operator=(Result&& other) noexcept;
341
343 Result& operator=(const Result& other) = delete;
344 Result(const Result& other) = delete;
345
350 const ResultSchema& getSchema() const noexcept { return *schema_; }
351
360
367
372 bool isOpen() const noexcept;
373
378 void close() noexcept;
379
380 private:
391 explicit Result(hyper_rowset_t* rowset, Connection& conn);
392
394 void fetchNextChunk();
395
397 Chunk& getCurrentChunk();
398
400 ChunkIterator& getCurrentChunkIterator();
401
403 void createSchema();
404
406 hyper_rowset_t* rowset_ = nullptr;
407
409 Connection* conn_ = nullptr;
410
412 mutable optional<ResultSchema> schema_;
413
415 Chunk currentChunk_;
417 ChunkIterator currentChunkIterator_;
418
419 friend class Row;
420 friend class Connection;
421 friend class Chunk;
422 friend class ChunkedResultIterator;
423 friend class ResultIterator;
424 friend Result internal::executePreparedQuery(Connection& connection, const std::string& statement_name, hyper_rowset_result_format_t result_format);
425 friend Result internal::executeQueryParams(Connection& connection, const std::string& query, hyper_rowset_result_format_t result_format);
426 friend bool operator==(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept;
427 friend bool operator==(const ResultIterator& lhs, const ResultIterator& rhs) noexcept;
428 friend inline bool internal::hasCopyData(Result&);
429 friend inline internal::CopyData internal::getCopyData(Result& result);
430 friend inline hyper_rowset_type_t internal::getResultType(Result& result);
431};
432
434struct Chunks {
436 Chunks(Result& result) : result(result) {
437 }
438
441};
442
444class ColumnIterator final {
445 public:
446 using iterator_category = std::input_iterator_tag;
447 using value_type = Value;
448 using difference_type = std::ptrdiff_t;
449 using pointer = const Value*;
450 using reference = const Value&;
451
453 ColumnIterator(const Row& row, IteratorBeginTag) noexcept
454 : row_(row), columnIndex_(0) {
455 }
456
458 ColumnIterator(const Row& row, IteratorEndTag) noexcept
459 : row_(row), columnIndex_(static_cast<hyper_field_index_t>(row.getSchema().getColumnCount())) {
460 }
461
463 reference operator*() const noexcept;
464
466 pointer operator->() const noexcept { return &**this; }
467
470
473
475 friend bool operator==(const ColumnIterator& lhs, const ColumnIterator& rhs) noexcept { return (&lhs.row_.get() == &rhs.row_.get()) && (lhs.columnIndex_ == rhs.columnIndex_); }
476
478 friend bool operator!=(const ColumnIterator& lhs, const ColumnIterator& rhs) noexcept { return !(lhs == rhs); }
479
480 private:
481 std::reference_wrapper<const Row> row_;
482 hyper_field_index_t columnIndex_;
483 mutable Value currentValue_;
484};
485
487inline ColumnIterator begin(const Row& row) {
488 return {row, iteratorBeginTag};
489}
490
492inline ColumnIterator end(const Row& row) noexcept {
493 return {row, iteratorEndTag};
494}
495
498 public:
499 using iterator_category = std::input_iterator_tag;
500 using value_type = Chunk;
501 using difference_type = std::ptrdiff_t;
502 using pointer = Chunk*;
503 using reference = Chunk&;
504
509 : result_(result), isEndIterator_(true) {
510 }
511
513 reference operator*() noexcept { return result_.get().currentChunk_; }
514
516 pointer operator->() noexcept { return &**this; }
517
520
522 friend bool operator==(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept;
523
525 friend bool operator!=(const ChunkedResultIterator& lhs, const ChunkedResultIterator& rhs) noexcept { return !(lhs == rhs); }
526
527 private:
529 std::reference_wrapper<Result> result_;
531 bool isEndIterator_;
532};
533
535inline ChunkedResultIterator begin(const Chunks& chunks) {
536 return {chunks.result, iteratorBeginTag};
537}
538
540inline ChunkedResultIterator end(const Chunks& chunks) noexcept {
541 return {chunks.result, iteratorEndTag};
542}
543
550class ResultIterator final {
551 public:
552 using iterator_category = std::input_iterator_tag;
553 using value_type = Row;
554 using difference_type = std::ptrdiff_t;
555 using pointer = const Row*;
556 using reference = const Row&;
557
562 : result_(result), isEndIterator_(true) {
563 }
564
566 reference operator*() const noexcept { return *result_.get().getCurrentChunkIterator(); }
567
569 pointer operator->() const noexcept { return &**this; }
570
573
575 friend bool operator==(const ResultIterator& lhs, const ResultIterator& rhs) noexcept;
576
578 friend bool operator!=(const ResultIterator& lhs, const ResultIterator& rhs) noexcept { return !(lhs == rhs); }
579
580 private:
582 std::reference_wrapper<Result> result_;
584 bool isEndIterator_;
585};
586
588inline ResultIterator begin(Result& result) {
589 return {result, iteratorBeginTag};
590}
591
593inline ResultIterator end(Result& result) noexcept {
594 return {result, iteratorEndTag};
595}
596}
597
598#include <hyperapi/impl/Result.impl.hpp>
599
600#endif
Iterates over a hyperapi::Chunk in rows (hyperapi::Row).
Definition Result.hpp:267
friend bool operator!=(const ChunkIterator &lhs, const ChunkIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:301
ChunkIterator & operator++() noexcept
Advances the iterator.
ChunkIterator(const Chunk &chunk, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:281
reference operator*() const noexcept
Returns a reference to the current value.
ChunkIterator(const Chunk &chunk, IteratorBeginTag) noexcept
Constructs the begin-iterator.
Definition Result.hpp:276
A chunk of a result.
Definition Result.hpp:128
friend bool operator==(const Chunk &lhs, const Chunk &rhs) noexcept
Comparison operator.
Definition Result.hpp:169
bool isOpen() const noexcept
Returns whether the chunk is valid.
Definition Result.hpp:163
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:160
Chunk() noexcept=default
Constructor, constructs a closed chunk.
friend bool operator!=(const Chunk &lhs, const Chunk &rhs) noexcept
Comparison operator.
Definition Result.hpp:172
Iterates over a hyperapi::Result in hyperapi::Chunk.
Definition Result.hpp:497
reference operator*() noexcept
Returns a reference to the current value.
Definition Result.hpp:513
friend bool operator!=(const ChunkedResultIterator &lhs, const ChunkedResultIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:525
pointer operator->() noexcept
Returns a pointer to the current value.
Definition Result.hpp:516
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:508
ChunkedResultIterator(Result &result, IteratorBeginTag)
Constructs the begin-iterator.
Iterates over a hyperapi::Row in values (hyperapi::Value).
Definition Result.hpp:444
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:475
ColumnIterator operator++(int)
Advances the iterator.
friend bool operator!=(const ColumnIterator &lhs, const ColumnIterator &rhs) noexcept
Comparison operator.
Definition Result.hpp:478
ColumnIterator(const Row &row, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:458
ColumnIterator(const Row &row, IteratorBeginTag) noexcept
Constructs the begin-iterator.
Definition Result.hpp:453
Defines a Hyper connection.
Iterates over a hyperapi::Result in rows (hyperapi::Row).
Definition Result.hpp:550
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:578
ResultIterator(Result &result, IteratorEndTag) noexcept
Constructs the end-iterator.
Definition Result.hpp:561
reference operator*() const noexcept
Returns a reference to the current value.
Definition Result.hpp:566
pointer operator->() const noexcept
Returns a pointer to the current value.
Definition Result.hpp:569
ResultIterator & operator++()
Advances the iterator.
Base class for a result of a query.
Definition Result.hpp:325
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:332
A Row inside a chunk.
Definition Result.hpp:209
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:43
A value inside a row.
Definition Result.hpp:44
Value(hyper_value_t value, SqlType type, string_view columnName) noexcept
Constructs a Value object.
Definition Result.hpp:47
Value() noexcept
Default constructs a Value object.
Definition Result.hpp:52
bool isNull() const noexcept
Returns whether the value is null.
Definition Result.hpp:94
SqlType getType() const noexcept
Get the type of the value.
Definition Result.hpp:91
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:100
friend bool operator!=(const Value &lhs, const Value &rhs) noexcept
Comparison operator.
Definition Result.hpp:103
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:15
ChunkIterator begin(const Chunk &chunk)
Returns the begin-iterator for the rows of the given chunk.
Definition Result.hpp:312
ChunkIterator end(const Chunk &chunk) noexcept
Returns the end-iterator for the rows of the given chunk.
Definition Result.hpp:317
A tag for an iterator-begin constructor.
Definition Result.hpp:257
A tag for an iterator-end constructor.
Definition Result.hpp:262
A tag that makes a result iterable in chunks.
Definition Result.hpp:434
Result & result
the result
Definition Result.hpp:440
Chunks(Result &result)
Construct a Chunks object.
Definition Result.hpp:436