/sqlite3cc

To get this branch, use:
bzr branch http://bzr.ed.am/sqlite3cc
1 by edam
- initial commit
1
/*
2 by edam
- further initial development
2
 * command.h
1 by edam
- initial commit
3
 *
22 by edam
updated email and web addresses
4
 * Copyright (C) 2009 Tim Marston <tim@ed.am>
1 by edam
- initial commit
5
 *
2 by edam
- further initial development
6
 * This file is part of sqlite3cc (hereafter referred to as "this program").
22 by edam
updated email and web addresses
7
 * See http://ed.am/dev/sqlite3cc for more information.
8
 *
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
12
 * later version.
13
 *
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
17
 * details.
1 by edam
- initial commit
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
2 by edam
- further initial development
23
#ifndef SQLITE3CC_COMMAND_H_
24
#define SQLITE3CC_COMMAND_H_
25
26
27
#include <sqlite3cc/basic_statement.h>
1 by edam
- initial commit
28
29
30
namespace sqlite
31
{
32
33
34
/**
22 by edam
updated email and web addresses
35
 * The command class represents an SQL command.  Since there is very little
1 by edam
- initial commit
36
 * difference between a command an a statement, it is basically a shim around
37
 * the statement class with the addition of an exec() method to execute the
38
 * command.
39
 */
40
class command
41
	:
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
42
	public detail::basic_statement
1 by edam
- initial commit
43
{
44
//______________________________________________________________________________
45
//                                                                 instantiation
46
public:
47
48
	/**
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
49
	 * Constructor that provides a connection upon which to act and the SQL
2 by edam
- further initial development
50
	 * command to execute.
22 by edam
updated email and web addresses
51
	 *
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
52
	 * @param connection a reference to a connection
1 by edam
- initial commit
53
	 * @param sql an SQL statement in UTF-8
54
	 */
2 by edam
- further initial development
55
	explicit command(
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
56
		connection &connection,
2 by edam
- further initial development
57
		const std::string &sql );
58
59
	/**
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
60
	 * Constructor that provides a connection upon which to act.
22 by edam
updated email and web addresses
61
	 *
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
62
	 * @param connection a reference to a connection
2 by edam
- further initial development
63
	 */
64
	explicit command(
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
65
		connection &connection );
1 by edam
- initial commit
66
67
//______________________________________________________________________________
68
//                                                              public interface
69
public:
70
71
	/**
2 by edam
- further initial development
72
	 * Prepare an SQL statement.
22 by edam
updated email and web addresses
73
	 *
2 by edam
- further initial development
74
	 * @param sql an SQL statement in UTF-8
75
	 * @returns an sqlite error code
76
	 * @see sqlite3_prepare_v2()
77
	 */
78
	virtual int prepare(
79
		const std::string &sql );
80
81
	/**
22 by edam
updated email and web addresses
82
	 * Step through one execution cycle of the SQL statement.  If this is an SQL
2 by edam
- further initial development
83
	 * statement that doesn't return any rows, only one cycle is required,
84
	 * otherwise, each cycle will return another row
22 by edam
updated email and web addresses
85
	 *
2 by edam
- further initial development
86
	 * @return an sqlite error code
87
	 * @see sqlite3_step()
88
	 */
13 by edam
- made basic_statement::step() protected, for use by query and command only
89
	int step();
2 by edam
- further initial development
90
91
	/**
22 by edam
updated email and web addresses
92
	 * Execute the command.  This is the same as doing a step().
93
	 *
2 by edam
- further initial development
94
	 * @return an sqlite error code
1 by edam
- initial commit
95
	 * @see sqlite3_step()
96
	 */
97
	inline int exec()
98
	{
99
		return step();
100
	}
101
2 by edam
- further initial development
102
	/**
103
	 * Get the number of changes made by the last successful execution of this
22 by edam
updated email and web addresses
104
	 * command.  This doesn't include changes made in trigger subcontexts.
105
	 *
2 by edam
- further initial development
106
	 * @return the number of changed rows
107
	 * @see sqlite3_changes()
108
	 */
109
	inline int changes()
110
	{
111
		return _changes;
112
	}
113
114
	/**
115
	 * Get the number of changes made by the last successful execution of this
22 by edam
updated email and web addresses
116
	 * command.  This includes changes made in all trigger subcontexts.
117
	 *
2 by edam
- further initial development
118
	 * @return the number of changed rows
119
	 * @see sqlite3_total_changes()
120
	 */
121
	inline int total_changes()
122
	{
123
		return _total_changes;
124
	}
125
126
	/**
127
	 * Get the rowid of the last row inserted via a successful INSERT command
128
	 * (regardless of whether that is this command or not).
22 by edam
updated email and web addresses
129
	 *
2 by edam
- further initial development
130
	 * @return the last inserted rowid
131
	 */
132
	inline long long last_insert_rowid()
133
	{
134
		return _last_insert_rowid;
135
	}
136
137
//______________________________________________________________________________
138
//                                                                implementation
139
private:
140
141
	/** non-recursive number of changes made by the last execution */
142
	int _changes;
143
144
	/** recursive number of changes made by the last execution */
145
	int _total_changes;
146
147
	/** the rowid of the last successful insert command */
148
	long long _last_insert_rowid;
149
1 by edam
- initial commit
150
};
151
152
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
153
namespace detail
154
{
155
156
157
// template specialisations for detail::basic_statement::operator <<()
14 by edam
- moved basic_statement::operator <<() back to basic_statement and just create another specialisation in command so that it can use sqlite::exec
158
template< >
159
basic_statement &basic_statement::operator << < detail::exec_t >(
13 by edam
- made basic_statement::step() protected, for use by query and command only
160
	const detail::exec_t & );
161
162
16 by edam
- renamed database to connection to better identify what it is (would database_connection be better though?)
163
} // namespace detail
164
165
2 by edam
- further initial development
166
} // namespace sqlite
167
168
169
#endif /* SQLITE3CC_COMMAND_H_ */