summaryrefslogtreecommitdiff
path: root/libodb-oracle/odb/oracle/connection.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libodb-oracle/odb/oracle/connection.cxx')
-rw-r--r--libodb-oracle/odb/oracle/connection.cxx175
1 files changed, 175 insertions, 0 deletions
diff --git a/libodb-oracle/odb/oracle/connection.cxx b/libodb-oracle/odb/oracle/connection.cxx
new file mode 100644
index 0000000..5c2f7a7
--- /dev/null
+++ b/libodb-oracle/odb/oracle/connection.cxx
@@ -0,0 +1,175 @@
+// file : odb/oracle/connection.cxx
+// license : ODB NCUEL; see accompanying LICENSE file
+
+#include <oci.h>
+
+#include <string>
+
+#include <odb/oracle/database.hxx>
+#include <odb/oracle/connection.hxx>
+#include <odb/oracle/transaction.hxx>
+#include <odb/oracle/statement.hxx>
+#include <odb/oracle/error.hxx>
+#include <odb/oracle/exceptions.hxx>
+#include <odb/oracle/auto-descriptor.hxx>
+#include <odb/oracle/statement-cache.hxx>
+
+using namespace std;
+
+namespace odb
+{
+ namespace oracle
+ {
+ connection::
+ connection (connection_factory& cf)
+ : odb::connection (cf),
+ failed_ (false),
+ statement_cache_ (new statement_cache_type (*this)),
+ lob_buffer_ (0)
+ {
+ sword r (0);
+
+ database_type& db (database ());
+
+ {
+ OCIError* e (0);
+ r = OCIHandleAlloc (db.environment (),
+ reinterpret_cast<void**> (&e),
+ OCI_HTYPE_ERROR,
+ 0,
+ 0);
+
+ if (r != OCI_SUCCESS)
+ throw invalid_oci_handle ();
+
+ error_.reset (e);
+ }
+
+ auto_handle<OCIAuthInfo> auth_info;
+ {
+ OCIAuthInfo* a (0);
+ r = OCIHandleAlloc (db.environment (),
+ reinterpret_cast<void**> (&a),
+ OCI_HTYPE_AUTHINFO,
+ 0,
+ 0);
+
+ if (r != OCI_SUCCESS)
+ throw invalid_oci_handle ();
+
+ auth_info.reset (a);
+ }
+
+ r = OCIAttrSet (
+ auth_info,
+ OCI_HTYPE_AUTHINFO,
+ reinterpret_cast<OraText*> (const_cast<char*> (db.user ().c_str ())),
+ static_cast <ub4> (db.user ().size ()),
+ OCI_ATTR_USERNAME,
+ error_);
+
+ if (r == OCI_ERROR || r == OCI_INVALID_HANDLE)
+ translate_error (error_, r);
+
+ r = OCIAttrSet (
+ auth_info,
+ OCI_HTYPE_AUTHINFO,
+ reinterpret_cast<OraText*> (
+ const_cast<char*> (db.password ().c_str ())),
+ static_cast<ub4> (db.password ().size ()),
+ OCI_ATTR_PASSWORD,
+ error_);
+
+ if (r == OCI_ERROR || r == OCI_INVALID_HANDLE)
+ translate_error (error_, r);
+
+ {
+ OCISvcCtx* s (0);
+
+ r = OCISessionGet (
+ db.environment (),
+ error_,
+ &s,
+ auth_info,
+ reinterpret_cast<OraText*> (const_cast<char*> (db.db ().c_str ())),
+ static_cast<ub4> (db.db ().size ()),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ OCI_SESSGET_STMTCACHE);
+
+ if (r == OCI_ERROR || r == OCI_INVALID_HANDLE)
+ translate_error (error_, r);
+
+ handle_.reset (s, error_);
+ }
+ }
+
+ connection::
+ connection (connection_factory& cf, OCISvcCtx* handle)
+ : odb::connection (cf),
+ failed_ (false),
+ statement_cache_ (new statement_cache_type (*this)),
+ lob_buffer_ (0)
+ {
+ sword r (0);
+
+ database_type& db (database ());
+
+ {
+ OCIError* e (0);
+ r = OCIHandleAlloc (db.environment (),
+ reinterpret_cast<void**> (&e),
+ OCI_HTYPE_ERROR,
+ 0,
+ 0);
+
+ if (r != OCI_SUCCESS)
+ throw invalid_oci_handle ();
+
+ error_.reset (e);
+ }
+
+ handle_.reset (handle, error_);
+ }
+
+ connection::
+ ~connection ()
+ {
+ // Deallocate prepared statements before we close the connection.
+ //
+ recycle ();
+ clear_prepared_map ();
+ statement_cache_.reset ();
+ }
+
+ transaction_impl* connection::
+ begin ()
+ {
+ return new transaction_impl (connection_ptr (inc_ref (this)));
+ }
+
+ unsigned long long connection::
+ execute (const char* s, std::size_t n)
+ {
+ generic_statement st (*this, string (s, n));
+ return st.execute ();
+ }
+
+ // connection_factory
+ //
+ connection_factory::
+ ~connection_factory ()
+ {
+ }
+
+ void connection_factory::
+ database (database_type& db)
+ {
+ odb::connection_factory::db_ = &db;
+ db_ = &db;
+ }
+ }
+}