aboutsummaryrefslogtreecommitdiff
path: root/odb/sqlite/statement.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-03-22 15:49:33 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-03-22 15:49:33 +0200
commit878a448f86ddd60e5eb7778e88edd965003ea480 (patch)
treea0efeef1d7fb9af58d9d73a1cb8aa39f6179b586 /odb/sqlite/statement.hxx
parentb1a6710e7d396538617550f1d00b4db2575485c7 (diff)
Implement the rest of statements
Diffstat (limited to 'odb/sqlite/statement.hxx')
-rw-r--r--odb/sqlite/statement.hxx144
1 files changed, 142 insertions, 2 deletions
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 <odb/details/shared-ptr.hxx>
#include <odb/sqlite/version.hxx>
-//@@ #include <odb/sqlite/binding.hxx>
-
+#include <odb/sqlite/binding.hxx>
#include <odb/sqlite/details/export.hxx>
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_;
+ };
}
}