1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 #include "ORealDriver.hxx"
27 #include "odbc/ODriver.hxx"
28 #include "odbc/OTools.hxx"
29 #include "odbc/OFunctions.hxx"
30 #include "diagnose_ex.h"
31 
32 namespace connectivity
33 {
34 	sal_Bool LoadFunctions(oslModule pODBCso);
35 	sal_Bool LoadLibrary_ODBC3(::rtl::OUString &_rPath);
36 	// extern declaration of the function pointer
37 	extern T3SQLAllocHandle pODBC3SQLAllocHandle;
38 	extern T3SQLConnect pODBC3SQLConnect;
39 	extern T3SQLDriverConnect pODBC3SQLDriverConnect;
40 	extern T3SQLBrowseConnect pODBC3SQLBrowseConnect;
41 	extern T3SQLDataSources pODBC3SQLDataSources;
42 	extern T3SQLDrivers pODBC3SQLDrivers;
43 	extern T3SQLGetInfo pODBC3SQLGetInfo;
44 	extern T3SQLGetFunctions pODBC3SQLGetFunctions;
45 	extern T3SQLGetTypeInfo pODBC3SQLGetTypeInfo;
46 	extern T3SQLSetConnectAttr pODBC3SQLSetConnectAttr;
47 	extern T3SQLGetConnectAttr pODBC3SQLGetConnectAttr;
48 	extern T3SQLSetEnvAttr pODBC3SQLSetEnvAttr;
49 	extern T3SQLGetEnvAttr pODBC3SQLGetEnvAttr;
50 	extern T3SQLSetStmtAttr pODBC3SQLSetStmtAttr;
51 	extern T3SQLGetStmtAttr pODBC3SQLGetStmtAttr;
52 	//extern T3SQLSetDescField pODBC3SQLSetDescField;
53 	//extern T3SQLGetDescField pODBC3SQLGetDescField;
54 	//extern T3SQLGetDescRec pODBC3SQLGetDescRec;
55 	//extern T3SQLSetDescRec pODBC3SQLSetDescRec;
56 	extern T3SQLPrepare pODBC3SQLPrepare;
57 	extern T3SQLBindParameter pODBC3SQLBindParameter;
58 	//extern T3SQLGetCursorName pODBC3SQLGetCursorName;
59 	extern T3SQLSetCursorName pODBC3SQLSetCursorName;
60 	extern T3SQLExecute pODBC3SQLExecute;
61 	extern T3SQLExecDirect pODBC3SQLExecDirect;
62 	//extern T3SQLNativeSql pODBC3SQLNativeSql;
63 	extern T3SQLDescribeParam pODBC3SQLDescribeParam;
64 	extern T3SQLNumParams pODBC3SQLNumParams;
65 	extern T3SQLParamData pODBC3SQLParamData;
66 	extern T3SQLPutData pODBC3SQLPutData;
67 	extern T3SQLRowCount pODBC3SQLRowCount;
68 	extern T3SQLNumResultCols pODBC3SQLNumResultCols;
69 	extern T3SQLDescribeCol pODBC3SQLDescribeCol;
70 	extern T3SQLColAttribute pODBC3SQLColAttribute;
71 	extern T3SQLBindCol pODBC3SQLBindCol;
72 	extern T3SQLFetch pODBC3SQLFetch;
73 	extern T3SQLFetchScroll pODBC3SQLFetchScroll;
74 	extern T3SQLGetData pODBC3SQLGetData;
75 	extern T3SQLSetPos pODBC3SQLSetPos;
76 	extern T3SQLBulkOperations pODBC3SQLBulkOperations;
77 	extern T3SQLMoreResults pODBC3SQLMoreResults;
78 	//extern T3SQLGetDiagField pODBC3SQLGetDiagField;
79 	extern T3SQLGetDiagRec pODBC3SQLGetDiagRec;
80 	extern T3SQLColumnPrivileges pODBC3SQLColumnPrivileges;
81 	extern T3SQLColumns pODBC3SQLColumns;
82 	extern T3SQLForeignKeys pODBC3SQLForeignKeys;
83 	extern T3SQLPrimaryKeys pODBC3SQLPrimaryKeys;
84 	extern T3SQLProcedureColumns pODBC3SQLProcedureColumns;
85 	extern T3SQLProcedures pODBC3SQLProcedures;
86 	extern T3SQLSpecialColumns pODBC3SQLSpecialColumns;
87 	extern T3SQLStatistics pODBC3SQLStatistics;
88 	extern T3SQLTablePrivileges pODBC3SQLTablePrivileges;
89 	extern T3SQLTables pODBC3SQLTables;
90 	extern T3SQLFreeStmt pODBC3SQLFreeStmt;
91 	extern T3SQLCloseCursor pODBC3SQLCloseCursor;
92 	extern T3SQLCancel pODBC3SQLCancel;
93 	extern T3SQLEndTran pODBC3SQLEndTran;
94 	extern T3SQLDisconnect pODBC3SQLDisconnect;
95 	extern T3SQLFreeHandle pODBC3SQLFreeHandle;
96 	extern T3SQLGetCursorName pODBC3SQLGetCursorName;
97 	extern T3SQLNativeSql pODBC3SQLNativeSql;
98 
99 
100 	namespace odbc
101 	{
102 		class ORealObdcDriver : public ODBCDriver
103 		{
104 		protected:
105 			virtual oslGenericFunction  getOdbcFunction(sal_Int32 _nIndex)  const;
106 			virtual SQLHANDLE	EnvironmentHandle(::rtl::OUString &_rPath);
107 		public:
ORealObdcDriver(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & _rxFactory)108 			ORealObdcDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) : ODBCDriver(_rxFactory) {}
109 		};
110 
111 		//------------------------------------------------------------------
getOdbcFunction(sal_Int32 _nIndex) const112 oslGenericFunction ORealObdcDriver::getOdbcFunction(sal_Int32 _nIndex) const
113 {
114 	oslGenericFunction pFunction = NULL;
115 	switch(_nIndex)
116 	{
117 		case ODBC3SQLAllocHandle:
118 			pFunction = (oslGenericFunction)pODBC3SQLAllocHandle;
119 			break;
120 		case ODBC3SQLConnect:
121 			pFunction = (oslGenericFunction)pODBC3SQLConnect;
122 			break;
123 		case ODBC3SQLDriverConnect:
124 			pFunction = (oslGenericFunction)pODBC3SQLDriverConnect;
125 			break;
126 		case ODBC3SQLBrowseConnect:
127 			pFunction = (oslGenericFunction)pODBC3SQLBrowseConnect;
128 			break;
129 		case ODBC3SQLDataSources:
130 			pFunction = (oslGenericFunction)pODBC3SQLDataSources;
131 			break;
132 		case ODBC3SQLDrivers:
133 			pFunction = (oslGenericFunction)pODBC3SQLDrivers;
134 			break;
135 		case ODBC3SQLGetInfo:
136 
137 			pFunction = (oslGenericFunction)pODBC3SQLGetInfo;
138 			break;
139 		case ODBC3SQLGetFunctions:
140 
141 			pFunction = (oslGenericFunction)pODBC3SQLGetFunctions;
142 			break;
143 		case ODBC3SQLGetTypeInfo:
144 
145 			pFunction = (oslGenericFunction)pODBC3SQLGetTypeInfo;
146 			break;
147 		case ODBC3SQLSetConnectAttr:
148 
149 			pFunction = (oslGenericFunction)pODBC3SQLSetConnectAttr;
150 			break;
151 		case ODBC3SQLGetConnectAttr:
152 
153 			pFunction = (oslGenericFunction)pODBC3SQLGetConnectAttr;
154 			break;
155 		case ODBC3SQLSetEnvAttr:
156 
157 			pFunction = (oslGenericFunction)pODBC3SQLSetEnvAttr;
158 			break;
159 		case ODBC3SQLGetEnvAttr:
160 
161 			pFunction = (oslGenericFunction)pODBC3SQLGetEnvAttr;
162 			break;
163 		case ODBC3SQLSetStmtAttr:
164 
165 			pFunction = (oslGenericFunction)pODBC3SQLSetStmtAttr;
166 			break;
167 		case ODBC3SQLGetStmtAttr:
168 
169 			pFunction = (oslGenericFunction)pODBC3SQLGetStmtAttr;
170 			break;
171 		case ODBC3SQLPrepare:
172 
173 			pFunction = (oslGenericFunction)pODBC3SQLPrepare;
174 			break;
175 		case ODBC3SQLBindParameter:
176 
177 			pFunction = (oslGenericFunction)pODBC3SQLBindParameter;
178 			break;
179 		case ODBC3SQLSetCursorName:
180 
181 			pFunction = (oslGenericFunction)pODBC3SQLSetCursorName;
182 			break;
183 		case ODBC3SQLExecute:
184 
185 			pFunction = (oslGenericFunction)pODBC3SQLExecute;
186 			break;
187 		case ODBC3SQLExecDirect:
188 
189 			pFunction = (oslGenericFunction)pODBC3SQLExecDirect;
190 			break;
191 		case ODBC3SQLDescribeParam:
192 
193 			pFunction = (oslGenericFunction)pODBC3SQLDescribeParam;
194 			break;
195 		case ODBC3SQLNumParams:
196 
197 			pFunction = (oslGenericFunction)pODBC3SQLNumParams;
198 			break;
199 		case ODBC3SQLParamData:
200 
201 			pFunction = (oslGenericFunction)pODBC3SQLParamData;
202 			break;
203 		case ODBC3SQLPutData:
204 
205 			pFunction = (oslGenericFunction)pODBC3SQLPutData;
206 			break;
207 		case ODBC3SQLRowCount:
208 
209 			pFunction = (oslGenericFunction)pODBC3SQLRowCount;
210 			break;
211 		case ODBC3SQLNumResultCols:
212 
213 			pFunction = (oslGenericFunction)pODBC3SQLNumResultCols;
214 			break;
215 		case ODBC3SQLDescribeCol:
216 
217 			pFunction = (oslGenericFunction)pODBC3SQLDescribeCol;
218 			break;
219 		case ODBC3SQLColAttribute:
220 
221 			pFunction = (oslGenericFunction)pODBC3SQLColAttribute;
222 			break;
223 		case ODBC3SQLBindCol:
224 
225 			pFunction = (oslGenericFunction)pODBC3SQLBindCol;
226 			break;
227 		case ODBC3SQLFetch:
228 
229 			pFunction = (oslGenericFunction)pODBC3SQLFetch;
230 			break;
231 		case ODBC3SQLFetchScroll:
232 
233 			pFunction = (oslGenericFunction)pODBC3SQLFetchScroll;
234 			break;
235 		case ODBC3SQLGetData:
236 
237 			pFunction = (oslGenericFunction)pODBC3SQLGetData;
238 			break;
239 		case ODBC3SQLSetPos:
240 
241 			pFunction = (oslGenericFunction)pODBC3SQLSetPos;
242 			break;
243 		case ODBC3SQLBulkOperations:
244 
245 			pFunction = (oslGenericFunction)pODBC3SQLBulkOperations;
246 			break;
247 		case ODBC3SQLMoreResults:
248 
249 			pFunction = (oslGenericFunction)pODBC3SQLMoreResults;
250 			break;
251 		case ODBC3SQLGetDiagRec:
252 
253 			pFunction = (oslGenericFunction)pODBC3SQLGetDiagRec;
254 			break;
255 		case ODBC3SQLColumnPrivileges:
256 
257 			pFunction = (oslGenericFunction)pODBC3SQLColumnPrivileges;
258 			break;
259 		case ODBC3SQLColumns:
260 
261 			pFunction = (oslGenericFunction)pODBC3SQLColumns;
262 			break;
263 		case ODBC3SQLForeignKeys:
264 
265 			pFunction = (oslGenericFunction)pODBC3SQLForeignKeys;
266 			break;
267 		case ODBC3SQLPrimaryKeys:
268 
269 			pFunction = (oslGenericFunction)pODBC3SQLPrimaryKeys;
270 			break;
271 		case ODBC3SQLProcedureColumns:
272 
273 			pFunction = (oslGenericFunction)pODBC3SQLProcedureColumns;
274 			break;
275 		case ODBC3SQLProcedures:
276 
277 			pFunction = (oslGenericFunction)pODBC3SQLProcedures;
278 			break;
279 		case ODBC3SQLSpecialColumns:
280 
281 			pFunction = (oslGenericFunction)pODBC3SQLSpecialColumns;
282 			break;
283 		case ODBC3SQLStatistics:
284 
285 			pFunction = (oslGenericFunction)pODBC3SQLStatistics;
286 			break;
287 		case ODBC3SQLTablePrivileges:
288 
289 			pFunction = (oslGenericFunction)pODBC3SQLTablePrivileges;
290 			break;
291 		case ODBC3SQLTables:
292 
293 			pFunction = (oslGenericFunction)pODBC3SQLTables;
294 			break;
295 		case ODBC3SQLFreeStmt:
296 
297 			pFunction = (oslGenericFunction)pODBC3SQLFreeStmt;
298 			break;
299 		case ODBC3SQLCloseCursor:
300 
301 			pFunction = (oslGenericFunction)pODBC3SQLCloseCursor;
302 			break;
303 		case ODBC3SQLCancel:
304 
305 			pFunction = (oslGenericFunction)pODBC3SQLCancel;
306 			break;
307 		case ODBC3SQLEndTran:
308 
309 			pFunction = (oslGenericFunction)pODBC3SQLEndTran;
310 			break;
311 		case ODBC3SQLDisconnect:
312 
313 			pFunction = (oslGenericFunction)pODBC3SQLDisconnect;
314 			break;
315 		case ODBC3SQLFreeHandle:
316 
317 			pFunction = (oslGenericFunction)pODBC3SQLFreeHandle;
318 			break;
319 		case ODBC3SQLGetCursorName:
320 
321 			pFunction = (oslGenericFunction)pODBC3SQLGetCursorName;
322 			break;
323 		case ODBC3SQLNativeSql:
324 
325 			pFunction = (oslGenericFunction)pODBC3SQLNativeSql;
326 			break;
327 		default:
328 			OSL_ENSURE(0,"Function unknown!");
329 	}
330 	return pFunction;
331 }
332 
333 //------------------------------------------------------------------
ODBCDriver_CreateInstance(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & _rxFactory)334 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  SAL_CALL ODBCDriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception )
335 {
336 	return *(new ORealObdcDriver(_rxFactory));
337 }
338 // -----------------------------------------------------------------------------
339 // ODBC Environment (gemeinsam fuer alle Connections):
EnvironmentHandle(::rtl::OUString & _rPath)340 SQLHANDLE ORealObdcDriver::EnvironmentHandle(::rtl::OUString &_rPath)
341 {
342 	// Ist (fuer diese Instanz) bereits ein Environment erzeugt worden?
343 	if (!m_pDriverHandle)
344 	{
345 		SQLHANDLE h = SQL_NULL_HANDLE;
346 		// Environment allozieren
347 
348 		// ODBC-DLL jetzt laden:
349 		if (!LoadLibrary_ODBC3(_rPath) || N3SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&h) != SQL_SUCCESS)
350 			return SQL_NULL_HANDLE;
351 
352 		// In globaler Struktur merken ...
353 		m_pDriverHandle = h;
354 		SQLRETURN nError = N3SQLSetEnvAttr(h, SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER);
355         OSL_UNUSED( nError );
356 		//N3SQLSetEnvAttr(h, SQL_ATTR_CONNECTION_POOLING,(SQLPOINTER) SQL_CP_ONE_PER_HENV, SQL_IS_INTEGER);
357 	}
358 
359 	return m_pDriverHandle;
360 }
361 // -----------------------------------------------------------------------------
362 
363 	}
364 }
365 
366