SOCI Logo Get SOCI at SourceForge.net. Fast, secure and Free Open Source software downloads

session.cpp

Go to the documentation of this file.
00001 //
00002 // Copyright (C) 2004-2006 Maciej Sobczak, Stephen Hutton, David Courtney
00003 // Distributed under the Boost Software License, Version 1.0.
00004 // (See accompanying file LICENSE_1_0.txt or copy at
00005 // http://www.boost.org/LICENSE_1_0.txt)
00006 //
00007 
00008 #define SOCI_ODBC_SOURCE
00009 #include "soci-odbc.h"
00010 
00011 using namespace soci;
00012 using namespace soci::details;
00013 
00014 odbc_session_backend::odbc_session_backend(std::string const & connectString)
00015     : henv_(0), hdbc_(0)
00016 {
00017     SQLRETURN rc;
00018 
00019     // Allocate environment handle
00020     rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv_);
00021     if (is_odbc_error(rc))
00022     {
00023         throw soci_error("Unable to get environment handle");
00024     }
00025 
00026     // Set the ODBC version environment attribute
00027     rc = SQLSetEnvAttr(henv_, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
00028     if (is_odbc_error(rc))
00029     {
00030         throw odbc_soci_error(SQL_HANDLE_ENV, henv_,
00031                          "Setting ODBC version");
00032     }
00033 
00034     // Allocate connection handle
00035     rc = SQLAllocHandle(SQL_HANDLE_DBC, henv_, &hdbc_);
00036     if (is_odbc_error(rc))
00037     {
00038         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00039                          "Allocating connection handle");
00040     }
00041 
00042     SQLCHAR outConnString[1024];
00043     SQLSMALLINT strLength;
00044 
00045     rc = SQLDriverConnect(hdbc_, NULL, // windows handle
00046                           (SQLCHAR *)connectString.c_str(),
00047                           (SQLSMALLINT)connectString.size(),
00048                           outConnString, 1024,
00049                           &strLength, SQL_DRIVER_NOPROMPT);
00050 
00051     if (is_odbc_error(rc))
00052     {
00053         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00054                          "Error Connecting to database");
00055     }
00056 
00057     reset_transaction();
00058 }
00059 
00060 odbc_session_backend::~odbc_session_backend()
00061 {
00062     clean_up();
00063 }
00064 
00065 void odbc_session_backend::begin()
00066 {
00067     SQLRETURN rc = SQLSetConnectAttr( hdbc_, SQL_ATTR_AUTOCOMMIT,
00068                     (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );
00069     if (is_odbc_error(rc))
00070     {
00071         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00072                          "Begin Transaction");
00073     }
00074 }
00075 
00076 void odbc_session_backend::commit()
00077 {
00078     SQLRETURN rc = SQLEndTran(SQL_HANDLE_DBC, hdbc_, SQL_COMMIT);
00079     if (is_odbc_error(rc))
00080     {
00081         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00082                          "Commiting");
00083     }
00084     reset_transaction();
00085 }
00086 
00087 void odbc_session_backend::rollback()
00088 {
00089     SQLRETURN rc = SQLEndTran(SQL_HANDLE_DBC, hdbc_, SQL_ROLLBACK);
00090     if (is_odbc_error(rc))
00091     {
00092         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00093                          "Rolling back");
00094     }
00095     reset_transaction();
00096 }
00097 
00098 void odbc_session_backend::reset_transaction()
00099 {
00100     SQLRETURN rc = SQLSetConnectAttr( hdbc_, SQL_ATTR_AUTOCOMMIT,
00101                     (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0 );
00102     if (is_odbc_error(rc))
00103     {
00104         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00105                             "Set Auto Commit");
00106     }
00107 }
00108 
00109 
00110 void odbc_session_backend::clean_up()
00111 {
00112     SQLRETURN rc = SQLDisconnect(hdbc_);
00113     if (is_odbc_error(rc))
00114     {
00115         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00116                             "SQLDisconnect");
00117     }
00118 
00119     rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc_);
00120     if (is_odbc_error(rc))
00121     {
00122         throw odbc_soci_error(SQL_HANDLE_DBC, hdbc_,
00123                             "SQLFreeHandle DBC");
00124     }
00125 
00126     rc = SQLFreeHandle(SQL_HANDLE_ENV, henv_);
00127     if (is_odbc_error(rc))
00128     {
00129         throw odbc_soci_error(SQL_HANDLE_ENV, henv_,
00130                             "SQLFreeHandle ENV");
00131     }
00132 }
00133 
00134 odbc_statement_backend * odbc_session_backend::make_statement_backend()
00135 {
00136     return new odbc_statement_backend(*this);
00137 }
00138 
00139 odbc_rowid_backend * odbc_session_backend::make_rowid_backend()
00140 {
00141     return new odbc_rowid_backend(*this);
00142 }
00143 
00144 odbc_blob_backend * odbc_session_backend::make_blob_backend()
00145 {
00146     return new odbc_blob_backend(*this);
00147 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
SourceForge Logo

Generated on Sun Oct 3 2010 17:42:16 for EXTRAS-SOCI by Doxygen 1.7.1