/sqlite3cc

To get this branch, use:
bzr branch http://bzr.ed.am/sqlite3cc
1 by edam
- initial commit
1
/*
2
 * statement.cpp
3
 *
4
 * Copyright (C) 2009 Tim Marston <edam@waxworlds.org>
5
 *
6
 * This file is part of sqlitepp (hereafter referred to as "this program").
7
 * See http://www.waxworlds.org/edam/software/sqlitepp for more information.
8
 *
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.
13
 *
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.
18
 *
19
 * You should have received a copy of the GNU Lesser General Public License
20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 */
22
23
#include <sqlitepp/statement.hpp>
24
#include <sqlitepp/exception.hpp>
25
#include <sqlitepp/database.hpp>
26
#include <string.h>
27
#include <iomanip>
28
29
30
const sqlite::_null_t sqlite::null = { };
31
32
const sqlite::_exec_t sqlite::exec = { };
33
34
35
sqlite::_set_index_t sqlite::set_index(
36
	unsigned int index )
37
{
38
	_set_index_t t = { index };
39
	return t;
40
}
41
42
43
sqlite::statement::statement(
44
	database &database,
45
	const std::string &sql )
46
	:
47
	_database( database ),
48
	_handle( NULL ),
49
	_bind_index( 1 )
50
{
51
	int error_code = prepare( sql );
52
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
53
}
54
55
56
sqlite::statement::~statement() throw( )
57
{
58
	finalize();
59
}
60
61
62
int sqlite::statement::prepare(
63
	const std::string &sql )
64
{
65
	finalize();
66
	return sqlite3_prepare_v2( _database._handle, sql.c_str(),
67
		sql.length() + 1, &_handle, NULL );
68
}
69
70
71
int sqlite::statement::step()
72
{
73
	return sqlite3_step( _handle );
74
}
75
76
77
int sqlite::statement::reset()
78
{
79
	return sqlite3_reset( _handle );
80
}
81
82
83
int sqlite::statement::clear_bindings()
84
{
85
	_bind_index = 1;
86
	return sqlite3_clear_bindings( _handle );
87
}
88
89
90
int sqlite::statement::bind_static(
91
	unsigned int index,
92
	const char *value,
93
	unsigned int value_length )
94
{
95
	return sqlite3_bind_text( _handle, index, value, value_length,
96
		SQLITE_STATIC );
97
}
98
99
100
int sqlite::statement::bind_static(
101
	unsigned int index,
102
	const char *value )
103
{
104
	return bind_static( index, value, strlen( value ) );
105
}
106
107
108
int sqlite::statement::bind_static(
109
	unsigned int index,
110
	const std::string &value )
111
{
112
	return bind_static( index, value.c_str(), value.length() );
113
}
114
115
116
int sqlite::statement::bind_null(
117
	unsigned int index )
118
{
119
	return sqlite3_bind_null( _handle, index );
120
}
121
122
123
int sqlite::statement::bind_static(
124
	const std::string &name,
125
	const char *value,
126
	unsigned int value_length )
127
{
128
	unsigned int index = sqlite3_bind_parameter_index( _handle, name.c_str() );
129
	return bind_static( index, value, value_length );
130
}
131
132
133
int sqlite::statement::bind_static(
134
	const std::string &name,
135
	const char *value )
136
{
137
	return bind_static( name, value, ::strlen( value ) );
138
}
139
140
141
int sqlite::statement::bind_static(
142
	const std::string &name,
143
	const std::string &value )
144
{
145
	return bind_static( name, value.c_str(), value.length() );
146
}
147
148
149
int sqlite::statement::bind_null(
150
	const std::string &name )
151
{
152
	unsigned int index = sqlite3_bind_parameter_index( _handle, name.c_str() );
153
	return bind_null( index );
154
}
155
156
157
int sqlite::statement::finalize()
158
{
159
	int error_code = SQLITE_OK;
160
161
	if( _handle ) {
162
		error_code = sqlite3_finalize( _handle );
163
		_handle = NULL;
164
	}
165
166
	return error_code;
167
}
168
169
170
template< >
171
sqlite::statement& sqlite::statement::operator << < sqlite::_null_t >(
172
	sqlite::_null_t )
173
{
174
	int error_code = bind_null( _bind_index );
175
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
176
	_bind_index++;
177
	return *this;
178
}
179
180
template< >
181
sqlite::statement& sqlite::statement::operator << < sqlite::_exec_t >(
182
	sqlite::_exec_t )
183
{
184
	int error_code = step();
185
	if( error_code != SQLITE_DONE )
186
		if( error_code == SQLITE_ROW )
187
			throw sqlite_error( "statement returned results" );
188
		else
189
			throw sqlite_error( error_code );
190
	return *this;
191
}
192
193
template< >
194
sqlite::statement& sqlite::statement::operator << < sqlite::_set_index_t >(
195
	sqlite::_set_index_t t )
196
{
197
	_bind_index = t._index;
198
	return *this;
199
}