/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>
27
28
29
sqlite::basic_transaction::basic_transaction(
1 by edam
- initial commit
30
	database &database )
31
	:
32
	_database( database )
33
{
3 by edam
- rewrote transaction classes and added transaction_guard
34
}
35
36
37
void sqlite::basic_transaction::begin()
38
{
1 by edam
- initial commit
39
	int error_code = _database.exec( "BEGIN" );
40
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
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
{
46
	int error_code = _database.exec( "COMMIT" );
47
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
48
}
49
50
3 by edam
- rewrote transaction classes and added transaction_guard
51
void sqlite::basic_transaction::rollback()
1 by edam
- initial commit
52
{
3 by edam
- rewrote transaction classes and added transaction_guard
53
	int error_code = _database.exec( "ROLLBACK" );
1 by edam
- initial commit
54
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
55
}
56
57
58
sqlite::exclusive_transaction::exclusive_transaction(
59
	database &database )
60
	:
3 by edam
- rewrote transaction classes and added transaction_guard
61
	basic_transaction( database )
62
{
63
}
64
65
66
void sqlite::exclusive_transaction::begin()
67
{
68
	int error_code = _database.exec( "BEGIN EXCLUSIVE" );
69
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
70
}
71
72
73
sqlite::recursive_transaction::recursive_transaction(
74
	database &database )
75
	:
76
	basic_transaction( database )
77
{
78
	static unsigned long long i = 0;
79
	unsigned long long my_i;
80
	static boost::mutex mutex;
81
	{
82
		boost::lock_guard< boost::mutex > lock( mutex );
83
		my_i = i++;
84
	}
85
	_sp_name = "_" + boost::lexical_cast< std::string >( my_i++ );
86
}
87
88
89
void sqlite::recursive_transaction::begin()
90
{
91
	int error_code = _database.exec( "SAVEPOINT " + _sp_name );
92
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
93
}
94
95
96
void sqlite::recursive_transaction::commit()
97
{
98
	int error_code = _database.exec( "RELEASE " + _sp_name );
99
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
100
}
101
102
103
void sqlite::recursive_transaction::rollback()
104
{
105
	int error_code = _database.exec( "ROLLBACK TO " + _sp_name );
106
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
107
108
	// we have rolled back this transaction's savepoint, but the savepoint will
109
	// remain on the transaction stack unless we also release it
110
	error_code = _database.exec( "RELEASE " + _sp_name );
111
	if( error_code != SQLITE_OK ) throw sqlite_error( error_code );
1 by edam
- initial commit
112
}