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