diff options
Diffstat (limited to 'doc/reference/static_resultset.adoc')
-rw-r--r-- | doc/reference/static_resultset.adoc | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/doc/reference/static_resultset.adoc b/doc/reference/static_resultset.adoc new file mode 100644 index 0000000..0e15e25 --- /dev/null +++ b/doc/reference/static_resultset.adoc @@ -0,0 +1,98 @@ +== `sqlite/static_resultset.hpp` + +A `static_resultset` represents the results of a query matched to a C++ type + +[source,cpp] +---- +// Representation of a result from a query. + +struct resultset +{ + +template<typename T, bool Strict > +struct static_resultset +{ + // Returns the current row. + T current() const &; + + // Returns the current row. + T current(system::error_code & ec, error_info & ei) const &; + // Checks if the last row has been reached. + bool done() const {return result_.done();} + + // Read the next row. Returns false if there's nothing more to read. + bool read_next(system::error_code & ec, error_info & ei); + bool read_next(); + + + // The number of columes in the resultset + std::size_t column_count() const; + // Returns the name of the column idx. + string_view column_name(std::size_t idx) const; + + // Returns the name of the source table for column idx. + string_view table_name(std::size_t idx) const; + // Returns the origin name of the column for column idx. + string_view column_origin_name(std::size_t idx) const; + + static_resultset() = default; + static_resultset(resultset && result) + + static_resultset(static_resultset<T, false> && rhs); + + /// The input iterator can be used to read every row in a for-loop + struct iterator + { + using value_type = T; + using difference_type = int; + using reference = T&; + using iterator_category = std::forward_iterator_tag; + + iterator(); + explicit iterator(resultset::iterator itr); + bool operator!=(iterator rhs) const; + + value_type &operator*(); + value_type *operator->(); + + iterator& operator++(); + iterator operator++(int); + }; + + /// Return an input iterator to the currently unread row + iterator begin(); + /// Sentinel iterator. + iterator end(); + + // Convert the static_result to a strict version + static_resultset<T, true> strict() && + { + return {std::move(result_)}; + } +}; +---- + + +T:: The static type of the query. This must be a tuple or pfr compatible (for C++20) or described. +Strict:: Disables implicit conversions. + + +.Example +[source,cpp] +---- +extern sqlite::connection conn; +struct user { std::string first_name; std::string last_name; }; +BOOST_DESCRIBE_STRUCT(user, (), (first_name, last_name)); + +sqlite::resultset rs = conn.query("select first_name, last_name from users;"); + +do +{ +user usr = r.current(); +handle_row(u); +} +while (rs.read_next()) // read it line by line + +---- + + |