/sqlite3cc

To get this branch, use:
bzr branch http://bzr.ed.am/sqlite3cc

« back to all changes in this revision

Viewing changes to include/sqlite3cc/transaction.h

  • Committer: edam
  • Date: 2010-07-27 15:46:42 UTC
  • Revision ID: edam@waxworlds.org-20100727154642-1uxrjkpxhp7xl6hq
- moved null_t, exec_t and set_index_t to detail namespace so only their extern instantiations are in the main namespace
- added immediate transation

Show diffs side-by-side

added added

removed removed

1
1
/*
2
 
 * transaction.hpp
 
2
 * transaction.h
3
3
 *
4
4
 * Copyright (C) 2009 Tim Marston <edam@waxworlds.org>
5
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.
 
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.
8
8
 *
9
9
 * This program is free software: you can redistribute it and/or modify
10
10
 * it under the terms of the GNU Lesser General Public License as published
20
20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
21
 */
22
22
 
23
 
#ifndef TRANSACTION_HPP_
24
 
#define TRANSACTION_HPP_
 
23
#ifndef SQLITE3CC_TRANSACTION_H_
 
24
#define SQLITE3CC_TRANSACTION_H_
25
25
 
26
26
 
27
27
#include <boost/utility.hpp>
 
28
#include <string>
28
29
 
29
30
 
30
31
namespace sqlite
34
35
class database;
35
36
 
36
37
 
37
 
class transaction
 
38
/**
 
39
 * A basic (default, deferred) transaction.
 
40
 */
 
41
class basic_transaction
38
42
        :
39
43
        private boost::noncopyable
40
44
{
46
50
         * Constructor that provides a database upon which to act
47
51
         * @param database a database
48
52
         */
49
 
        transaction(
 
53
        explicit basic_transaction(
50
54
                database &database );
51
55
 
52
 
        virtual ~transaction() throw( );
53
 
 
54
 
protected:
55
 
 
56
 
        /**
57
 
         * Constructor that provides a way for deriving classes to override the SQL
58
 
         * executed in beginning and rolling-back a transaction during construction
59
 
         * and destruction.
60
 
         * @param database a database
61
 
         * @param begin_sql the SQL statement used to begin the transaction
62
 
         * @param rollback_sql the SQL statement used to rollback the transaction,
63
 
         *              or an empty string if the default is to be used.
64
 
         */
65
 
        transaction(
66
 
                database &database,
67
 
                const std::string &begin_sql,
68
 
                const std::string &rollback_sql = "" );
69
 
 
70
56
//______________________________________________________________________________
71
57
//                                                              public interface
 
58
public:
 
59
 
 
60
        /**
 
61
         * Begin the transaction
 
62
         */
 
63
        virtual void begin();
72
64
 
73
65
        /**
74
66
         * Commit the transaction
78
70
        /**
79
71
         * Rollback the transaction
80
72
         */
81
 
        void rollback();
 
73
        virtual void rollback();
82
74
 
83
75
//______________________________________________________________________________
84
76
//                                                                implementation
85
77
protected:
86
78
 
87
 
        /** the database */
 
79
        /* the database on which to act */
88
80
        database &_database;
89
81
 
90
 
        /** the SQL used to rollback the transaction, or empty to use default */
91
 
        std::string _rollback_sql;
92
 
 
93
 
};
94
 
 
95
 
 
96
 
////////////////////////////////////////////////////////////////////////////////
97
 
 
98
 
 
 
82
};
 
83
 
 
84
 
 
85
////////////////////////////////////////////////////////////////////////////////
 
86
 
 
87
 
 
88
/**
 
89
 * An exclusive transaction
 
90
 */
 
91
class immediate_transaction
 
92
        :
 
93
        public basic_transaction
 
94
{
 
95
//______________________________________________________________________________
 
96
//                                                                 instantiation
 
97
public:
 
98
 
 
99
        /**
 
100
         * Constructor that provides a database upon which to act
 
101
         * @param database a database
 
102
         */
 
103
        explicit immediate_transaction(
 
104
                database &database );
 
105
 
 
106
//______________________________________________________________________________
 
107
//                                                              public interface
 
108
public:
 
109
 
 
110
        /**
 
111
         * Begin the transaction
 
112
         */
 
113
        virtual void begin();
 
114
 
 
115
};
 
116
 
 
117
 
 
118
////////////////////////////////////////////////////////////////////////////////
 
119
 
 
120
 
 
121
/**
 
122
 * An exclusive transaction
 
123
 */
