diff options
Diffstat (limited to 'cpp/demo/Database/Oracle/occi/Util.cpp')
-rw-r--r-- | cpp/demo/Database/Oracle/occi/Util.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/cpp/demo/Database/Oracle/occi/Util.cpp b/cpp/demo/Database/Oracle/occi/Util.cpp new file mode 100644 index 00000000000..dd7a0107c7d --- /dev/null +++ b/cpp/demo/Database/Oracle/occi/Util.cpp @@ -0,0 +1,126 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2006 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 <Ice/Ice.h> +#include <HR.h> +#include <Util.h> +#include <sstream> + +using namespace std; +using namespace oracle::occi; + +ConnectionHolder::ConnectionHolder(StatelessConnectionPool* pool) + : _con(pool->getAnyTaggedConnection()), + _pool(pool) +{ +} + +ConnectionHolder::~ConnectionHolder() +{ + if(_con != 0) + { + try + { + rollback(); + } + catch(...) + { + // ignored, to avoid a crash during + // stack unwinding + } + } +} + +void +ConnectionHolder::commit() +{ + assert(_con != 0); + try + { + _con->commit(); + } + catch(const SQLException& e) + { + release(); + throw HR::SqlException(e.what()); + } + catch(...) + { + release(); + throw; + } + release(); +} + +void +ConnectionHolder::rollback() +{ + assert(_con != 0); + try + { + _con->rollback(); + } + catch(const SQLException& e) + { + release(); + throw HR::SqlException(e.what()); + } + catch(...) + { + release(); + throw; + } + release(); +} + +void +ConnectionHolder::release() +{ + Connection* con = _con; + _con = 0; + _pool->releaseConnection(con); +} + +StatementHolder::StatementHolder(Connection* con) : + _stmt(con->createStatement()), + _con(con) +{ +} + +StatementHolder::StatementHolder(ConnectionHolder& conh) : + _stmt(conh.connection()->createStatement()), + _con(conh.connection()) +{ +} + +StatementHolder::~StatementHolder() +{ + _con->terminateStatement(_stmt); +} + +int decodeName(const string& name) +{ + int result = 0; + istringstream is(name); + is >> result; + if(!is || !is.eof()) + { + cerr << "Unable to decode " << name << endl; + throw Ice::ObjectNotExistException(__FILE__, __LINE__); + } + return result; +} + +string encodeName(int n) +{ + ostringstream os; + os << n; + return os.str(); +} + |