diff options
author | Dwayne Boone <dwayne@zeroc.com> | 2015-11-13 16:53:57 -0330 |
---|---|---|
committer | Dwayne Boone <dwayne@zeroc.com> | 2015-11-13 16:53:57 -0330 |
commit | 99c3941638f735825b1bfa9f2df764255351242b (patch) | |
tree | fdde43c6580b785e5edc9ae90c26487d9e16be13 /cpp/src/Freeze/TransactionI.cpp | |
parent | adding registerIceBT (diff) | |
download | ice-99c3941638f735825b1bfa9f2df764255351242b.tar.bz2 ice-99c3941638f735825b1bfa9f2df764255351242b.tar.xz ice-99c3941638f735825b1bfa9f2df764255351242b.zip |
Moved Freeze to its own repository
Diffstat (limited to 'cpp/src/Freeze/TransactionI.cpp')
-rw-r--r-- | cpp/src/Freeze/TransactionI.cpp | 283 |
1 files changed, 0 insertions, 283 deletions
diff --git a/cpp/src/Freeze/TransactionI.cpp b/cpp/src/Freeze/TransactionI.cpp deleted file mode 100644 index 5c69940dec3..00000000000 --- a/cpp/src/Freeze/TransactionI.cpp +++ /dev/null @@ -1,283 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#include <Freeze/TransactionI.h> -#include <Freeze/ConnectionI.h> -#include <Freeze/Exception.h> -#include <Freeze/Initialize.h> -#include <Ice/LoggerUtil.h> - -using namespace std; -using namespace Ice; - -DbTxn* -Freeze::getTxn(const Freeze::TransactionPtr& tx) -{ - return dynamic_cast<Freeze::TransactionI*>(tx.get())->dbTxn(); -} - -void -Freeze::TransactionI::commit() -{ - if(_txn == 0) - { - throw DatabaseException(__FILE__, __LINE__, "inactive transaction"); - } - - long txnId = 0; - - try - { - _connection->closeAllIterators(); - - if(_txTrace >= 1) - { - txnId = (_txn->id() & 0x7FFFFFFF) + 0x80000000L; - } - - _txn->commit(0); - - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "committed transaction " << hex << txnId << dec; - } - } - catch(const ::DbDeadlockException& dx) - { - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what(); - } - - postCompletion(false, true); - // After postCompletion is called the transaction may be - // dead. Beware! - DeadlockException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } - catch(const ::DbException& dx) - { - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "failed to commit transaction " << hex << txnId << dec << ": " << dx.what(); - } - - postCompletion(false, false); - // After postCompletion is called the transaction may be - // dead. Beware! - DatabaseException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } - postCompletion(true, false); - // After postCompletion is called the transaction may be - // dead. Beware! -} - -void -Freeze::TransactionI::rollback() -{ - rollbackInternal(false); -} - -Freeze::ConnectionPtr -Freeze::TransactionI::getConnection() const -{ - if(_txn) - { - return _connection; - } - return 0; -} - -void -Freeze::TransactionI::rollbackInternal(bool warning) -{ - if(_txn != 0) - { - long txnId = 0; - try - { - _connection->closeAllIterators(); - - if(_txTrace >= 1 || (warning && _warnRollback)) - { - txnId = (_txn->id() & 0x7FFFFFFF) + 0x80000000L; - if(warning && _warnRollback) - { - Warning warn(_communicator->getLogger()); - warn << "Freeze.Transaction: rolled back transaction " << hex << txnId << dec - << " due to destruction.\nApplication code should explicitly call rollback or commit."; - } - } - - _txn->abort(); - - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "rolled back transaction " << hex << txnId << dec; - } - } - catch(const ::DbDeadlockException& dx) - { - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what(); - } - - DeadlockException deadlockException(__FILE__, __LINE__, dx.what(), this); - - postCompletion(false, true); - // After postCompletion is called the transaction may be - // dead. Beware! - throw deadlockException; - } - catch(const ::DbException& dx) - { - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "failed to rollback transaction " << hex << txnId << dec << ": " << dx.what(); - } - - postCompletion(false, false); - // After postCompletion is called the transaction may be - // dead. Beware! - throw DatabaseException(__FILE__, __LINE__, dx.what()); - } - postCompletion(true, false); - // After postCompletion is called the transaction may be - // dead. Beware! - } -} - -void -Freeze::TransactionI::__incRef() -{ - IceUtil::Mutex::Lock sync(_refCountMutex->mutex); - _refCount++; -} - - -void -Freeze::TransactionI::__decRef() -{ - IceUtil::Mutex::Lock sync(_refCountMutex->mutex); - if(--_refCount == 0) - { - sync.release(); - delete this; - } - else if(_txn != 0 && _refCount == 1 && _connection->__getRefNoSync() == 1) - { - sync.release(); - rollbackInternal(true); - } -} - -int -Freeze::TransactionI::__getRef() const -{ - IceUtil::Mutex::Lock sync(_refCountMutex->mutex); - return _refCount; -} - -int -Freeze::TransactionI::__getRefNoSync() const -{ - return _refCount; -} - -void -Freeze::TransactionI::setPostCompletionCallback(const Freeze::PostCompletionCallbackPtr& cb) -{ - _postCompletionCallback = cb; -} - -// -// The constructor takes a ConnectionI* instead of a ConnectionIPtr -// because we have to ensure there is no call to __decRef while the -// transaction or the connection are not assigned to a Ptr in -// user-code. -// -Freeze::TransactionI::TransactionI(ConnectionI* connection) : - _communicator(connection->communicator()), - _connection(connection), - _txTrace(connection->txTrace()), - _warnRollback(_communicator->getProperties()->getPropertyAsIntWithDefault("Freeze.Warn.Rollback", 1)), - _txn(0), - _refCountMutex(connection->_refCountMutex), - _refCount(0) -{ - try - { - _connection->dbEnv()->getEnv()->txn_begin(0, &_txn, 0); - - if(_txTrace >= 1) - { - long txnId = (_txn->id() & 0x7FFFFFFF) + 0x80000000L; - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "started transaction " << hex << txnId << dec; - } - } - catch(const ::DbException& dx) - { - if(_txTrace >= 1) - { - Trace out(_communicator->getLogger(), "Freeze.Transaction"); - out << "failed to start transaction: " << dx.what(); - } - - DatabaseException ex(__FILE__, __LINE__); - ex.message = dx.what(); - throw ex; - } -} - - -Freeze::TransactionI::~TransactionI() -{ - assert(_txn == 0); -} - -void -Freeze::TransactionI::postCompletion(bool committed, bool deadlock) -{ - // The order of assignment in this method is very important as - // calling both the post completion callback and - // Connection::clearTransaction may alter the transaction - // reference count which checks _txn. - - { - // - // We synchronize here as _txn is checked (read) in the refcounting code - // - IceUtil::Mutex::Lock sync(_refCountMutex->mutex); - _txn = 0; - } - - if(_postCompletionCallback != 0) - { - PostCompletionCallbackPtr cb = _postCompletionCallback; - _postCompletionCallback = 0; - - cb->postCompletion(committed, deadlock, _connection->dbEnv()); - } - - ConnectionIPtr connection = _connection; - _connection = 0; - - connection->clearTransaction(); // may release the last _refCount -} |