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