summaryrefslogtreecommitdiffstats
path: root/kexi/kexidb/transaction.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 01:29:50 +0000
commit8362bf63dea22bbf6736609b0f49c152f975eb63 (patch)
tree0eea3928e39e50fae91d4e68b21b1e6cbae25604 /kexi/kexidb/transaction.cpp
downloadkoffice-8362bf63dea22bbf6736609b0f49c152f975eb63.tar.gz
koffice-8362bf63dea22bbf6736609b0f49c152f975eb63.zip
Added old abandoned KDE3 version of koffice
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/koffice@1077364 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kexi/kexidb/transaction.cpp')
-rw-r--r--kexi/kexidb/transaction.cpp165
1 files changed, 165 insertions, 0 deletions
diff --git a/kexi/kexidb/transaction.cpp b/kexi/kexidb/transaction.cpp
new file mode 100644
index 000000000..c06074488
--- /dev/null
+++ b/kexi/kexidb/transaction.cpp
@@ -0,0 +1,165 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Jaroslaw Staniek <js@iidea.pl>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <kexidb/transaction.h>
+#include <kexidb/connection.h>
+
+#include <kdebug.h>
+
+#include <assert.h>
+
+//remove debug
+#undef KexiDBDbg
+#define KexiDBDbg if (0) kdDebug()
+
+using namespace KexiDB;
+
+//helper for debugging
+KEXI_DB_EXPORT int Transaction::globalcount = 0;
+KEXI_DB_EXPORT int Transaction::globalCount() { return Transaction::globalcount; }
+KEXI_DB_EXPORT int TransactionData::globalcount = 0;
+KEXI_DB_EXPORT int TransactionData::globalCount() { return TransactionData::globalcount; }
+
+TransactionData::TransactionData(Connection *conn)
+ : m_conn(conn)
+ , m_active(true)
+ , refcount(1)
+{
+ assert(conn);
+ Transaction::globalcount++; //because refcount(1) init.
+ TransactionData::globalcount++;
+ KexiDBDbg << "-- TransactionData::globalcount == " << TransactionData::globalcount << endl;
+}
+
+TransactionData::~TransactionData()
+{
+ TransactionData::globalcount--;
+ KexiDBDbg << "-- TransactionData::globalcount == " << TransactionData::globalcount << endl;
+}
+
+//---------------------------------------------------
+
+const Transaction Transaction::null;
+
+Transaction::Transaction()
+ : QObject(0,"kexidb_transaction")
+ , m_data(0)
+{
+}
+
+Transaction::Transaction( const Transaction& trans )
+ : QObject(0,"kexidb_transaction")
+ , m_data(trans.m_data)
+{
+ if (m_data) {
+ m_data->refcount++;
+ Transaction::globalcount++;
+ }
+}
+
+Transaction::~Transaction()
+{
+ if (m_data) {
+ m_data->refcount--;
+ Transaction::globalcount--;
+ KexiDBDbg << "~Transaction(): m_data->refcount==" << m_data->refcount << endl;
+ if (m_data->refcount==0)
+ delete m_data;
+ }
+ else {
+ KexiDBDbg << "~Transaction(): null" << endl;
+ }
+ KexiDBDbg << "-- Transaction::globalcount == " << Transaction::globalcount << endl;
+}
+
+Transaction& Transaction::operator=(const Transaction& trans)
+{
+ if (m_data) {
+ m_data->refcount--;
+ Transaction::globalcount--;
+ KexiDBDbg << "Transaction::operator=: m_data->refcount==" << m_data->refcount << endl;
+ if (m_data->refcount==0)
+ delete m_data;
+ }
+ m_data = trans.m_data;
+ if (m_data) {
+ m_data->refcount++;
+ Transaction::globalcount++;
+ }
+ return *this;
+}
+
+bool Transaction::operator==(const Transaction& trans) const
+{
+ return m_data==trans.m_data;
+}
+
+Connection* Transaction::connection() const
+{
+ return m_data ? m_data->m_conn : 0;
+}
+
+bool Transaction::active() const
+{
+ return m_data && m_data->m_active;
+}
+
+bool Transaction::isNull() const
+{
+ return m_data==0;
+}
+
+//---------------------------------------------------
+
+TransactionGuard::TransactionGuard( Connection& conn )
+ : m_trans( conn.beginTransaction() )
+ , m_doNothing(false)
+{
+}
+
+TransactionGuard::TransactionGuard( const Transaction& trans )
+ : m_trans(trans)
+ , m_doNothing(false)
+{
+}
+
+TransactionGuard::TransactionGuard()
+ : m_doNothing(false)
+{
+}
+
+TransactionGuard::~TransactionGuard()
+{
+ if (!m_doNothing && m_trans.active() && m_trans.connection())
+ m_trans.connection()->rollbackTransaction(m_trans);
+}
+
+bool TransactionGuard::commit()
+{
+ if (m_trans.active() && m_trans.connection()) {
+ return m_trans.connection()->commitTransaction(m_trans);
+ }
+ return false;
+}
+
+void TransactionGuard::doNothing()
+{
+ m_doNothing = true;
+}
+