/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
 * transaction.cc
1 by edam
- initial commit
3
 *
4
 * Copyright (C) 2009 Tim Marston <edam@waxworlds.org>
5
 *
2 by edam
- further initial development
6
 * This file is part of sqlite3cc (hereafter referred to as "this program").
7
 * See http://www.waxworlds.org/edam/software/sqlite3cc for more information.
1 by edam
- initial commit
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
2 by edam
- further initial development
23
#include <sqlite3cc/transaction.h>
24
#include <sqlite3cc/database.h>
25
#include <sqlite3cc/exception.h>
3 by edam
- rewrote transaction classes and added transaction_guard
26
#include <boost/thread.hpp>
9 by edam
- added NEWS
27
#include <boost/lexical_cast.hpp>
3 by edam
- rewrote transaction classes and added transaction_guard
28
29
30
sqlite::basic_transaction::basic_transaction(
1 by edam
- initial commit
31
	database &database )
32
	:
33
	_database( database )
34
{
3 by edam
- rewrote transaction classes and added transaction_guard
35
}
36
37
38
void sqlite::basic_transaction::begin()
39
{
11 by edam
- update TODO
40
	_database.exec( "BEGIN" );
1 by edam
- initial commit
41
}
42
43
3 by edam
- rewrote transaction classes and added transaction_guard
44
void sqlite::basic_transaction::commit()
1 by edam
- initial commit
45
{
11 by edam
- update TODO
46
	_database.exec( "COMMIT" );
1 by edam
- initial commit
47
}
48
49
13 by edam
- made basic_statement::step() protected, for use by query and command only
50
void sqlite::basic_transaction::invalidate_queries()
51
{
52
	while( sqlite3_stmt *handle = sqlite3_next_stmt( _database._handle, NULL ) )
15 by edam
- fixed error caused by finialising in-progress queries during rollback that were later finaliased by RAII.
53
		if( int code = sqlite3_reset( handle ) )
13 by edam
- made basic_statement::step() protected, for use by query and command only
54
			throw sqlite_error( _database, code );
55
}
56
57
3 by edam
- rewrote transaction classes and added transaction_guard
58
void sqlite::basic_transaction::rollback()
1 by edam
- initial commit
59
{
13 by edam
- made basic_statement::step() protected, for use by query and command only
60
	// we must invalidate any active queries when rolling back
61
	invalidate_queries();
11 by edam
- update TODO
62
	_database.exec( "ROLLBACK" );
1 by edam
- initial commit
63
}
64
65
12 by edam
- moved null_t, exec_t and set_index_t to detail namespace so only their extern instantiations are in the main namespace
66
sqlite::immediate_transaction::immediate_transaction(
67
	database &database )
68
	:
69
	basic_transaction( database )
70
{
71
}
72
73
74
void sqlite::immediate_transaction::begin()
75
{
76
	_database.exec( "BEGIN IMMEDIATE" );
77
}
78
79
1 by edam
- initial commit
80
sqlite::exclusive_transaction::exclusive_transaction(
81
	database &database )
82
	:
3 by edam
- rewrote transaction classes and added transaction_guard
83
	basic_transaction( database )
84
{
85
}
86
87
88
void sqlite::exclusive_transaction::begin()
89
{
11 by edam
- update TODO
90
	_database.exec( "BEGIN EXCLUSIVE" );
3 by edam
- rewrote transaction classes and added transaction_guard
91
}
92
93
94
sqlite::recursive_transaction::recursive_transaction(
95
	database &database )
96
	:
97
	basic_transaction( database )
98
{
99
	static unsigned long long i = 0;
13 by edam
- made basic_statement::step() protected, for use by query and command only
100
	static boost::mutex mutex;
3 by edam
- rewrote transaction classes and added transaction_guard
101
	unsigned long long my_i;
102
	{
103
		boost::lock_guard< boost::mutex > lock( mutex );
104
		my_i = i++;
105
	}
106
	_sp_name = "_" + boost::lexical_cast< std::string >( my_i++ );
107
}
108
109
110
void sqlite::recursive_transaction::begin()
111
{
11 by edam
- update TODO
112
	_database.exec( "SAVEPOINT " + _sp_name );
3 by edam
- rewrote transaction classes and added transaction_guard
113
}
114
115
116
void sqlite::recursive_transaction::commit()
117
{
11 by edam
- update TODO
118
	_database.exec( "RELEASE " + _sp_name );
3 by edam
- rewrote transaction classes and added transaction_guard
119
}
120
121
122
void sqlite::recursive_transaction::rollback()
123
{
13 by edam
- made basic_statement::step() protected, for use by query and command only
124
	// we must invalidate any active queries when rolling back
125
	invalidate_queries();
11 by edam
- update TODO
126
	_database.exec( "ROLLBACK TO " + _sp_name );
3 by edam
- rewrote transaction classes and added transaction_guard
127
128
	// we have rolled back this transaction's savepoint, but the savepoint will
129
	// remain on the transaction stack unless we also release it
11 by edam
- update TODO
130
	_database.exec( "RELEASE " + _sp_name );
1 by edam
- initial commit
131
}