1*b0d29bc4SBrooks Davis // Copyright 2011 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis // without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis
29*b0d29bc4SBrooks Davis #include "utils/sqlite/statement.hpp"
30*b0d29bc4SBrooks Davis
31*b0d29bc4SBrooks Davis extern "C" {
32*b0d29bc4SBrooks Davis #include <sqlite3.h>
33*b0d29bc4SBrooks Davis }
34*b0d29bc4SBrooks Davis
35*b0d29bc4SBrooks Davis #include <map>
36*b0d29bc4SBrooks Davis
37*b0d29bc4SBrooks Davis #include "utils/defs.hpp"
38*b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
39*b0d29bc4SBrooks Davis #include "utils/logging/macros.hpp"
40*b0d29bc4SBrooks Davis #include "utils/noncopyable.hpp"
41*b0d29bc4SBrooks Davis #include "utils/sanity.hpp"
42*b0d29bc4SBrooks Davis #include "utils/sqlite/c_gate.hpp"
43*b0d29bc4SBrooks Davis #include "utils/sqlite/database.hpp"
44*b0d29bc4SBrooks Davis #include "utils/sqlite/exceptions.hpp"
45*b0d29bc4SBrooks Davis
46*b0d29bc4SBrooks Davis namespace sqlite = utils::sqlite;
47*b0d29bc4SBrooks Davis
48*b0d29bc4SBrooks Davis
49*b0d29bc4SBrooks Davis namespace {
50*b0d29bc4SBrooks Davis
51*b0d29bc4SBrooks Davis
52*b0d29bc4SBrooks Davis static sqlite::type c_type_to_cxx(const int) UTILS_PURE;
53*b0d29bc4SBrooks Davis
54*b0d29bc4SBrooks Davis
55*b0d29bc4SBrooks Davis /// Maps a SQLite 3 data type to our own representation.
56*b0d29bc4SBrooks Davis ///
57*b0d29bc4SBrooks Davis /// \param original The native SQLite 3 data type.
58*b0d29bc4SBrooks Davis ///
59*b0d29bc4SBrooks Davis /// \return Our internal representation for the native data type.
60*b0d29bc4SBrooks Davis static sqlite::type
c_type_to_cxx(const int original)61*b0d29bc4SBrooks Davis c_type_to_cxx(const int original)
62*b0d29bc4SBrooks Davis {
63*b0d29bc4SBrooks Davis switch (original) {
64*b0d29bc4SBrooks Davis case SQLITE_BLOB: return sqlite::type_blob;
65*b0d29bc4SBrooks Davis case SQLITE_FLOAT: return sqlite::type_float;
66*b0d29bc4SBrooks Davis case SQLITE_INTEGER: return sqlite::type_integer;
67*b0d29bc4SBrooks Davis case SQLITE_NULL: return sqlite::type_null;
68*b0d29bc4SBrooks Davis case SQLITE_TEXT: return sqlite::type_text;
69*b0d29bc4SBrooks Davis default: UNREACHABLE_MSG("Unknown data type returned by SQLite 3");
70*b0d29bc4SBrooks Davis }
71*b0d29bc4SBrooks Davis UNREACHABLE;
72*b0d29bc4SBrooks Davis }
73*b0d29bc4SBrooks Davis
74*b0d29bc4SBrooks Davis
75*b0d29bc4SBrooks Davis /// Handles the return value of a sqlite3_bind_* call.
76*b0d29bc4SBrooks Davis ///
77*b0d29bc4SBrooks Davis /// \param db The database the call was made on.
78*b0d29bc4SBrooks Davis /// \param api_function The name of the sqlite3_bind_* function called.
79*b0d29bc4SBrooks Davis /// \param error The error code returned by the function; can be SQLITE_OK.
80*b0d29bc4SBrooks Davis ///
81*b0d29bc4SBrooks Davis /// \throw std::bad_alloc If there was no memory for the binding.
82*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails for any other reason.
83*b0d29bc4SBrooks Davis static void
handle_bind_error(sqlite::database & db,const char * api_function,const int error)84*b0d29bc4SBrooks Davis handle_bind_error(sqlite::database& db, const char* api_function,
85*b0d29bc4SBrooks Davis const int error)
86*b0d29bc4SBrooks Davis {
87*b0d29bc4SBrooks Davis switch (error) {
88*b0d29bc4SBrooks Davis case SQLITE_OK:
89*b0d29bc4SBrooks Davis return;
90*b0d29bc4SBrooks Davis case SQLITE_RANGE:
91*b0d29bc4SBrooks Davis UNREACHABLE_MSG("Invalid index for bind argument");
92*b0d29bc4SBrooks Davis case SQLITE_NOMEM:
93*b0d29bc4SBrooks Davis throw std::bad_alloc();
94*b0d29bc4SBrooks Davis default:
95*b0d29bc4SBrooks Davis throw sqlite::api_error::from_database(db, api_function);
96*b0d29bc4SBrooks Davis }
97*b0d29bc4SBrooks Davis }
98*b0d29bc4SBrooks Davis
99*b0d29bc4SBrooks Davis
100*b0d29bc4SBrooks Davis } // anonymous namespace
101*b0d29bc4SBrooks Davis
102*b0d29bc4SBrooks Davis
103*b0d29bc4SBrooks Davis /// Internal implementation for sqlite::statement.
104*b0d29bc4SBrooks Davis struct utils::sqlite::statement::impl : utils::noncopyable {
105*b0d29bc4SBrooks Davis /// The database this statement belongs to.
106*b0d29bc4SBrooks Davis sqlite::database& db;
107*b0d29bc4SBrooks Davis
108*b0d29bc4SBrooks Davis /// The SQLite 3 internal statement.
109*b0d29bc4SBrooks Davis ::sqlite3_stmt* stmt;
110*b0d29bc4SBrooks Davis
111*b0d29bc4SBrooks Davis /// Cache for the column names in a statement; lazily initialized.
112*b0d29bc4SBrooks Davis std::map< std::string, int > column_cache;
113*b0d29bc4SBrooks Davis
114*b0d29bc4SBrooks Davis /// Constructor.
115*b0d29bc4SBrooks Davis ///
116*b0d29bc4SBrooks Davis /// \param db_ The database this statement belongs to. Be aware that we
117*b0d29bc4SBrooks Davis /// keep a *reference* to the database; in other words, if the database
118*b0d29bc4SBrooks Davis /// vanishes, this object will become invalid. (It'd be trivial to keep
119*b0d29bc4SBrooks Davis /// a shallow copy here instead, but I feel that statements that outlive
120*b0d29bc4SBrooks Davis /// their database represents sloppy programming.)
121*b0d29bc4SBrooks Davis /// \param stmt_ The SQLite internal statement.
implutils::sqlite::statement::impl122*b0d29bc4SBrooks Davis impl(database& db_, ::sqlite3_stmt* stmt_) :
123*b0d29bc4SBrooks Davis db(db_),
124*b0d29bc4SBrooks Davis stmt(stmt_)
125*b0d29bc4SBrooks Davis {
126*b0d29bc4SBrooks Davis }
127*b0d29bc4SBrooks Davis
128*b0d29bc4SBrooks Davis /// Destructor.
129*b0d29bc4SBrooks Davis ///
130*b0d29bc4SBrooks Davis /// It is important to keep this as part of the 'impl' class instead of the
131*b0d29bc4SBrooks Davis /// container class. The 'impl' class is destroyed exactly once (because it
132*b0d29bc4SBrooks Davis /// is managed by a shared_ptr) and thus releasing the resources here is
133*b0d29bc4SBrooks Davis /// OK. However, the container class is potentially released many times,
134*b0d29bc4SBrooks Davis /// which means that we would be double-freeing the internal object and
135*b0d29bc4SBrooks Davis /// reusing invalid data.
~implutils::sqlite::statement::impl136*b0d29bc4SBrooks Davis ~impl(void)
137*b0d29bc4SBrooks Davis {
138*b0d29bc4SBrooks Davis (void)::sqlite3_finalize(stmt);
139*b0d29bc4SBrooks Davis }
140*b0d29bc4SBrooks Davis };
141*b0d29bc4SBrooks Davis
142*b0d29bc4SBrooks Davis
143*b0d29bc4SBrooks Davis /// Initializes a statement object.
144*b0d29bc4SBrooks Davis ///
145*b0d29bc4SBrooks Davis /// This is an internal function. Use database::create_statement() to
146*b0d29bc4SBrooks Davis /// instantiate one of these objects.
147*b0d29bc4SBrooks Davis ///
148*b0d29bc4SBrooks Davis /// \param db The database this statement belongs to.
149*b0d29bc4SBrooks Davis /// \param raw_stmt A void pointer representing a SQLite native statement of
150*b0d29bc4SBrooks Davis /// type sqlite3_stmt.
statement(database & db,void * raw_stmt)151*b0d29bc4SBrooks Davis sqlite::statement::statement(database& db, void* raw_stmt) :
152*b0d29bc4SBrooks Davis _pimpl(new impl(db, static_cast< ::sqlite3_stmt* >(raw_stmt)))
153*b0d29bc4SBrooks Davis {
154*b0d29bc4SBrooks Davis }
155*b0d29bc4SBrooks Davis
156*b0d29bc4SBrooks Davis
157*b0d29bc4SBrooks Davis /// Destructor for the statement.
158*b0d29bc4SBrooks Davis ///
159*b0d29bc4SBrooks Davis /// Remember that statements are reference-counted, so the statement will only
160*b0d29bc4SBrooks Davis /// cease to be valid once its last copy is destroyed.
~statement(void)161*b0d29bc4SBrooks Davis sqlite::statement::~statement(void)
162*b0d29bc4SBrooks Davis {
163*b0d29bc4SBrooks Davis }
164*b0d29bc4SBrooks Davis
165*b0d29bc4SBrooks Davis
166*b0d29bc4SBrooks Davis /// Executes a statement that is not supposed to return any data.
167*b0d29bc4SBrooks Davis ///
168*b0d29bc4SBrooks Davis /// Use this function to execute DDL and INSERT statements; i.e. statements that
169*b0d29bc4SBrooks Davis /// only have one processing step and deliver no rows. This frees the caller
170*b0d29bc4SBrooks Davis /// from having to deal with the return value of the step() function.
171*b0d29bc4SBrooks Davis ///
172*b0d29bc4SBrooks Davis /// \pre The statement to execute will not produce any rows.
173*b0d29bc4SBrooks Davis void
step_without_results(void)174*b0d29bc4SBrooks Davis sqlite::statement::step_without_results(void)
175*b0d29bc4SBrooks Davis {
176*b0d29bc4SBrooks Davis const bool data = step();
177*b0d29bc4SBrooks Davis INV_MSG(!data, "The statement should not have produced any rows, but it "
178*b0d29bc4SBrooks Davis "did");
179*b0d29bc4SBrooks Davis }
180*b0d29bc4SBrooks Davis
181*b0d29bc4SBrooks Davis
182*b0d29bc4SBrooks Davis /// Performs a processing step on the statement.
183*b0d29bc4SBrooks Davis ///
184*b0d29bc4SBrooks Davis /// \return True if the statement returned a row; false if the processing has
185*b0d29bc4SBrooks Davis /// finished.
186*b0d29bc4SBrooks Davis ///
187*b0d29bc4SBrooks Davis /// \throw api_error If the processing of the step raises an error.
188*b0d29bc4SBrooks Davis bool
step(void)189*b0d29bc4SBrooks Davis sqlite::statement::step(void)
190*b0d29bc4SBrooks Davis {
191*b0d29bc4SBrooks Davis const int error = ::sqlite3_step(_pimpl->stmt);
192*b0d29bc4SBrooks Davis switch (error) {
193*b0d29bc4SBrooks Davis case SQLITE_DONE:
194*b0d29bc4SBrooks Davis LD("Step statement; no more rows");
195*b0d29bc4SBrooks Davis return false;
196*b0d29bc4SBrooks Davis case SQLITE_ROW:
197*b0d29bc4SBrooks Davis LD("Step statement; row available for processing");
198*b0d29bc4SBrooks Davis return true;
199*b0d29bc4SBrooks Davis default:
200*b0d29bc4SBrooks Davis throw api_error::from_database(_pimpl->db, "sqlite3_step");
201*b0d29bc4SBrooks Davis }
202*b0d29bc4SBrooks Davis UNREACHABLE;
203*b0d29bc4SBrooks Davis }
204*b0d29bc4SBrooks Davis
205*b0d29bc4SBrooks Davis
206*b0d29bc4SBrooks Davis /// Returns the number of columns in the step result.
207*b0d29bc4SBrooks Davis ///
208*b0d29bc4SBrooks Davis /// \return The number of columns available for data retrieval.
209*b0d29bc4SBrooks Davis int
column_count(void)210*b0d29bc4SBrooks Davis sqlite::statement::column_count(void)
211*b0d29bc4SBrooks Davis {
212*b0d29bc4SBrooks Davis return ::sqlite3_column_count(_pimpl->stmt);
213*b0d29bc4SBrooks Davis }
214*b0d29bc4SBrooks Davis
215*b0d29bc4SBrooks Davis
216*b0d29bc4SBrooks Davis /// Returns the name of a particular column in the result.
217*b0d29bc4SBrooks Davis ///
218*b0d29bc4SBrooks Davis /// \param index The column to request the name of.
219*b0d29bc4SBrooks Davis ///
220*b0d29bc4SBrooks Davis /// \return The name of the requested column.
221*b0d29bc4SBrooks Davis std::string
column_name(const int index)222*b0d29bc4SBrooks Davis sqlite::statement::column_name(const int index)
223*b0d29bc4SBrooks Davis {
224*b0d29bc4SBrooks Davis const char* name = ::sqlite3_column_name(_pimpl->stmt, index);
225*b0d29bc4SBrooks Davis if (name == NULL)
226*b0d29bc4SBrooks Davis throw api_error::from_database(_pimpl->db, "sqlite3_column_name");
227*b0d29bc4SBrooks Davis return name;
228*b0d29bc4SBrooks Davis }
229*b0d29bc4SBrooks Davis
230*b0d29bc4SBrooks Davis
231*b0d29bc4SBrooks Davis /// Returns the type of a particular column in the result.
232*b0d29bc4SBrooks Davis ///
233*b0d29bc4SBrooks Davis /// \param index The column to request the type of.
234*b0d29bc4SBrooks Davis ///
235*b0d29bc4SBrooks Davis /// \return The type of the requested column.
236*b0d29bc4SBrooks Davis sqlite::type
column_type(const int index)237*b0d29bc4SBrooks Davis sqlite::statement::column_type(const int index)
238*b0d29bc4SBrooks Davis {
239*b0d29bc4SBrooks Davis return c_type_to_cxx(::sqlite3_column_type(_pimpl->stmt, index));
240*b0d29bc4SBrooks Davis }
241*b0d29bc4SBrooks Davis
242*b0d29bc4SBrooks Davis
243*b0d29bc4SBrooks Davis /// Finds a column by name.
244*b0d29bc4SBrooks Davis ///
245*b0d29bc4SBrooks Davis /// \param name The name of the column to search for.
246*b0d29bc4SBrooks Davis ///
247*b0d29bc4SBrooks Davis /// \return The column identifier.
248*b0d29bc4SBrooks Davis ///
249*b0d29bc4SBrooks Davis /// \throw value_error If the name cannot be found.
250*b0d29bc4SBrooks Davis int
column_id(const char * name)251*b0d29bc4SBrooks Davis sqlite::statement::column_id(const char* name)
252*b0d29bc4SBrooks Davis {
253*b0d29bc4SBrooks Davis std::map< std::string, int >& cache = _pimpl->column_cache;
254*b0d29bc4SBrooks Davis
255*b0d29bc4SBrooks Davis if (cache.empty()) {
256*b0d29bc4SBrooks Davis for (int i = 0; i < column_count(); i++) {
257*b0d29bc4SBrooks Davis const std::string aux_name = column_name(i);
258*b0d29bc4SBrooks Davis INV(cache.find(aux_name) == cache.end());
259*b0d29bc4SBrooks Davis cache[aux_name] = i;
260*b0d29bc4SBrooks Davis }
261*b0d29bc4SBrooks Davis }
262*b0d29bc4SBrooks Davis
263*b0d29bc4SBrooks Davis const std::map< std::string, int >::const_iterator iter = cache.find(name);
264*b0d29bc4SBrooks Davis if (iter == cache.end())
265*b0d29bc4SBrooks Davis throw invalid_column_error(_pimpl->db.db_filename(), name);
266*b0d29bc4SBrooks Davis else
267*b0d29bc4SBrooks Davis return (*iter).second;
268*b0d29bc4SBrooks Davis }
269*b0d29bc4SBrooks Davis
270*b0d29bc4SBrooks Davis
271*b0d29bc4SBrooks Davis /// Returns a particular column in the result as a blob.
272*b0d29bc4SBrooks Davis ///
273*b0d29bc4SBrooks Davis /// \param index The column to retrieve.
274*b0d29bc4SBrooks Davis ///
275*b0d29bc4SBrooks Davis /// \return A block of memory with the blob contents. Note that the pointer
276*b0d29bc4SBrooks Davis /// returned by this call will be invalidated on the next call to any SQLite API
277*b0d29bc4SBrooks Davis /// function.
278*b0d29bc4SBrooks Davis sqlite::blob
column_blob(const int index)279*b0d29bc4SBrooks Davis sqlite::statement::column_blob(const int index)
280*b0d29bc4SBrooks Davis {
281*b0d29bc4SBrooks Davis PRE(column_type(index) == type_blob);
282*b0d29bc4SBrooks Davis return blob(::sqlite3_column_blob(_pimpl->stmt, index),
283*b0d29bc4SBrooks Davis ::sqlite3_column_bytes(_pimpl->stmt, index));
284*b0d29bc4SBrooks Davis }
285*b0d29bc4SBrooks Davis
286*b0d29bc4SBrooks Davis
287*b0d29bc4SBrooks Davis /// Returns a particular column in the result as a double.
288*b0d29bc4SBrooks Davis ///
289*b0d29bc4SBrooks Davis /// \param index The column to retrieve.
290*b0d29bc4SBrooks Davis ///
291*b0d29bc4SBrooks Davis /// \return The double value.
292*b0d29bc4SBrooks Davis double
column_double(const int index)293*b0d29bc4SBrooks Davis sqlite::statement::column_double(const int index)
294*b0d29bc4SBrooks Davis {
295*b0d29bc4SBrooks Davis PRE(column_type(index) == type_float);
296*b0d29bc4SBrooks Davis return ::sqlite3_column_double(_pimpl->stmt, index);
297*b0d29bc4SBrooks Davis }
298*b0d29bc4SBrooks Davis
299*b0d29bc4SBrooks Davis
300*b0d29bc4SBrooks Davis /// Returns a particular column in the result as an integer.
301*b0d29bc4SBrooks Davis ///
302*b0d29bc4SBrooks Davis /// \param index The column to retrieve.
303*b0d29bc4SBrooks Davis ///
304*b0d29bc4SBrooks Davis /// \return The integer value. Note that the value may not fit in an integer
305*b0d29bc4SBrooks Davis /// depending on the platform. Use column_int64 to retrieve the integer without
306*b0d29bc4SBrooks Davis /// truncation.
307*b0d29bc4SBrooks Davis int
column_int(const int index)308*b0d29bc4SBrooks Davis sqlite::statement::column_int(const int index)
309*b0d29bc4SBrooks Davis {
310*b0d29bc4SBrooks Davis PRE(column_type(index) == type_integer);
311*b0d29bc4SBrooks Davis return ::sqlite3_column_int(_pimpl->stmt, index);
312*b0d29bc4SBrooks Davis }
313*b0d29bc4SBrooks Davis
314*b0d29bc4SBrooks Davis
315*b0d29bc4SBrooks Davis /// Returns a particular column in the result as a 64-bit integer.
316*b0d29bc4SBrooks Davis ///
317*b0d29bc4SBrooks Davis /// \param index The column to retrieve.
318*b0d29bc4SBrooks Davis ///
319*b0d29bc4SBrooks Davis /// \return The integer value.
320*b0d29bc4SBrooks Davis int64_t
column_int64(const int index)321*b0d29bc4SBrooks Davis sqlite::statement::column_int64(const int index)
322*b0d29bc4SBrooks Davis {
323*b0d29bc4SBrooks Davis PRE(column_type(index) == type_integer);
324*b0d29bc4SBrooks Davis return ::sqlite3_column_int64(_pimpl->stmt, index);
325*b0d29bc4SBrooks Davis }
326*b0d29bc4SBrooks Davis
327*b0d29bc4SBrooks Davis
328*b0d29bc4SBrooks Davis /// Returns a particular column in the result as a double.
329*b0d29bc4SBrooks Davis ///
330*b0d29bc4SBrooks Davis /// \param index The column to retrieve.
331*b0d29bc4SBrooks Davis ///
332*b0d29bc4SBrooks Davis /// \return A C string with the contents. Note that the pointer returned by
333*b0d29bc4SBrooks Davis /// this call will be invalidated on the next call to any SQLite API function.
334*b0d29bc4SBrooks Davis /// If you want to be extra safe, store the result in a std::string to not worry
335*b0d29bc4SBrooks Davis /// about this.
336*b0d29bc4SBrooks Davis std::string
column_text(const int index)337*b0d29bc4SBrooks Davis sqlite::statement::column_text(const int index)
338*b0d29bc4SBrooks Davis {
339*b0d29bc4SBrooks Davis PRE(column_type(index) == type_text);
340*b0d29bc4SBrooks Davis return reinterpret_cast< const char* >(::sqlite3_column_text(
341*b0d29bc4SBrooks Davis _pimpl->stmt, index));
342*b0d29bc4SBrooks Davis }
343*b0d29bc4SBrooks Davis
344*b0d29bc4SBrooks Davis
345*b0d29bc4SBrooks Davis /// Returns the number of bytes stored in the column.
346*b0d29bc4SBrooks Davis ///
347*b0d29bc4SBrooks Davis /// \pre This is only valid for columns of type blob and text.
348*b0d29bc4SBrooks Davis ///
349*b0d29bc4SBrooks Davis /// \param index The column to retrieve the size of.
350*b0d29bc4SBrooks Davis ///
351*b0d29bc4SBrooks Davis /// \return The number of bytes in the column. Remember that strings are stored
352*b0d29bc4SBrooks Davis /// in their UTF-8 representation; this call returns the number of *bytes*, not
353*b0d29bc4SBrooks Davis /// characters.
354*b0d29bc4SBrooks Davis int
column_bytes(const int index)355*b0d29bc4SBrooks Davis sqlite::statement::column_bytes(const int index)
356*b0d29bc4SBrooks Davis {
357*b0d29bc4SBrooks Davis PRE(column_type(index) == type_blob || column_type(index) == type_text);
358*b0d29bc4SBrooks Davis return ::sqlite3_column_bytes(_pimpl->stmt, index);
359*b0d29bc4SBrooks Davis }
360*b0d29bc4SBrooks Davis
361*b0d29bc4SBrooks Davis
362*b0d29bc4SBrooks Davis /// Type-checked version of column_blob.
363*b0d29bc4SBrooks Davis ///
364*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve.
365*b0d29bc4SBrooks Davis ///
366*b0d29bc4SBrooks Davis /// \return The same as column_blob if the value can be retrieved.
367*b0d29bc4SBrooks Davis ///
368*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve is invalid.
369*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
370*b0d29bc4SBrooks Davis sqlite::blob
safe_column_blob(const char * name)371*b0d29bc4SBrooks Davis sqlite::statement::safe_column_blob(const char* name)
372*b0d29bc4SBrooks Davis {
373*b0d29bc4SBrooks Davis const int column = column_id(name);
374*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_blob)
375*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
376*b0d29bc4SBrooks Davis F("Column '%s' is not a blob") % name);
377*b0d29bc4SBrooks Davis return column_blob(column);
378*b0d29bc4SBrooks Davis }
379*b0d29bc4SBrooks Davis
380*b0d29bc4SBrooks Davis
381*b0d29bc4SBrooks Davis /// Type-checked version of column_double.
382*b0d29bc4SBrooks Davis ///
383*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve.
384*b0d29bc4SBrooks Davis ///
385*b0d29bc4SBrooks Davis /// \return The same as column_double if the value can be retrieved.
386*b0d29bc4SBrooks Davis ///
387*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve is invalid.
388*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
389*b0d29bc4SBrooks Davis double
safe_column_double(const char * name)390*b0d29bc4SBrooks Davis sqlite::statement::safe_column_double(const char* name)
391*b0d29bc4SBrooks Davis {
392*b0d29bc4SBrooks Davis const int column = column_id(name);
393*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_float)
394*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
395*b0d29bc4SBrooks Davis F("Column '%s' is not a float") % name);
396*b0d29bc4SBrooks Davis return column_double(column);
397*b0d29bc4SBrooks Davis }
398*b0d29bc4SBrooks Davis
399*b0d29bc4SBrooks Davis
400*b0d29bc4SBrooks Davis /// Type-checked version of column_int.
401*b0d29bc4SBrooks Davis ///
402*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve.
403*b0d29bc4SBrooks Davis ///
404*b0d29bc4SBrooks Davis /// \return The same as column_int if the value can be retrieved.
405*b0d29bc4SBrooks Davis ///
406*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve is invalid.
407*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
408*b0d29bc4SBrooks Davis int
safe_column_int(const char * name)409*b0d29bc4SBrooks Davis sqlite::statement::safe_column_int(const char* name)
410*b0d29bc4SBrooks Davis {
411*b0d29bc4SBrooks Davis const int column = column_id(name);
412*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_integer)
413*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
414*b0d29bc4SBrooks Davis F("Column '%s' is not an integer") % name);
415*b0d29bc4SBrooks Davis return column_int(column);
416*b0d29bc4SBrooks Davis }
417*b0d29bc4SBrooks Davis
418*b0d29bc4SBrooks Davis
419*b0d29bc4SBrooks Davis /// Type-checked version of column_int64.
420*b0d29bc4SBrooks Davis ///
421*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve.
422*b0d29bc4SBrooks Davis ///
423*b0d29bc4SBrooks Davis /// \return The same as column_int64 if the value can be retrieved.
424*b0d29bc4SBrooks Davis ///
425*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve is invalid.
426*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
427*b0d29bc4SBrooks Davis int64_t
safe_column_int64(const char * name)428*b0d29bc4SBrooks Davis sqlite::statement::safe_column_int64(const char* name)
429*b0d29bc4SBrooks Davis {
430*b0d29bc4SBrooks Davis const int column = column_id(name);
431*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_integer)
432*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
433*b0d29bc4SBrooks Davis F("Column '%s' is not an integer") % name);
434*b0d29bc4SBrooks Davis return column_int64(column);
435*b0d29bc4SBrooks Davis }
436*b0d29bc4SBrooks Davis
437*b0d29bc4SBrooks Davis
438*b0d29bc4SBrooks Davis /// Type-checked version of column_text.
439*b0d29bc4SBrooks Davis ///
440*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve.
441*b0d29bc4SBrooks Davis ///
442*b0d29bc4SBrooks Davis /// \return The same as column_text if the value can be retrieved.
443*b0d29bc4SBrooks Davis ///
444*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve is invalid.
445*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
446*b0d29bc4SBrooks Davis std::string
safe_column_text(const char * name)447*b0d29bc4SBrooks Davis sqlite::statement::safe_column_text(const char* name)
448*b0d29bc4SBrooks Davis {
449*b0d29bc4SBrooks Davis const int column = column_id(name);
450*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_text)
451*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
452*b0d29bc4SBrooks Davis F("Column '%s' is not a string") % name);
453*b0d29bc4SBrooks Davis return column_text(column);
454*b0d29bc4SBrooks Davis }
455*b0d29bc4SBrooks Davis
456*b0d29bc4SBrooks Davis
457*b0d29bc4SBrooks Davis /// Type-checked version of column_bytes.
458*b0d29bc4SBrooks Davis ///
459*b0d29bc4SBrooks Davis /// \param name The name of the column to retrieve the size of.
460*b0d29bc4SBrooks Davis ///
461*b0d29bc4SBrooks Davis /// \return The same as column_bytes if the value can be retrieved.
462*b0d29bc4SBrooks Davis ///
463*b0d29bc4SBrooks Davis /// \throw error If the type of the cell to retrieve the size of is invalid.
464*b0d29bc4SBrooks Davis /// \throw invalid_column_error If name is invalid.
465*b0d29bc4SBrooks Davis int
safe_column_bytes(const char * name)466*b0d29bc4SBrooks Davis sqlite::statement::safe_column_bytes(const char* name)
467*b0d29bc4SBrooks Davis {
468*b0d29bc4SBrooks Davis const int column = column_id(name);
469*b0d29bc4SBrooks Davis if (column_type(column) != sqlite::type_blob &&
470*b0d29bc4SBrooks Davis column_type(column) != sqlite::type_text)
471*b0d29bc4SBrooks Davis throw sqlite::error(_pimpl->db.db_filename(),
472*b0d29bc4SBrooks Davis F("Column '%s' is not a blob or a string") % name);
473*b0d29bc4SBrooks Davis return column_bytes(column);
474*b0d29bc4SBrooks Davis }
475*b0d29bc4SBrooks Davis
476*b0d29bc4SBrooks Davis
477*b0d29bc4SBrooks Davis /// Resets a statement to allow further processing.
478*b0d29bc4SBrooks Davis void
reset(void)479*b0d29bc4SBrooks Davis sqlite::statement::reset(void)
480*b0d29bc4SBrooks Davis {
481*b0d29bc4SBrooks Davis (void)::sqlite3_reset(_pimpl->stmt);
482*b0d29bc4SBrooks Davis }
483*b0d29bc4SBrooks Davis
484*b0d29bc4SBrooks Davis
485*b0d29bc4SBrooks Davis /// Binds a blob to a prepared statement.
486*b0d29bc4SBrooks Davis ///
487*b0d29bc4SBrooks Davis /// \param index The index of the binding.
488*b0d29bc4SBrooks Davis /// \param b Description of the blob, which must remain valid during the
489*b0d29bc4SBrooks Davis /// execution of the statement.
490*b0d29bc4SBrooks Davis ///
491*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
492*b0d29bc4SBrooks Davis void
bind(const int index,const blob & b)493*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const blob& b)
494*b0d29bc4SBrooks Davis {
495*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_blob(_pimpl->stmt, index, b.memory, b.size,
496*b0d29bc4SBrooks Davis SQLITE_STATIC);
497*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_blob", error);
498*b0d29bc4SBrooks Davis }
499*b0d29bc4SBrooks Davis
500*b0d29bc4SBrooks Davis
501*b0d29bc4SBrooks Davis /// Binds a double value to a prepared statement.
502*b0d29bc4SBrooks Davis ///
503*b0d29bc4SBrooks Davis /// \param index The index of the binding.
504*b0d29bc4SBrooks Davis /// \param value The double value to bind.
505*b0d29bc4SBrooks Davis ///
506*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
507*b0d29bc4SBrooks Davis void
bind(const int index,const double value)508*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const double value)
509*b0d29bc4SBrooks Davis {
510*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_double(_pimpl->stmt, index, value);
511*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_double", error);
512*b0d29bc4SBrooks Davis }
513*b0d29bc4SBrooks Davis
514*b0d29bc4SBrooks Davis
515*b0d29bc4SBrooks Davis /// Binds an integer value to a prepared statement.
516*b0d29bc4SBrooks Davis ///
517*b0d29bc4SBrooks Davis /// \param index The index of the binding.
518*b0d29bc4SBrooks Davis /// \param value The integer value to bind.
519*b0d29bc4SBrooks Davis ///
520*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
521*b0d29bc4SBrooks Davis void
bind(const int index,const int value)522*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const int value)
523*b0d29bc4SBrooks Davis {
524*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_int(_pimpl->stmt, index, value);
525*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_int", error);
526*b0d29bc4SBrooks Davis }
527*b0d29bc4SBrooks Davis
528*b0d29bc4SBrooks Davis
529*b0d29bc4SBrooks Davis /// Binds a 64-bit integer value to a prepared statement.
530*b0d29bc4SBrooks Davis ///
531*b0d29bc4SBrooks Davis /// \param index The index of the binding.
532*b0d29bc4SBrooks Davis /// \param value The 64-bin integer value to bind.
533*b0d29bc4SBrooks Davis ///
534*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
535*b0d29bc4SBrooks Davis void
bind(const int index,const int64_t value)536*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const int64_t value)
537*b0d29bc4SBrooks Davis {
538*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_int64(_pimpl->stmt, index, value);
539*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_int64", error);
540*b0d29bc4SBrooks Davis }
541*b0d29bc4SBrooks Davis
542*b0d29bc4SBrooks Davis
543*b0d29bc4SBrooks Davis /// Binds a NULL value to a prepared statement.
544*b0d29bc4SBrooks Davis ///
545*b0d29bc4SBrooks Davis /// \param index The index of the binding.
546*b0d29bc4SBrooks Davis ///
547*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
548*b0d29bc4SBrooks Davis void
bind(const int index,const null &)549*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const null& /* null */)
550*b0d29bc4SBrooks Davis {
551*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_null(_pimpl->stmt, index);
552*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_null", error);
553*b0d29bc4SBrooks Davis }
554*b0d29bc4SBrooks Davis
555*b0d29bc4SBrooks Davis
556*b0d29bc4SBrooks Davis /// Binds a text string to a prepared statement.
557*b0d29bc4SBrooks Davis ///
558*b0d29bc4SBrooks Davis /// \param index The index of the binding.
559*b0d29bc4SBrooks Davis /// \param text The string to bind. SQLite generates an internal copy of this
560*b0d29bc4SBrooks Davis /// string, so the original string object does not have to remain live. We
561*b0d29bc4SBrooks Davis /// do this because handling the lifetime of std::string objects is very
562*b0d29bc4SBrooks Davis /// hard (think about implicit conversions), so it is very easy to shoot
563*b0d29bc4SBrooks Davis /// ourselves in the foot if we don't do this.
564*b0d29bc4SBrooks Davis ///
565*b0d29bc4SBrooks Davis /// \throw api_error If the binding fails.
566*b0d29bc4SBrooks Davis void
bind(const int index,const std::string & text)567*b0d29bc4SBrooks Davis sqlite::statement::bind(const int index, const std::string& text)
568*b0d29bc4SBrooks Davis {
569*b0d29bc4SBrooks Davis const int error = ::sqlite3_bind_text(_pimpl->stmt, index, text.c_str(),
570*b0d29bc4SBrooks Davis text.length(), SQLITE_TRANSIENT);
571*b0d29bc4SBrooks Davis handle_bind_error(_pimpl->db, "sqlite3_bind_text", error);
572*b0d29bc4SBrooks Davis }
573*b0d29bc4SBrooks Davis
574*b0d29bc4SBrooks Davis
575*b0d29bc4SBrooks Davis /// Returns the index of the highest parameter.
576*b0d29bc4SBrooks Davis ///
577*b0d29bc4SBrooks Davis /// \return A parameter index.
578*b0d29bc4SBrooks Davis int
bind_parameter_count(void)579*b0d29bc4SBrooks Davis sqlite::statement::bind_parameter_count(void)
580*b0d29bc4SBrooks Davis {
581*b0d29bc4SBrooks Davis return ::sqlite3_bind_parameter_count(_pimpl->stmt);
582*b0d29bc4SBrooks Davis }
583*b0d29bc4SBrooks Davis
584*b0d29bc4SBrooks Davis
585*b0d29bc4SBrooks Davis /// Returns the index of a named parameter.
586*b0d29bc4SBrooks Davis ///
587*b0d29bc4SBrooks Davis /// \param name The name of the parameter to be queried; must exist.
588*b0d29bc4SBrooks Davis ///
589*b0d29bc4SBrooks Davis /// \return A parameter index.
590*b0d29bc4SBrooks Davis int
bind_parameter_index(const std::string & name)591*b0d29bc4SBrooks Davis sqlite::statement::bind_parameter_index(const std::string& name)
592*b0d29bc4SBrooks Davis {
593*b0d29bc4SBrooks Davis const int index = ::sqlite3_bind_parameter_index(_pimpl->stmt,
594*b0d29bc4SBrooks Davis name.c_str());
595*b0d29bc4SBrooks Davis PRE_MSG(index > 0, "Parameter name not in statement");
596*b0d29bc4SBrooks Davis return index;
597*b0d29bc4SBrooks Davis }
598*b0d29bc4SBrooks Davis
599*b0d29bc4SBrooks Davis
600*b0d29bc4SBrooks Davis /// Returns the name of a parameter by index.
601*b0d29bc4SBrooks Davis ///
602*b0d29bc4SBrooks Davis /// \param index The index to query; must be valid.
603*b0d29bc4SBrooks Davis ///
604*b0d29bc4SBrooks Davis /// \return The name of the parameter.
605*b0d29bc4SBrooks Davis std::string
bind_parameter_name(const int index)606*b0d29bc4SBrooks Davis sqlite::statement::bind_parameter_name(const int index)
607*b0d29bc4SBrooks Davis {
608*b0d29bc4SBrooks Davis const char* name = ::sqlite3_bind_parameter_name(_pimpl->stmt, index);
609*b0d29bc4SBrooks Davis PRE_MSG(name != NULL, "Index value out of range or nameless parameter");
610*b0d29bc4SBrooks Davis return std::string(name);
611*b0d29bc4SBrooks Davis }
612*b0d29bc4SBrooks Davis
613*b0d29bc4SBrooks Davis
614*b0d29bc4SBrooks Davis /// Clears any bindings and releases their memory.
615*b0d29bc4SBrooks Davis void
clear_bindings(void)616*b0d29bc4SBrooks Davis sqlite::statement::clear_bindings(void)
617*b0d29bc4SBrooks Davis {
618*b0d29bc4SBrooks Davis const int error = ::sqlite3_clear_bindings(_pimpl->stmt);
619*b0d29bc4SBrooks Davis PRE_MSG(error == SQLITE_OK, "SQLite3 contract has changed; it should "
620*b0d29bc4SBrooks Davis "only return SQLITE_OK");
621*b0d29bc4SBrooks Davis }
622