From 878a448f86ddd60e5eb7778e88edd965003ea480 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 22 Mar 2011 15:49:33 +0200 Subject: Implement the rest of statements --- odb/sqlite/statement.hxx | 144 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 142 insertions(+), 2 deletions(-) (limited to 'odb/sqlite/statement.hxx') diff --git a/odb/sqlite/statement.hxx b/odb/sqlite/statement.hxx index 3c5ea1c..967ff3d 100644 --- a/odb/sqlite/statement.hxx +++ b/odb/sqlite/statement.hxx @@ -17,8 +17,7 @@ #include #include -//@@ #include - +#include #include namespace odb @@ -37,6 +36,17 @@ namespace odb statement (connection&, const std::string& statement); statement (connection&, const char* statement, std::size_t n); + void + bind_param (const bind*, std::size_t count, std::size_t start_param = 0); + + // Extract row columns into the bound buffers. If the truncated + // argument is true, then only truncated columns are extracted. + // Return true if all the data was extracted successfully and + // false if one or more columns were truncated. + // + bool + bind_result (const bind*, std::size_t count, bool truncated = false); + protected: connection& conn_; sqlite3_stmt* stmt_; @@ -58,6 +68,136 @@ namespace odb private: bool result_set_; }; + + class LIBODB_SQLITE_EXPORT select_statement: public statement + { + public: + select_statement (connection& conn, + const std::string& statement, + binding& cond, + binding& data); + + // Common select interface expected by the generated code. + // + public: + enum result + { + success, + no_data, + truncated + }; + + void + execute (); + + // Load next row columns into bound buffers. + // + result + fetch () + { + return next () ? load () : no_data; + } + + // Reload truncated columns into bound buffers. + // + void + refetch () + { + reload (); + } + + // Free the result set. + // + void + free_result () + { + } + + // More fine-grained SQLite-specific interface that splits fetch() + // into next() and load(). + // + public: + // Return false if there is no more rows. + // + bool + next (); + + result + load (); + + void + reload (); + + private: + select_statement (const select_statement&); + select_statement& operator= (const select_statement&); + + private: + bool done_; + binding& cond_; + binding& data_; + }; + + class LIBODB_SQLITE_EXPORT insert_statement: public statement + { + public: + insert_statement (connection& conn, + const std::string& statement, + binding& data); + + // Return true if successful and false if the row is a duplicate. + // All other errors are reported by throwing exceptions. + // + bool + execute (); + + unsigned long long + id (); + + private: + insert_statement (const insert_statement&); + insert_statement& operator= (const insert_statement&); + + private: + binding& data_; + }; + + class LIBODB_SQLITE_EXPORT update_statement: public statement + { + public: + update_statement (connection& conn, + const std::string& statement, + binding& cond, + binding& data); + void + execute (); + + private: + update_statement (const update_statement&); + update_statement& operator= (const update_statement&); + + private: + binding& cond_; + binding& data_; + }; + + class LIBODB_SQLITE_EXPORT delete_statement: public statement + { + public: + delete_statement (connection& conn, + const std::string& statement, + binding& cond); + + unsigned long long + execute (); + + private: + delete_statement (const delete_statement&); + delete_statement& operator= (const delete_statement&); + + private: + binding& cond_; + }; } } -- cgit v1.1