4
* Copyright (C) 2009 Tim Marston <tim@ed.am>
4
* Copyright (C) 2009 Tim Marston <edam@waxworlds.org>
6
6
* This file is part of sqlite3cc (hereafter referred to as "this program").
7
* See http://ed.am/dev/sqlite3cc for more information.
9
* This program is free software: you can redistribute it and/or modify it under
10
* the terms of the GNU Lesser General Public License as published by the Free
11
* Software Foundation, either version 3 of the License, or (at your option) any
14
* This program is distributed in the hope that it will be useful, but WITHOUT
15
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
7
* See http://www.waxworlds.org/edam/software/sqlite3cc for more information.
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU Lesser General Public License as published
11
* by the Free Software Foundation, either version 3 of the License, or
12
* (at your option) any later version.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU Lesser General Public License for more details.
19
19
* You should have received a copy of the GNU Lesser General Public License
20
20
* along with this program. If not, see <http://www.gnu.org/licenses/>.
51
* The statement class represents an SQL statement. It is the base class for
45
* The statement class represents an SQL statement. It is the base class for
52
46
* both the command and the query classes, which should be used for those
53
* purposes. The basic_statement class its self has protected instantiation.
47
* purposes. The basic_statement class its self has protected instantiation.
55
49
class basic_statement
51
private boost::noncopyable
57
53
//______________________________________________________________________________
62
* Constructor that provides a connection upon which to act and the SQL
58
* Constructor that provides a database upon which to act and the SQL
65
* @param connection a reference to a connection
60
* @param database a reference to a database
66
61
* @param sql an SQL statement in UTF-8
68
63
explicit basic_statement(
69
connection &connection,
70
65
const std::string &sql );
73
* Constructor that provides a connection upon which to act.
75
* @param connection a reference to a connection
68
* Constructor that provides a database upon which to act.
69
* @param database a reference to a database
70
* @param sql an SQL statement in UTF-8
77
72
explicit basic_statement(
78
connection &connection );
80
virtual ~basic_statement();
75
virtual ~basic_statement() throw( );
82
77
//______________________________________________________________________________
83
78
// public interface
94
88
const std::string &sql );
97
* Reset the statement, ready to re-execute it. This does not clear any of
91
* Reset the statement, ready to re-execute it. This does not clear any of
98
92
* the values bound to the statement.
100
93
* @returns an sqlite error code
101
94
* @see sqlite3_reset()
106
99
* Clears the values bound to a statement to NULL.
108
100
* @returns an sqlite error code
109
101
* @see sqlite3_clear_bindings()
111
103
int clear_bindings();
114
* Bind a value to the SQL statement via it's index. This template will
115
* take a variety of data types and bind them as text. This is how sqlite
106
* Bind a value to the SQL statement via it's index. This template will take
107
* a variety of data types and bind them as text. This is how sqlite
116
108
* internally stores the data anyway, so always binding as text just means
117
109
* we do the conversion instead of sqlite and is no less efficient.
119
110
* @param index the index of the parameter to bind to
120
111
* @param value the value to bind
121
112
* @returns an sqlite error code
135
126
* Bind a string value to the SQL statement via it's index where the value
136
* of that string will not change for the duration of the statement. This
137
* is more optimal because sqlite will not have to take it's own copy of the
127
* of that string will not change for the duration of the statement. This is
128
* more optimal because sqlite will not have to make it's own copy of the
140
130
* @param index the index of the parameter to bind to
141
131
* @param value the invariant string value
142
* @param value_length the length of the string including zero-terminator
143
132
* @returns an sqlite error code
144
133
* @see sqlite3_bind_text()
152
141
* Bind a string value to the SQL statement via it's index where the value
153
* of that string will not change for the duration of the statement. This
154
* is more optimal because sqlite will not have to take it's own copy of the
142
* of that string will not change for the duration of the statement. This is
143
* more optimal because sqlite will not have to make it's own copy of the
157
145
* @param index the index of the parameter to bind to
158
146
* @param value the invariant string value
159
147
* @returns an sqlite error code
167
155
* Bind a string value to the SQL statement via it's index where the value
168
* of that string will not change for the duration of the statement. This
169
* is more optimal because sqlite will not have to take it's own copy of the
156
* of that string will not change for the duration of the statement. This is
157
* more optimal because sqlite will not have to make it's own copy of the
172
159
* @param index the index of the parameter to bind to
173
160
* @param value the invariant string value
174
161
* @returns an sqlite error code
189
175
unsigned int index );
192
* Bind a value to the SQL statement via a named parameter. This template
193
* will take a variety of data types and bind them as text. This is how
178
* Bind a value to the SQL statement via a named parameter. This template
179
* will take a variety of data types and bind them as text. This is how
194
180
* sqlite internally stores the data anyway, so always binding as text just
195
181
* means we do the conversion instead of sqlite and is no less efficient.
197
182
* @param name the named parameter to bind to
198
183
* @param value the value to bind
199
184
* @returns an sqlite error code
211
196
* Bind a string value to the SQL statement via a named parameter where the
212
* string value will not change for the duration of the statement. This
213
* prevents sqlite from taking its own copy of the string.
197
* string value will not change for the duration of the statement. This
198
* prevents a copy of the string being taken.
215
199
* @param name the named parameter to bind to
216
200
* @param value the invariant string value
217
* @param value_length the length of the string including zero-terminator
218
201
* @returns an sqlite error code
219
202
* @see sqlite3_bind_text()
227
210
* Bind a string value to the SQL statement via a named parameter where the
228
* string value will not change for the duration of the statement. This
211
* string value will not change for the duration of the statement. This
229
212
* prevents a copy of the string being taken.
231
213
* @param name the named parameter to bind to
232
214
* @param value the invariant string value
233
215
* @returns an sqlite error code
241
223
* Bind a string value to the SQL statement via a named parameter where the
242
* string value will not change for the duration of the statement. This
224
* string value will not change for the duration of the statement. This
243
225
* prevents a copy of the string being taken.
245
226
* @param name the named parameter to bind to
246
227
* @param value the invariant string value
247
228
* @returns an sqlite error code
265
245
* Stream operator is used to bind values to parameters automatically, in
266
* ascending order. In addition, the null and set_index() auto-binding
267
* manipulators can be used.
246
* ascending order. In addition, the null, set_index() and execute auto-
247
* binding manipulators can be used.
269
248
* @param value a value to bind
271
250
template< class T >
272
251
basic_statement &operator <<(
275
int code = bind( _bind_index, value );
276
if( code != SQLITE_OK ) throw sqlite_error( _connection, code );
254
int error_code = bind( _bind_index, value );
255
if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
288
267
* Finalise an SQL statement.
290
268
* @returns an sqlite error code
291
269
* @see sqlite3_finalize()
296
* Get the index number of a named parameter.
274
* Step through one execution cycle of the SQL statement. If this is an SQL
275
* statement that doesn't return any rows, only one cycle is required,
276
* otherwise, each cycle will return another row
277
* @return an sqlite error code
278
* @see sqlite3_step()
283
* Get the index number of a named parameter
298
284
* @param parameter name
299
285
* @return index of named parameter
301
287
int bind_parameter_index(
302
288
const std::string &name );
307
* @return sqlite error code
308
* @see sqlite3_step()
312
/** the connection upon which to act */
313
connection &_connection;
290
/** the database upon which to act */
315
293
/** the statement handle */
316
294
sqlite3_stmt *_handle;
318
298
/** index used when auto-binding */
319
299
unsigned int _bind_index;
324
// template specialisations for basic_statement::operator <<()
326
basic_statement &basic_statement::operator << < detail::null_t >(
327
const detail::null_t & );
329
basic_statement &basic_statement::operator << < detail::set_index_t >(
330
const detail::set_index_t &t );
333
} // namespace detail
304
// template specialisations for statement::operator <<()
306
basic_statement &basic_statement::operator << < _null_t >(
309
basic_statement &basic_statement::operator << < _exec_t >(
312
basic_statement &basic_statement::operator << < _set_index_t >(
313
const _set_index_t &t );
336
316
} // namespace sqlite