clang-tags
C/C++ source code indexing tool based on libclang
 All Classes Functions Variables Typedefs Groups Pages
statement.hxx
1 #pragma once
2 
3 #include "database.hxx"
4 
5 namespace Sqlite {
21  class Statement {
22  public:
32  Statement (Sqlite::Database & db, char const *const sql)
33  : db_ (db),
34  bindI_ (1),
35  colI_ (0)
36  {
37  sqlite3_stmt *stmt;
38  int ret = sqlite3_prepare_v2 (db_.raw(), sql, -1, &stmt, NULL);
39  stmt_.reset (new Statement_ (stmt));
40 
41  if (ret != SQLITE_OK) {
42  throw Error (db.errMsg());
43  }
44  }
45 
55  Statement & bind (const std::string & s) {
56  return bind_ (sqlite3_bind_text (raw(), bindI_, s.c_str(), s.size(), NULL));
57  }
58 
68  Statement & bind (int i) {
69  return bind_ (sqlite3_bind_int (raw(), bindI_, i));
70  }
71 
80  Statement & operator>> (int & i) {
81  i = sqlite3_column_int (raw(), colI_);
82  ++colI_;
83  return *this;
84  }
85 
95  Statement & operator>> (std::string & s) {
96  s = reinterpret_cast<char const *> (sqlite3_column_text (raw(), colI_));
97  ++colI_;
98  return *this;
99  }
100 
115  int step () {
116  colI_ = 0;
117  int ret = sqlite3_step (raw());
118  if (ret == SQLITE_ERROR) {
119  throw Error (db_.errMsg());
120  }
121 
122  return ret;
123  }
124 
125  private:
126  Statement & bind_ (int ret) {
127  if (ret != SQLITE_OK) {
128  throw Error (db_.errMsg());
129  }
130 
131  ++bindI_;
132  return *this;
133  }
134 
135  sqlite3_stmt * raw () { return stmt_->stmt_; }
136 
137  struct Statement_ {
138  sqlite3_stmt *stmt_;
139  Statement_ (sqlite3_stmt *stmt) : stmt_(stmt) {}
140  ~Statement_ () { sqlite3_finalize (stmt_); }
141  };
142 
143  Database & db_;
144  int bindI_;
145  int colI_;
146  std::shared_ptr<Statement_> stmt_;
147  };
148 
150 }