99
124
class exclusive_transaction
100
125
        :
101
 
        public transaction
102
 
{
103
 
//______________________________________________________________________________
104
 
//                                                                 instantiation
105
 
public:
106
 
 
107
 
        /**
108
 
         * Constructor that provides a database upon which to act
109
 
         * @param database a database
110
 
         */
111
 
        exclusive_transaction(
112
 
                database &database );
113
 
 
114
 
};
115
 
 
116
 
 
117
 
}
118
 
 
119
 
 
120
 
#endif /* TRANSACTION_HPP_ */
 
126
        public basic_transaction
 
127
{
 
128
//______________________________________________________________________________
 
129
//                                                                 instantiation
 
130
public:
 
131
 
 
132
        /**
 
133
         * Constructor that provides a database upon which to act
 
134
         * @param database a database
 
135
         */
 
136
        explicit exclusive_transaction(
 
137
                database &database );
 
138
 
 
139
//______________________________________________________________________________
 
140
//                                                              public interface
 
141
public:
 
142
 
 
143
        /**
 
144
         * Begin the transaction
 
145
         */
 
146
        virtual void begin();
 
147
 
 
148
};
 
149
 
 
150
 
 
151
////////////////////////////////////////////////////////////////////////////////
 
152
 
 
153
 
 
154
/**
 
155
 * A recursive transaction, allowing transactions to be nested.
 
156
 */
 
157
class recursive_transaction
 
158
        :
 
159
        public basic_transaction
 
160
{
 
161
//______________________________________________________________________________
 
162
//                                                                 instantiation
 
163
public:
 
164
 
 
165
        /**
 
166
         * Constructor that provides a database upon which to act
 
167
         * @param database a database
 
168
         */
 
169
        explicit recursive_transaction(
 
170
                database &database );
 
171
 
 
172
//______________________________________________________________________________
 
173
//                                                              public interface
 
174
public:
 
175
 
 
176
        /**
 
177
         * Begin the transaction
 
178
         */
 
179
        virtual void begin();
 
180
 
 
181
        /**
 
182
         * Commit the transaction
 
183
         */
 
184
        virtual void commit();
 
185
 
 
186
        /**
 
187
         * Rollback the transaction
 
188
         */
 
189
        virtual void rollback();
 
190
 
 
191
//______________________________________________________________________________
 
192
//                                                                implementation
 
193
protected:
 
194
 
 
195
        /* this transaction's savepoint name */
 
196
        std::string _sp_name;
 
197
 
 
198
};
 
199
 
 
200
 
 
201
////////////////////////////////////////////////////////////////////////////////
 
202
 
 
203
 
 
204
/**
 
205
 * A scope guard, or sentinel for use with one of the transaction classes.
 
206
 */
 
207
template< class T = basic_transaction >
 
208
class transaction_guard
 
209
        :
 
210
        private boost::noncopyable
 
211
{
 
212
//______________________________________________________________________________
 
213
//                                                                 instantiation
 
214
public:
 
215
 
 
216
        /**
 
217
         * Constructor that provides a database upon which to act
 
218
         * @param database a database
 
219
         */
 
220
        explicit transaction_guard(
 
221
                database &database )
 
222
                :
 
223
                _transaction( database ),
 
224
                _released( false )
 
225
        {
 
226
                _transaction.begin();
 
227
        }
 
228
 
 
229
        ~transaction_guard()
 
230
        {
 
231
                if( !_released ) {
 
232
                        try {
 
233
                                _transaction.rollback();
 
234
                        }
 
235
                        catch( ... ) {
 
236
                        }
 
237
                }
 
238
        }
 
239
 
 
240
//______________________________________________________________________________
 
241
//                                                              public interface
 
242
public:
 
243
 
 
244
        /**
 
245
         * Commit the transaction
 
246
         */
 
247
        void commit()
 
248
        {
 
249
                if( !_released ) {
 
250
                        _transaction.commit();
 
251
                        _released = true;
 
252
                }
 
253
        }
 
254
 
 
255
//______________________________________________________________________________
 
256
//                                                                implementation
 
257
protected:
 
258
 
 
259
        /* the transaction */
 
260
        T _transaction;
 
261
 
 
262
        /* have we released the transaction yet? */
 
263
        bool _released;
 
264
 
 
265
};
 
266
 
 
267
 
 
268
} // namespace sqlite
 
269
 
 
270
 
 
271
#endif /* SQLITE3CC_TRANSACTION_H_ */