Transaction.h
1/* Copyright (C) 2006-2026 by Tommi Maekitalo
2 Copyright (C) 2006-2026 by Marc Boris Duerner
3 SPDX-License-Identifier: LGPL-2.1-or-later WITH mif-exception
4*/
5
6#ifndef PT_DB_TRANSACTION_H
7#define PT_DB_TRANSACTION_H
8
9#include <Pt/Db/Api.h>
10#include <Pt/Db/Connection.h>
11#include <Pt/NonCopyable.h>
12#include <Pt/Signal.h>
13
14namespace Pt {
15
16namespace Db {
17
49class Transaction : private NonCopyable
50{
51 private:
52 Connection& _connection;
53 bool _active;
54 Pt::Signal<> _startFinished;
55 Pt::Signal<> _commitFinished;
56 Pt::Signal<> _rollbackFinished;
57
58 public:
63 Transaction(Connection& conn, bool starttransaction = true)
64 : _connection(conn)
65 , _active(false)
66 {
67 if (starttransaction)
68 {
69 begin();
70 }
71 }
72
76 {
77 if (_active)
78 {
79 try
80 {
81 rollback();
82 }
83 catch (const std::exception&)
84 {
85 }
86 }
87 }
88
92 { return _connection; }
93
98 void begin()
99 {
100 if (_active)
101 rollback();
102 _connection.startTransaction(onGetBeginSql());
103 _active = true;
104 }
105
110 void commit()
111 {
112 if (_active)
113 {
114 _connection.commitTransaction(onGetCommitSql());
115 _active = false;
116 }
117 }
118
123 void rollback()
124 {
125 if (_active)
126 {
127 _connection.rollbackTransaction(onGetRollbackSql());
128 _active = false;
129 }
130 }
131
135 {
136 if(_active)
137 rollback();
138 _connection.beginStartTransaction(*this, onGetBeginSql());
139 }
140
143 void endStart()
144 {
145 _connection.endStartTransaction();
146 _active = true;
147 }
148
152 { return _startFinished; }
153
157 {
158 _active = false;
159 _connection.beginCommitTransaction(*this, onGetCommitSql());
160 }
161
165 {
166 _connection.endCommitTransaction();
167 }
168
172 { return _commitFinished; }
173
174
178 {
179 _active = false;
180 _connection.beginRollbackTransaction(*this, onGetRollbackSql());
181 }
182
186 {
187 _connection.endRollbackTransaction();
188 }
189
193 { return _rollbackFinished; }
194
195 protected:
198 virtual const char* onGetBeginSql()
199 { return nullptr; }
200
203 virtual const char* onGetCommitSql()
204 { return nullptr; }
205
208 virtual const char* onGetRollbackSql()
209 { return nullptr; }
210};
211
212
223{
224 public:
227 SqliteTransaction(Connection& conn, bool start = true, bool immediate = false)
228 : Transaction(conn, false)
229 , _immediate(immediate)
230 {
231 if(start)
232 begin();
233 }
234
235 protected:
236 const char* onGetBeginSql() override
237 {
238 return _immediate ? "BEGIN IMMEDIATE TRANSACTION" : nullptr;
239 }
240
241 private:
242 bool _immediate;
243};
244
245} // namespace Db
246
247} // namespace Pt
248
249#endif // PT_DB_TRANSACTION_H
Database session for a registered driver.
Definition Connection.h:97
SqliteTransaction(Connection &conn, bool start=true, bool immediate=false)
Creates a SQLite transaction on conn.
Definition Transaction.h:227
const char * onGetBeginSql() override
Returns SQL for BEGIN, or a null pointer for the backend default.
Definition Transaction.h:236
void rollback()
Rolls back the active transaction.
Definition Transaction.h:123
void endStart()
Completes an asynchronous begin-transaction.
Definition Transaction.h:143
void beginStart()
Starts an asynchronous begin-transaction.
Definition Transaction.h:134
void endCommit()
Completes an asynchronous commit.
Definition Transaction.h:164
virtual const char * onGetBeginSql()
Returns SQL for BEGIN, or a null pointer for the backend default.
Definition Transaction.h:198
Transaction(Connection &conn, bool starttransaction=true)
Creates a transaction on conn.
Definition Transaction.h:63
Pt::Signal & rollbackFinished()
Signal emitted when an asynchronous rollback completes.
Definition Transaction.h:192
Pt::Signal & startFinished()
Signal emitted when an asynchronous begin completes.
Definition Transaction.h:151
~Transaction()
Rolls back an active transaction and destroys the object.
Definition Transaction.h:75
void beginRollback()
Starts an asynchronous rollback.
Definition Transaction.h:177
virtual const char * onGetCommitSql()
Returns SQL for COMMIT, or a null pointer for the backend default.
Definition Transaction.h:203
virtual const char * onGetRollbackSql()
Returns SQL for ROLLBACK, or a null pointer for the backend default.
Definition Transaction.h:208
void endRollback()
Completes an asynchronous rollback.
Definition Transaction.h:185
Pt::Signal & commitFinished()
Signal emitted when an asynchronous commit completes.
Definition Transaction.h:171
void beginCommit()
Starts an asynchronous commit.
Definition Transaction.h:156
void begin()
Begins a deferred transaction.
Definition Transaction.h:98
void commit()
Commits the active transaction.
Definition Transaction.h:110
const Connection & getConnection() const
Returns the connection this transaction uses.
Definition Transaction.h:91
NonCopyable()
Default constructor.
Definition NonCopyable.h:63
Multicast Signal to call multiple slots.
Definition Signal.h:190
Portable SQL database access.
Core module.
Definition Allocator.h:33