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 }
Generated on Sun Oct 3 2010 17:42:16 for EXTRAS-SOCI by Doxygen 1.7.1