Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : /*
14 : * This code was created by Peter Harvey (mostly during Christmas 98/99).
15 : * This code is LGPL. Please ensure that this message remains in future
16 : * distributions and uses of this code (thats about all I get out of it).
17 : * - Peter Harvey pharvey@codebydesign.com
18 : *
19 : * This file has been modified for the MonetDB project. See the file
20 : * Copyright in this directory for more information.
21 : */
22 :
23 : /**********************************************************************
24 : * SQLGetFunctions()
25 : * CLI Compliance: ISO 92
26 : *
27 : * Author: Sjoerd Mullender
28 : * Date : 4 sep 2003
29 : *
30 : **********************************************************************/
31 :
32 : #include "ODBCGlobal.h"
33 : #include "ODBCStmt.h"
34 :
35 :
36 : /* this table contains all functions for which SQLGetFunctions should
37 : return SQL_TRUE */
38 : static UWORD FuncImplemented[] = {
39 : SQL_API_SQLALLOCCONNECT,
40 : SQL_API_SQLALLOCENV,
41 : #ifdef SQL_API_SQLALLOCHANDLE
42 : SQL_API_SQLALLOCHANDLE,
43 : #endif
44 : SQL_API_SQLALLOCSTMT,
45 : SQL_API_SQLBINDCOL,
46 : SQL_API_SQLBINDPARAMETER,
47 : SQL_API_SQLBROWSECONNECT,
48 : SQL_API_SQLCANCEL,
49 : #ifdef SQL_API_SQLCLOSECURSOR
50 : SQL_API_SQLCLOSECURSOR,
51 : #endif
52 : #ifdef SQL_API_SQLCOLATTRIBUTE
53 : SQL_API_SQLCOLATTRIBUTE, /* == SQL_API_SQLCOLATTRIBUTES */
54 : #endif
55 : SQL_API_SQLCOLATTRIBUTES,
56 : SQL_API_SQLCOLUMNPRIVILEGES,
57 : SQL_API_SQLCOLUMNS,
58 : SQL_API_SQLCONNECT,
59 : #ifdef SQL_API_SQLCOPYDESC
60 : SQL_API_SQLCOPYDESC,
61 : #endif
62 : SQL_API_SQLDESCRIBECOL,
63 : SQL_API_SQLDESCRIBEPARAM,
64 : SQL_API_SQLDISCONNECT,
65 : SQL_API_SQLDRIVERCONNECT,
66 : #ifdef SQL_API_SQLENDTRAN
67 : SQL_API_SQLENDTRAN,
68 : #endif
69 : SQL_API_SQLERROR,
70 : SQL_API_SQLEXECDIRECT,
71 : SQL_API_SQLEXECUTE,
72 : SQL_API_SQLEXTENDEDFETCH,
73 : SQL_API_SQLFETCH,
74 : #ifdef SQL_API_SQLFETCHSCROLL
75 : SQL_API_SQLFETCHSCROLL,
76 : #endif
77 : SQL_API_SQLFOREIGNKEYS,
78 : SQL_API_SQLFREECONNECT,
79 : SQL_API_SQLFREEENV,
80 : #ifdef SQL_API_SQLFREEHANDLE
81 : SQL_API_SQLFREEHANDLE,
82 : #endif
83 : SQL_API_SQLFREESTMT,
84 : #ifdef SQL_API_SQLGETCONNECTATTR
85 : SQL_API_SQLGETCONNECTATTR,
86 : #endif
87 : SQL_API_SQLGETCONNECTOPTION,
88 : SQL_API_SQLGETDATA,
89 : #ifdef SQL_API_SQLGETDESCFIELD
90 : SQL_API_SQLGETDESCFIELD,
91 : #endif
92 : #ifdef SQL_API_SQLGETDESCREC
93 : SQL_API_SQLGETDESCREC,
94 : #endif
95 : #ifdef SQL_API_SQLGETDIAGREC
96 : SQL_API_SQLGETDIAGREC,
97 : #endif
98 : #ifdef SQL_API_SQLGETENVATTR
99 : SQL_API_SQLGETENVATTR,
100 : #endif
101 : SQL_API_SQLGETFUNCTIONS,
102 : SQL_API_SQLGETINFO,
103 : #ifdef SQL_API_SQLGETSTMTATTR
104 : SQL_API_SQLGETSTMTATTR,
105 : #endif
106 : SQL_API_SQLGETSTMTOPTION,
107 : SQL_API_SQLGETTYPEINFO,
108 : SQL_API_SQLMORERESULTS,
109 : SQL_API_SQLNATIVESQL,
110 : SQL_API_SQLNUMPARAMS,
111 : SQL_API_SQLNUMRESULTCOLS,
112 : SQL_API_SQLPARAMOPTIONS,
113 : SQL_API_SQLPREPARE,
114 : SQL_API_SQLPRIMARYKEYS,
115 : SQL_API_SQLPROCEDURECOLUMNS,
116 : SQL_API_SQLPROCEDURES,
117 : SQL_API_SQLROWCOUNT,
118 : #ifdef SQL_API_SQLSETCONNECTATTR
119 : SQL_API_SQLSETCONNECTATTR,
120 : #endif
121 : SQL_API_SQLSETCONNECTOPTION,
122 : #ifdef SQL_API_SQLSETDESCFIELD
123 : SQL_API_SQLSETDESCFIELD,
124 : #endif
125 : #ifdef SQL_API_SQLSETDESCREC
126 : SQL_API_SQLSETDESCREC,
127 : #endif
128 : #ifdef SQL_API_SQLSETENVATTR
129 : SQL_API_SQLSETENVATTR,
130 : #endif
131 : SQL_API_SQLSETPARAM,
132 : SQL_API_SQLSETPOS,
133 : #ifdef SQL_API_SQLSETSTMTATTR
134 : SQL_API_SQLSETSTMTATTR,
135 : #endif
136 : SQL_API_SQLSETSTMTOPTION,
137 : SQL_API_SQLSPECIALCOLUMNS,
138 : SQL_API_SQLSTATISTICS,
139 : SQL_API_SQLTABLEPRIVILEGES,
140 : SQL_API_SQLTABLES,
141 : SQL_API_SQLTRANSACT,
142 : #if 0
143 : /* not yet implemented */
144 : #ifdef SQL_API_SQLALLOCHANDLESTD
145 : SQL_API_SQLALLOCHANDLESTD,
146 : #endif
147 : #ifdef SQL_API_SQLBINDPARAM
148 : SQL_API_SQLBINDPARAM,
149 : #endif
150 : #ifdef SQL_API_SQLBULKOPERATIONS
151 : SQL_API_SQLBULKOPERATIONS,
152 : #endif
153 : SQL_API_SQLDATASOURCES,
154 : SQL_API_SQLDRIVERS,
155 : SQL_API_SQLGETCURSORNAME,
156 : #ifdef SQL_API_SQLGETDIAGFIELD
157 : SQL_API_SQLGETDIAGFIELD,
158 : #endif
159 : SQL_API_SQLPARAMDATA,
160 : SQL_API_SQLPUTDATA,
161 : SQL_API_SQLSETCURSORNAME,
162 : SQL_API_SQLSETSCROLLOPTIONS,
163 : #endif /* not yet implemented */
164 : };
165 :
166 : #define NFUNCIMPLEMENTED (sizeof(FuncImplemented)/sizeof(FuncImplemented[0]))
167 :
168 : /* this table is a bit map compatible with
169 : SQL_API_ODBC3_ALL_FUNCTIONS, to be initialized from the table
170 : above */
171 : static UWORD FuncExistMap[SQL_API_ODBC3_ALL_FUNCTIONS_SIZE];
172 :
173 : #ifdef ODBCDEBUG
174 : static char *
175 0 : translateFunctionId(SQLUSMALLINT FunctionId)
176 : {
177 0 : switch (FunctionId) {
178 : case SQL_API_ODBC3_ALL_FUNCTIONS:
179 : return "SQL_API_ODBC3_ALL_FUNCTIONS";
180 0 : case SQL_API_SQLALLOCCONNECT:
181 0 : return "SQL_API_SQLALLOCCONNECT";
182 0 : case SQL_API_SQLALLOCENV:
183 0 : return "SQL_API_SQLALLOCENV";
184 : #ifdef SQL_API_SQLALLOCHANDLE
185 0 : case SQL_API_SQLALLOCHANDLE:
186 0 : return "SQL_API_SQLALLOCHANDLE";
187 : #endif
188 0 : case SQL_API_SQLALLOCSTMT:
189 0 : return "SQL_API_SQLALLOCSTMT";
190 0 : case SQL_API_SQLBINDCOL:
191 0 : return "SQL_API_SQLBINDCOL";
192 0 : case SQL_API_SQLBINDPARAMETER:
193 0 : return "SQL_API_SQLBINDPARAMETER";
194 0 : case SQL_API_SQLBROWSECONNECT:
195 0 : return "SQL_API_SQLBROWSECONNECT";
196 0 : case SQL_API_SQLCANCEL:
197 0 : return "SQL_API_SQLCANCEL";
198 : #ifdef SQL_API_SQLCLOSECURSOR
199 0 : case SQL_API_SQLCLOSECURSOR:
200 0 : return "SQL_API_SQLCLOSECURSOR";
201 : #endif
202 : #ifdef SQL_API_SQLCOLATTRIBUTE
203 0 : case SQL_API_SQLCOLATTRIBUTE:
204 0 : return "SQL_API_SQLCOLATTRIBUTE";
205 : #endif
206 0 : case SQL_API_SQLCOLUMNPRIVILEGES:
207 0 : return "SQL_API_SQLCOLUMNPRIVILEGES";
208 0 : case SQL_API_SQLCOLUMNS:
209 0 : return "SQL_API_SQLCOLUMNS";
210 0 : case SQL_API_SQLCONNECT:
211 0 : return "SQL_API_SQLCONNECT";
212 : #ifdef SQL_API_SQLCOPYDESC
213 0 : case SQL_API_SQLCOPYDESC:
214 0 : return "SQL_API_SQLCOPYDESC";
215 : #endif
216 0 : case SQL_API_SQLDESCRIBECOL:
217 0 : return "SQL_API_SQLDESCRIBECOL";
218 0 : case SQL_API_SQLDESCRIBEPARAM:
219 0 : return "SQL_API_SQLDESCRIBEPARAM";
220 0 : case SQL_API_SQLDISCONNECT:
221 0 : return "SQL_API_SQLDISCONNECT";
222 0 : case SQL_API_SQLDRIVERCONNECT:
223 0 : return "SQL_API_SQLDRIVERCONNECT";
224 : #ifdef SQL_API_SQLENDTRAN
225 0 : case SQL_API_SQLENDTRAN:
226 0 : return "SQL_API_SQLENDTRAN";
227 : #endif
228 0 : case SQL_API_SQLERROR:
229 0 : return "SQL_API_SQLERROR";
230 0 : case SQL_API_SQLEXECDIRECT:
231 0 : return "SQL_API_SQLEXECDIRECT";
232 0 : case SQL_API_SQLEXECUTE:
233 0 : return "SQL_API_SQLEXECUTE";
234 0 : case SQL_API_SQLEXTENDEDFETCH:
235 0 : return "SQL_API_SQLEXTENDEDFETCH";
236 0 : case SQL_API_SQLFETCH:
237 0 : return "SQL_API_SQLFETCH";
238 : #ifdef SQL_API_SQLFETCHSCROLL
239 0 : case SQL_API_SQLFETCHSCROLL:
240 0 : return "SQL_API_SQLFETCHSCROLL";
241 : #endif
242 0 : case SQL_API_SQLFOREIGNKEYS:
243 0 : return "SQL_API_SQLFOREIGNKEYS";
244 0 : case SQL_API_SQLFREECONNECT:
245 0 : return "SQL_API_SQLFREECONNECT";
246 0 : case SQL_API_SQLFREEENV:
247 0 : return "SQL_API_SQLFREEENV";
248 : #ifdef SQL_API_SQLFREEHANDLE
249 0 : case SQL_API_SQLFREEHANDLE:
250 0 : return "SQL_API_SQLFREEHANDLE";
251 : #endif
252 0 : case SQL_API_SQLFREESTMT:
253 0 : return "SQL_API_SQLFREESTMT";
254 : #ifdef SQL_API_SQLGETCONNECTATTR
255 0 : case SQL_API_SQLGETCONNECTATTR:
256 0 : return "SQL_API_SQLGETCONNECTATTR";
257 : #endif
258 0 : case SQL_API_SQLGETCONNECTOPTION:
259 0 : return "SQL_API_SQLGETCONNECTOPTION";
260 0 : case SQL_API_SQLGETDATA:
261 0 : return "SQL_API_SQLGETDATA";
262 : #ifdef SQL_API_SQLGETDESCFIELD
263 0 : case SQL_API_SQLGETDESCFIELD:
264 0 : return "SQL_API_SQLGETDESCFIELD";
265 : #endif
266 : #ifdef SQL_API_SQLGETDESCREC
267 0 : case SQL_API_SQLGETDESCREC:
268 0 : return "SQL_API_SQLGETDESCREC";
269 : #endif
270 : #ifdef SQL_API_SQLGETDIAGREC
271 0 : case SQL_API_SQLGETDIAGREC:
272 0 : return "SQL_API_SQLGETDIAGREC";
273 : #endif
274 : #ifdef SQL_API_SQLGETENVATTR
275 0 : case SQL_API_SQLGETENVATTR:
276 0 : return "SQL_API_SQLGETENVATTR";
277 : #endif
278 0 : case SQL_API_SQLGETFUNCTIONS:
279 0 : return "SQL_API_SQLGETFUNCTIONS";
280 0 : case SQL_API_SQLGETINFO:
281 0 : return "SQL_API_SQLGETINFO";
282 : #ifdef SQL_API_SQLGETSTMTATTR
283 0 : case SQL_API_SQLGETSTMTATTR:
284 0 : return "SQL_API_SQLGETSTMTATTR";
285 : #endif
286 0 : case SQL_API_SQLGETSTMTOPTION:
287 0 : return "SQL_API_SQLGETSTMTOPTION";
288 0 : case SQL_API_SQLGETTYPEINFO:
289 0 : return "SQL_API_SQLGETTYPEINFO";
290 0 : case SQL_API_SQLMORERESULTS:
291 0 : return "SQL_API_SQLMORERESULTS";
292 0 : case SQL_API_SQLNATIVESQL:
293 0 : return "SQL_API_SQLNATIVESQL";
294 0 : case SQL_API_SQLNUMPARAMS:
295 0 : return "SQL_API_SQLNUMPARAMS";
296 0 : case SQL_API_SQLNUMRESULTCOLS:
297 0 : return "SQL_API_SQLNUMRESULTCOLS";
298 0 : case SQL_API_SQLPARAMOPTIONS:
299 0 : return "SQL_API_SQLPARAMOPTIONS";
300 0 : case SQL_API_SQLPREPARE:
301 0 : return "SQL_API_SQLPREPARE";
302 0 : case SQL_API_SQLPRIMARYKEYS:
303 0 : return "SQL_API_SQLPRIMARYKEYS";
304 0 : case SQL_API_SQLPROCEDURES:
305 0 : return "SQL_API_SQLPROCEDURES";
306 0 : case SQL_API_SQLROWCOUNT:
307 0 : return "SQL_API_SQLROWCOUNT";
308 : #ifdef SQL_API_SQLSETCONNECTATTR
309 0 : case SQL_API_SQLSETCONNECTATTR:
310 0 : return "SQL_API_SQLSETCONNECTATTR";
311 : #endif
312 0 : case SQL_API_SQLSETCONNECTOPTION:
313 0 : return "SQL_API_SQLSETCONNECTOPTION";
314 : #ifdef SQL_API_SQLSETDESCFIELD
315 0 : case SQL_API_SQLSETDESCFIELD:
316 0 : return "SQL_API_SQLSETDESCFIELD";
317 : #endif
318 : #ifdef SQL_API_SQLSETDESCREC
319 0 : case SQL_API_SQLSETDESCREC:
320 0 : return "SQL_API_SQLSETDESCREC";
321 : #endif
322 : #ifdef SQL_API_SQLSETENVATTR
323 0 : case SQL_API_SQLSETENVATTR:
324 0 : return "SQL_API_SQLSETENVATTR";
325 : #endif
326 0 : case SQL_API_SQLSETPARAM:
327 0 : return "SQL_API_SQLSETPARAM";
328 0 : case SQL_API_SQLSETPOS:
329 0 : return "SQL_API_SQLSETPOS";
330 : #ifdef SQL_API_SQLSETSTMTATTR
331 0 : case SQL_API_SQLSETSTMTATTR:
332 0 : return "SQL_API_SQLSETSTMTATTR";
333 : #endif
334 0 : case SQL_API_SQLSETSTMTOPTION:
335 0 : return "SQL_API_SQLSETSTMTOPTION";
336 0 : case SQL_API_SQLSPECIALCOLUMNS:
337 0 : return "SQL_API_SQLSPECIALCOLUMNS";
338 0 : case SQL_API_SQLSTATISTICS:
339 0 : return "SQL_API_SQLSTATISTICS";
340 0 : case SQL_API_SQLTABLEPRIVILEGES:
341 0 : return "SQL_API_SQLTABLEPRIVILEGES";
342 0 : case SQL_API_SQLTABLES:
343 0 : return "SQL_API_SQLTABLES";
344 0 : case SQL_API_SQLTRANSACT:
345 0 : return "SQL_API_SQLTRANSACT";
346 : #ifdef SQL_API_SQLALLOCHANDLESTD
347 0 : case SQL_API_SQLALLOCHANDLESTD:
348 0 : return "SQL_API_SQLALLOCHANDLESTD";
349 : #endif
350 : #ifdef SQL_API_SQLBINDPARAM
351 0 : case SQL_API_SQLBINDPARAM:
352 0 : return "SQL_API_SQLBINDPARAM";
353 : #endif
354 : #ifdef SQL_API_SQLBULKOPERATIONS
355 0 : case SQL_API_SQLBULKOPERATIONS:
356 0 : return "SQL_API_SQLBULKOPERATIONS";
357 : #endif
358 0 : case SQL_API_SQLDATASOURCES:
359 0 : return "SQL_API_SQLDATASOURCES";
360 0 : case SQL_API_SQLDRIVERS:
361 0 : return "SQL_API_SQLDRIVERS";
362 0 : case SQL_API_SQLGETCURSORNAME:
363 0 : return "SQL_API_SQLGETCURSORNAME";
364 : #ifdef SQL_API_SQLGETDIAGFIELD
365 0 : case SQL_API_SQLGETDIAGFIELD:
366 0 : return "SQL_API_SQLGETDIAGFIELD";
367 : #endif
368 0 : case SQL_API_SQLPARAMDATA:
369 0 : return "SQL_API_SQLPARAMDATA";
370 0 : case SQL_API_SQLPROCEDURECOLUMNS:
371 0 : return "SQL_API_SQLPROCEDURECOLUMNS";
372 0 : case SQL_API_SQLPUTDATA:
373 0 : return "SQL_API_SQLPUTDATA";
374 0 : case SQL_API_SQLSETCURSORNAME:
375 0 : return "SQL_API_SQLSETCURSORNAME";
376 0 : case SQL_API_SQLSETSCROLLOPTIONS:
377 0 : return "SQL_API_SQLSETSCROLLOPTIONS";
378 0 : default:
379 0 : return "unknown";
380 : }
381 : }
382 : #endif
383 :
384 : SQLRETURN SQL_API
385 : SQLGetFunctions(SQLHDBC ConnectionHandle,
386 : SQLUSMALLINT FunctionId,
387 : SQLUSMALLINT *SupportedPtr)
388 : {
389 6 : ODBCDbc *dbc = (ODBCDbc *) ConnectionHandle;
390 :
391 : #ifdef ODBCDEBUG
392 6 : ODBCLOG("SQLGetFunctions %p %s\n",
393 : ConnectionHandle, translateFunctionId(FunctionId));
394 : #endif
395 :
396 6 : if (!isValidDbc(dbc))
397 : return SQL_INVALID_HANDLE;
398 :
399 6 : clearDbcErrors(dbc);
400 :
401 6 : if (!SQL_FUNC_EXISTS(FuncExistMap, FuncImplemented[0])) {
402 : /* not yet initialized, so do it now */
403 : UWORD *p;
404 :
405 408 : for (p = FuncImplemented; p < &FuncImplemented[NFUNCIMPLEMENTED]; p++)
406 402 : FuncExistMap[*p >> 4] |= (UWORD) 1 << (*p & 0xF);
407 : }
408 :
409 6 : if (FunctionId == SQL_API_ODBC3_ALL_FUNCTIONS) {
410 6 : memcpy(SupportedPtr, FuncExistMap,
411 : SQL_API_ODBC3_ALL_FUNCTIONS_SIZE * sizeof(FuncExistMap[0]));
412 6 : return SQL_SUCCESS;
413 : }
414 :
415 0 : if (FunctionId < SQL_API_ODBC3_ALL_FUNCTIONS_SIZE * 16) {
416 0 : *SupportedPtr = SQL_FUNC_EXISTS(FuncExistMap, FunctionId);
417 0 : return SQL_SUCCESS;
418 : }
419 :
420 : /* Function type out of range */
421 0 : addDbcError(dbc, "HY095", NULL, 0);
422 0 : return SQL_ERROR;
423 : }
|