summaryrefslogtreecommitdiff
path: root/cpp/demo/Database/Oracle/occi/Util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/demo/Database/Oracle/occi/Util.cpp')
-rw-r--r--cpp/demo/Database/Oracle/occi/Util.cpp153
1 files changed, 153 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..76591e16cb8
--- /dev/null
+++ b/cpp/demo/Database/Oracle/occi/Util.cpp
@@ -0,0 +1,153 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2011 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()),
+ _txDone(false),
+ _pool(pool)
+{
+}
+
+void
+ConnectionHolder::commit()
+{
+ _txDone = true;
+ try
+ {
+ _con->commit();
+ }
+ catch(const SQLException& e)
+ {
+ throw HR::SqlException(e.what());
+ }
+}
+
+void
+ConnectionHolder::rollback()
+{
+ _txDone = true;
+ try
+ {
+ _con->rollback();
+ }
+ catch(const SQLException& e)
+ {
+ throw HR::SqlException(e.what());
+ }
+}
+
+ConnectionHolder::~ConnectionHolder()
+{
+ if(!_txDone)
+ {
+ _txDone = true;
+ try
+ {
+ _con->rollback();
+ }
+ catch(const std::exception&)
+ {
+ }
+ }
+
+ try
+ {
+ _pool->releaseConnection(_con);
+ }
+ catch(const std::exception&)
+ {
+ }
+}
+
+StatementHolder::StatementHolder(Connection* con) :
+ _con(con),
+ _stmt(con->createStatement())
+{
+}
+
+StatementHolder::StatementHolder(const ConnectionHolderPtr& conh) :
+ _con(conh->connection()),
+ _stmt(conh->connection()->createStatement())
+{
+}
+
+StatementHolder::~StatementHolder()
+{
+ _con->terminateStatement(_stmt);
+}
+
+string
+encodeRef(const RefAny& ref, Environment* env)
+{
+ string result;
+
+ ub4 length = OCIRefHexSize(env->getOCIEnvironment(), ref.getRef());
+ OraText* buffer = new OraText[length];
+
+ OCIError* error = 0;
+ OCIHandleAlloc(env->getOCIEnvironment(), reinterpret_cast<void**>(&error), OCI_HTYPE_ERROR, 0, 0);
+ sword status = OCIRefToHex(env->getOCIEnvironment(), error, ref.getRef(), buffer, &length);
+
+ if(status == OCI_SUCCESS)
+ {
+ result.assign(reinterpret_cast<char*>(buffer), length);
+ }
+ else
+ {
+ cerr << "encodeRef failed: ";
+ sb4 errcode = 0;
+ OraText buf[512];
+ OCIErrorGet(error, 1, 0, &errcode, buf, 512, OCI_HTYPE_ERROR);
+ cerr << reinterpret_cast<char*>(buf) << endl;
+ }
+
+ OCIHandleFree(error, OCI_HTYPE_ERROR);
+ delete[] buffer;
+ return result;
+}
+
+RefAny
+decodeRef(const string& str, Environment* env, Connection* con)
+{
+ OCIRef* ref = 0;
+ OCIError* error = 0;
+ OCIHandleAlloc(env->getOCIEnvironment(), reinterpret_cast<void**>(&error), OCI_HTYPE_ERROR, 0, 0);
+
+ sword status = OCIRefFromHex(env->getOCIEnvironment(), error,
+ con->getOCIServiceContext(),
+ reinterpret_cast<const OraText*>(str.c_str()), str.length(),
+ &ref);
+
+
+
+ if(status == OCI_SUCCESS)
+ {
+ OCIHandleFree(error, OCI_HTYPE_ERROR);
+ return RefAny(con, ref);
+ }
+ else
+ {
+ cerr << "decodeRef failed: ";
+ sb4 errcode = 0;
+ OraText buf[512];
+ OCIErrorGet(error, 1, 0, &errcode, buf, 512, OCI_HTYPE_ERROR);
+ cerr << reinterpret_cast<char*>(buf) << endl;
+
+ OCIHandleFree(error, OCI_HTYPE_ERROR);
+ throw Ice::ObjectNotExistException(__FILE__, __LINE__);
+ }
+}