adding more debug messages to odbc
[csql.git] / src / adapter / SqlOdbcConnection.cxx
blob0e5358a0b6110e3dddf466cea12f636aa7eb8720
1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20 #include<os.h>
21 #include <SqlOdbcConnection.h>
22 #include <CSql.h>
23 #include<TableConfig.h>
24 #include <dlfcn.h>
25 bool SqlOdbcConnection::symbolsLoaded= false;
26 struct SQLFuncPtrs SqlOdbcConnection::ODBCFuncPtrs;
28 DbRetVal SqlOdbcConnection::loadSymbols()
30 #ifdef x86_64
31 void *handle = RTLD_DEFAULT;
32 #else
33 void *handle = (void*) -1l;
34 #endif
35 ODBCFuncPtrs.SQLAllocHandlePtr = (SQLRETURN (*)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*))dlsym(handle, "SQLAllocHandle");
36 if (!ODBCFuncPtrs.SQLAllocHandlePtr){
38 if (handle == RTLD_DEFAULT) handle = (void*) -1l; else handle = RTLD_DEFAULT;
39 ODBCFuncPtrs.SQLAllocHandlePtr = (SQLRETURN (*)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*))dlsym(handle, "SQLAllocHandle");
40 if (!ODBCFuncPtrs.SQLAllocHandlePtr) {
41 printError(ErrSysInternal, "Symbol lookup failed\n");
42 return ErrSysInternal;
45 ODBCFuncPtrs.SQLSetEnvAttrPtr = (SQLRETURN (*)(SQLHENV, SQLINTEGER, SQLPOINTER, SQLINTEGER ))dlsym(handle, "SQLSetEnvAttr");
46 if (!ODBCFuncPtrs.SQLSetEnvAttrPtr){
47 printError(ErrSysInternal, "Symbol lookup failed\n");
48 return ErrSysInternal;
51 ODBCFuncPtrs.SQLDriverConnectPtr = (SQLRETURN (*)(SQLHDBC, SQLHWND, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLUSMALLINT ))dlsym(handle, "SQLDriverConnect");
52 if (!ODBCFuncPtrs.SQLDriverConnectPtr){
53 printError(ErrSysInternal, "Symbol lookup failed\n");
54 return ErrSysInternal;
57 ODBCFuncPtrs.SQLGetDiagRecPtr = (SQLRETURN (*)(SQLSMALLINT, SQLHANDLE, SQLSMALLINT, SQLCHAR*, SQLINTEGER*, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*))dlsym(handle, "SQLGetDiagRec");
58 if (!ODBCFuncPtrs.SQLGetDiagRecPtr){
59 printError(ErrSysInternal, "Symbol lookup failed\n");
60 return ErrSysInternal;
63 ODBCFuncPtrs.SQLSetConnectAttrPtr = (SQLRETURN (*)(SQLHDBC, SQLINTEGER, SQLPOINTER, SQLINTEGER ))dlsym(handle, "SQLSetConnectAttr");
64 if (!ODBCFuncPtrs.SQLSetConnectAttrPtr){
65 printError(ErrSysInternal, "Symbol lookup failed\n");
66 return ErrSysInternal;
69 ODBCFuncPtrs.SQLProcedureColumnsPtr = (SQLRETURN (*)(SQLHSTMT, SQLCHAR *, SQLSMALLINT, SQLCHAR *, SQLSMALLINT, SQLCHAR *, SQLSMALLINT, SQLCHAR *, SQLSMALLINT))dlsym(handle, "SQLProcedureColumns");
70 if (!ODBCFuncPtrs.SQLProcedureColumnsPtr){
71 printError(ErrSysInternal, "Symbol lookup failed\n");
72 return ErrSysInternal;
75 ODBCFuncPtrs.SQLFreeHandlePtr = (SQLRETURN (*)(SQLSMALLINT,SQLHANDLE))dlsym(handle, "SQLFreeHandle");
76 if (!ODBCFuncPtrs.SQLFreeHandlePtr){
77 printError(ErrSysInternal, "Symbol lookup failed\n");
78 return ErrSysInternal;
81 ODBCFuncPtrs.SQLTransactPtr = (SQLRETURN (*)(SQLHENV, SQLHDBC, SQLUSMALLINT ))dlsym(handle, "SQLTransact");
82 if (!ODBCFuncPtrs.SQLTransactPtr){
83 printError(ErrSysInternal, "Symbol lookup failed\n");
84 return ErrSysInternal;
87 ODBCFuncPtrs.SQLExecDirectPtr = (SQLRETURN (*)(SQLHSTMT, SQLCHAR*, SQLINTEGER ))dlsym(handle, "SQLExecDirect");
88 if (!ODBCFuncPtrs.SQLExecDirectPtr){
89 printError(ErrSysInternal, "Symbol lookup failed\n");
90 return ErrSysInternal;
93 ODBCFuncPtrs.SQLPreparePtr = (SQLRETURN (*)(SQLHSTMT, SQLCHAR*, SQLINTEGER ))dlsym(handle, "SQLPrepare");
94 if (!ODBCFuncPtrs.SQLPreparePtr){
95 printError(ErrSysInternal, "Symbol lookup failed\n");
96 return ErrSysInternal;
99 ODBCFuncPtrs.SQLNumResultColsPtr = (SQLRETURN (*)(SQLHSTMT, SQLSMALLINT* ))dlsym(handle, "SQLNumResultCols");
100 if (!ODBCFuncPtrs.SQLNumResultColsPtr){
101 printError(ErrSysInternal, "Symbol lookup failed\n");
102 return ErrSysInternal;
105 ODBCFuncPtrs.SQLDescribeColPtr = (SQLRETURN (*)(SQLHSTMT, SQLUSMALLINT, SQLCHAR*, SQLSMALLINT, SQLSMALLINT*, SQLSMALLINT*, SQLULEN*,SQLSMALLINT*, SQLSMALLINT* ))dlsym(handle, "SQLDescribeCol");
106 if (!ODBCFuncPtrs.SQLDescribeColPtr){
107 printError(ErrSysInternal, "Symbol lookup failed\n");
108 return ErrSysInternal;
111 ODBCFuncPtrs.SQLBindColPtr = (SQLRETURN (*)(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLPOINTER, SQLLEN, SQLLEN* ))dlsym(handle, "SQLBindCol");
112 if (!ODBCFuncPtrs.SQLBindColPtr){
113 printError(ErrSysInternal, "Symbol lookup failed\n");
114 return ErrSysInternal;
117 ODBCFuncPtrs.SQLNumParamsPtr = (SQLRETURN (*)(SQLHSTMT, SQLSMALLINT* ))dlsym(handle, "SQLNumParams");
118 if (!ODBCFuncPtrs.SQLNumParamsPtr){
119 printError(ErrSysInternal, "Symbol lookup failed\n");
120 return ErrSysInternal;
123 ODBCFuncPtrs.SQLDescribeParamPtr = (SQLRETURN (*)(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT*, SQLULEN*, SQLSMALLINT*, SQLSMALLINT* ))dlsym(handle, "SQLDescribeParam");
124 if (!ODBCFuncPtrs.SQLDescribeParamPtr){
125 printError(ErrSysInternal, "Symbol lookup failed\n");
126 return ErrSysInternal;
129 ODBCFuncPtrs.SQLBindParameterPtr = (SQLRETURN (*)(SQLHSTMT, SQLUSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLSMALLINT, SQLULEN, SQLSMALLINT, SQLPOINTER, SQLLEN, SQLLEN* ))dlsym(handle, "SQLBindParameter");
130 if (!ODBCFuncPtrs.SQLBindParameterPtr){
131 printError(ErrSysInternal, "Symbol lookup failed\n");
132 return ErrSysInternal;
135 ODBCFuncPtrs.SQLExecutePtr = (SQLRETURN (*)(SQLHSTMT ))dlsym(handle, "SQLExecute");
136 if (!ODBCFuncPtrs.SQLExecutePtr){
137 printError(ErrSysInternal, "Symbol lookup failed\n");
138 return ErrSysInternal;
141 ODBCFuncPtrs.SQLRowCountPtr = (SQLRETURN (*)(SQLHSTMT, SQLLEN* ))dlsym(handle, "SQLRowCount");
142 if (!ODBCFuncPtrs.SQLRowCountPtr){
143 printError(ErrSysInternal, "Symbol lookup failed\n");
144 return ErrSysInternal;
147 ODBCFuncPtrs.SQLFetchPtr = (SQLRETURN (*)(SQLHSTMT ))dlsym(handle, "SQLFetch");
148 if (!ODBCFuncPtrs.SQLFetchPtr){
149 printError(ErrSysInternal, "Symbol lookup failed\n");
150 return ErrSysInternal;
153 ODBCFuncPtrs.SQLCloseCursorPtr = (SQLRETURN (*)(SQLHSTMT ))dlsym(handle, "SQLCloseCursor");
154 if (!ODBCFuncPtrs.SQLCloseCursorPtr){
155 printError(ErrSysInternal, "Symbol lookup failed\n");
156 return ErrSysInternal;
159 ODBCFuncPtrs.SQLPrimaryKeysPtr = (SQLRETURN (*)(SQLHSTMT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT, SQLCHAR*, SQLSMALLINT ))dlsym(handle, "SQLPrimaryKeys");
160 if (!ODBCFuncPtrs.SQLPrimaryKeysPtr){
161 printError(ErrSysInternal, "Symbol lookup failed\n");
162 return ErrSysInternal;
165 ODBCFuncPtrs.SQLGetDataPtr = (SQLRETURN (*)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER, SQLLEN,SQLLEN* ))dlsym(handle, "SQLGetData");
166 if (!ODBCFuncPtrs.SQLGetDataPtr){
167 printError(ErrSysInternal, "Symbol lookup failed\n");
168 return ErrSysInternal;
171 ODBCFuncPtrs.SQLDisconnectPtr = (SQLRETURN (*)(SQLHDBC))dlsym(handle, "SQLDisconnect");
172 if (!ODBCFuncPtrs.SQLDisconnectPtr){
173 printError(ErrSysInternal, "Symbol lookup failed\n");
174 return ErrSysInternal;
176 ODBCFuncPtrs.SQLTablesPtr =(SQLRETURN (*)(SQLHSTMT ,SQLCHAR *, SQLSMALLINT , SQLCHAR * , SQLSMALLINT, SQLCHAR *, SQLSMALLINT, SQLCHAR*,SQLSMALLINT))dlsym(handle,"SQLTables");
177 if (!ODBCFuncPtrs.SQLTablesPtr){
178 printError(ErrSysInternal, "Symbol lookup failed\n");
179 return ErrSysInternal;
182 symbolsLoaded=true;
183 return OK;
185 DbRetVal SqlOdbcConnection::connect (char *user, char * pass)
187 DbRetVal rv = OK;
188 char tdbname[IDENTIFIER_LENGTH];
189 char *dsnAda;
190 //Get the appropriate DSN
191 dsnAda=getDsn();
193 if(strcmp(dsnAda,"")==0)
194 rv=TableConf::config.getDsnAndTdb(Conf::config.getDSN(),dsn,tdbname);
195 else
196 rv=TableConf::config.getDsnAndTdb(dsnAda,dsn,tdbname);
198 if(rv!=OK){
199 printError(rv,"Add Entry To csqlds.conf");
200 return rv;
202 setTrDbName(tdbname);
203 int retVal =0;
204 if (!symbolsLoaded) {
205 loadSymbols();
207 if (!symbolsLoaded) {
208 printError(ErrSysFatal, "Unable to load symbols. check LD_LIBRARY_PATH");
209 return ErrSysFatal;
211 retVal = (*ODBCFuncPtrs.SQLAllocHandlePtr) (SQL_HANDLE_ENV,
212 SQL_NULL_HANDLE, &envHdl);
213 if (retVal)
215 printError(ErrSysInit, "Unable to allocate ODBC handle \n");
216 return ErrSysInit;
219 (*ODBCFuncPtrs.SQLSetEnvAttrPtr)(envHdl, SQL_ATTR_ODBC_VERSION,
220 (void *) SQL_OV_ODBC3, 0);
222 retVal = (*ODBCFuncPtrs.SQLAllocHandlePtr) (SQL_HANDLE_DBC,
223 envHdl, &dbHdl);
224 if (retVal)
226 printError(ErrSysInit, "Unable to allocate ODBC handle \n");
227 return ErrSysInit;
229 SQLCHAR outstr[1024];
230 SQLSMALLINT outstrlen;
231 retVal = (*ODBCFuncPtrs.SQLDriverConnectPtr)(dbHdl, NULL, (SQLCHAR*)dsn,
232 SQL_NTS,outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_NOPROMPT);
234 if (!SQL_SUCCEEDED(retVal)) {
235 printError(ErrSysInit, "Failed to connect to target database using dsn=%s\n", dsn);
237 SQLINTEGER i = 0;
238 SQLINTEGER native;
239 SQLCHAR state[ 7 ];
240 SQLCHAR text[256];
241 SQLSMALLINT len;
242 SQLRETURN ret;
244 fprintf(stderr,
245 "\n"
246 "The driver reported the following diagnostics whilst running "
247 "\n\n");
251 ret = (*ODBCFuncPtrs.SQLGetDiagRecPtr)(SQL_HANDLE_DBC, dbHdl, ++i,
252 state, &native, text, sizeof(text), &len );
254 if (SQL_SUCCEEDED(ret))
255 printf("%s:%ld:%ld:%s\n", state, i, native, text);
257 while( ret == SQL_SUCCESS );
258 rv = ErrNoConnection;
259 rv = OK; //masking the error:tmp
261 //printError(ErrSysInit, "Connecting with dsn=%s\n", dsn);
262 (*ODBCFuncPtrs.SQLSetConnectAttrPtr)(dbHdl, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF, 0);
263 return rv;
267 DbRetVal SqlOdbcConnection::disconnect()
269 DbRetVal rv = OK;
270 (*ODBCFuncPtrs.SQLDisconnectPtr)(dbHdl);
271 (*ODBCFuncPtrs.SQLFreeHandlePtr) (SQL_HANDLE_DBC, dbHdl);
272 (*ODBCFuncPtrs.SQLFreeHandlePtr) (SQL_HANDLE_ENV, envHdl);
273 return rv;
275 void SqlOdbcConnection::setTrDbName(char *name)
277 if(strcmp(name, "mysql")==0)
278 tdbName=mysql;
279 else if(strcmp(name, "postgres")==0)
280 tdbName = postgres;
281 return;
283 DbRetVal SqlOdbcConnection::beginTrans(IsolationLevel isoLevel, TransSyncMode mode)
285 if (prevIsoLevel == isoLevel) return OK;
286 DbRetVal rv = OK;
287 int retVal =0;
288 SQLPOINTER iso;
290 switch(isoLevel)
292 case READ_UNCOMMITTED:
293 iso = (SQLPOINTER)SQL_TXN_READ_UNCOMMITTED;
294 break;
295 case READ_COMMITTED:
296 iso = (SQLPOINTER)SQL_TXN_READ_COMMITTED;
297 break;
298 case READ_REPEATABLE:
299 iso = (SQLPOINTER)SQL_TXN_REPEATABLE_READ;
300 break;
301 default:
302 iso = (SQLPOINTER)SQL_TXN_READ_COMMITTED;
303 break;
306 retVal = (*ODBCFuncPtrs.SQLTransactPtr)(envHdl, dbHdl, SQL_ROLLBACK);
307 if (!SQL_SUCCEEDED(retVal)) rv = ErrSysInit;
308 retVal = (*ODBCFuncPtrs.SQLSetConnectAttrPtr)(dbHdl, SQL_ATTR_TXN_ISOLATION, iso, 0);
309 if (!SQL_SUCCEEDED(retVal)) return ErrSysInit;
310 prevIsoLevel = isoLevel;
311 //retVal = (*ODBCFuncPtrs.SQLTransactPtr)(envHdl, dbHdl, SQL_ROLLBACK);
312 //if (!SQL_SUCCEEDED(retVal)) rv = ErrSysInit;
313 return rv;
315 DbRetVal SqlOdbcConnection::commit()
317 DbRetVal rv = OK;
318 int retVal=0;
319 retVal = (*ODBCFuncPtrs.SQLTransactPtr)(envHdl, dbHdl, SQL_COMMIT);
320 if (!SQL_SUCCEEDED(retVal)) rv = ErrSysInit;
321 return rv;
323 DbRetVal SqlOdbcConnection::rollback()
325 DbRetVal rv = OK;
326 int retVal =0;
327 retVal = (*ODBCFuncPtrs.SQLTransactPtr)(envHdl, dbHdl, SQL_ROLLBACK);
328 if (!SQL_SUCCEEDED(retVal)) rv = ErrSysInit;
329 return rv;
331 void SqlOdbcConnection::setErrorState( SQLHDBC dbc)
333 SQLINTEGER i = 0;
334 SQLINTEGER native;
335 SQLCHAR state[ 7 ];
336 SQLCHAR text[256];
337 SQLSMALLINT len;
338 SQLRETURN ret;
339 ret = (*ODBCFuncPtrs.SQLGetDiagRecPtr)(SQL_HANDLE_DBC, dbc, ++i,
340 state, &native, text, sizeof(text), &len );
342 if (SQL_SUCCEEDED(ret)){
343 printf("%s:%ld:%ld:%s\n", state, i, native, text);
344 strcpy(errState,(char*)state);