1/*
2 *  Info.c
3 *
4 *  $Id: Info.c,v 1.7 2006/01/20 15:58:35 source Exp $
5 *
6 *  Decode the SQLGetInfo responses and dump them to the trace log
7 *
8 *  The iODBC driver manager.
9 *
10 *  Copyright (C) 1996-2006 by OpenLink Software <iodbc@openlinksw.com>
11 *  All Rights Reserved.
12 *
13 *  This software is released under the terms of either of the following
14 *  licenses:
15 *
16 *      - GNU Library General Public License (see LICENSE.LGPL)
17 *      - The BSD License (see LICENSE.BSD).
18 *
19 *  Note that the only valid version of the LGPL license as far as this
20 *  project is concerned is the original GNU Library General Public License
21 *  Version 2, dated June 1991.
22 *
23 *  While not mandated by the BSD license, any patches you make to the
24 *  iODBC source code may be contributed back into the iODBC project
25 *  at your discretion. Contributions will benefit the Open Source and
26 *  Data Access community as a whole. Submissions may be made at:
27 *
28 *      http://www.iodbc.org
29 *
30 *
31 *  GNU Library Generic Public License Version 2
32 *  ============================================
33 *  This library is free software; you can redistribute it and/or
34 *  modify it under the terms of the GNU Library General Public
35 *  License as published by the Free Software Foundation; only
36 *  Version 2 of the License dated June 1991.
37 *
38 *  This library is distributed in the hope that it will be useful,
39 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
40 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
41 *  Library General Public License for more details.
42 *
43 *  You should have received a copy of the GNU Library General Public
44 *  License along with this library; if not, write to the Free
45 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
46 *
47 *
48 *  The BSD License
49 *  ===============
50 *  Redistribution and use in source and binary forms, with or without
51 *  modification, are permitted provided that the following conditions
52 *  are met:
53 *
54 *  1. Redistributions of source code must retain the above copyright
55 *     notice, this list of conditions and the following disclaimer.
56 *  2. Redistributions in binary form must reproduce the above copyright
57 *     notice, this list of conditions and the following disclaimer in
58 *     the documentation and/or other materials provided with the
59 *     distribution.
60 *  3. Neither the name of OpenLink Software Inc. nor the names of its
61 *     contributors may be used to endorse or promote products derived
62 *     from this software without specific prior written permission.
63 *
64 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
65 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
66 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
67 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OPENLINK OR
68 *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
69 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
70 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
71 *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
72 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
73 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
74 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
75 */
76
77#include "trace.h"
78
79
80/*
81 *  Internal macros to decode the various GetInfo return values
82 */
83#define I_STR(T)	case T: \
84			  infoname = #T; \
85			  if (output) \
86			    goto print_string; \
87			  break
88
89#define I_INT16(T)	case T: \
90			  infoname = #T; \
91			  if (output) \
92			    goto print_int16; \
93			  break
94
95#define I_INT32(T)	case T: \
96			  infoname = #T; \
97			  if (output) \
98			    goto print_int32; \
99			  break
100
101#define I_MASK(T)	case T: \
102			  infoname = #T; \
103			  mask = _mask_##T; \
104			  elem = NUM_ELEM(_mask_##T); \
105			  if (output) \
106			    goto print_mask; \
107			  break
108
109#define I_MASK1(T, O)	case T: \
110			  infoname = #T; \
111			  mask = _mask_##O; \
112			  elem = NUM_ELEM(_mask_##O); \
113			  if (output) \
114			    goto print_mask; \
115			  break
116
117#define I_SVAL(T)	case T: \
118			  infoname = #T; \
119			  mask = _mask_##T; \
120			  elem = NUM_ELEM(_mask_##T); \
121			  if (output) \
122			    goto print_svalue; \
123			  break
124
125#define I_SVAL1(T,O)	case T: \
126			  infoname = #T; \
127			  mask = _mask_##O; \
128			  elem = NUM_ELEM(_mask_##O); \
129			  if (output) \
130			    goto print_svalue; \
131			  break
132
133
134#define MASK(X)  	char * _mask_##X[]
135#define NUM_ELEM(X)	(sizeof(X) / sizeof(X[0]))
136
137
138/*
139 *  Various bitmask strings
140 */
141static
142MASK (SQL_AGGREGATE_FUNCTIONS) =
143{
144  "SQL_AF_UNKNOWN",
145  "SQL_AF_AVG",
146  "SQL_AF_COUNT",
147  "SQL_AF_MAX",
148  "SQL_AF_MIN",
149  "SQL_AF_SUM"
150  "SQL_AF_DISTINCT",
151  "SQL_AF_ALL"
152};
153
154
155static
156MASK (SQL_ALTER_DOMAIN) =
157{
158  "SQL_AD_CONSTRAINT_UNKNOWN",
159  "SQL_AD_CONSTRAINT_NAME_DEFINITION",
160  "SQL_AD_ADD_DOMAIN_CONSTRAINT",
161  "SQL_AD_DROP_DOMAIN_CONSTRAINT",
162  "SQL_AD_ADD_DOMAIN_DEFAULT",
163  "SQL_AD_DROP_DOMAIN_DEFAULT",
164  "SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED",
165  "SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE",
166  "SQL_AD_ADD_CONSTRAINT_DEFERRABLE",
167  "SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE"
168};
169
170
171static
172MASK (SQL_ALTER_TABLE) =
173{
174  "SQL_AT_UNKNOWN",
175  "SQL_AT_ADD_COLUMN",
176  "SQL_AT_DROP_COLUMN",
177  "SQL_AT_UNKNOWN_BIT_3",
178  "SQL_AT_ADD_CONSTRAINT",
179  "SQL_AT_UNKNOWN_BIT_5",
180  "SQL_AT_ADD_COLUMN_SINGLE",
181  "SQL_AT_ADD_COLUMN_DEFAULT",
182  "SQL_AT_ADD_COLUMN_COLLATION",
183  "SQL_AT_SET_COLUMN_DEFAULT",
184  "SQL_AT_DROP_COLUMN_DEFAULT",
185  "SQL_AT_DROP_COLUMN_CASCADE",
186  "SQL_AT_DROP_COLUMN_RESTRICT",
187  "SQL_AT_ADD_TABLE_CONSTRAINT",
188  "SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE",
189  "SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT",
190  "SQL_AT_CONSTRAINT_NAME_DEFINITION",
191  "SQL_AT_CONSTRAINT_INITIALLY_DEFERRED",
192  "SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE",
193  "SQL_AT_CONSTRAINT_DEFERRABLE",
194  "SQL_AT_CONSTRAINT_NON_DEFERRABLE"
195};
196
197
198static
199MASK (SQL_ASYNC_MODE) =
200{
201  "SQL_AM_NONE",
202  "SQL_AM_CONNECTION",
203  "SQL_AM_STATEMENT"
204};
205
206
207static
208MASK (SQL_BATCH_ROW_COUNT) =
209{
210  "SQL_BRC_UNKNOWN",
211  "SQL_BRC_PROCEDURES",
212  "SQL_BRC_EXPLICIT",
213  "SQL_BRC_ROLLED_UP"
214};
215
216
217static
218MASK (SQL_BATCH_SUPPORT) =
219{
220  "SQL_BS_UNKNOWN",
221  "SQL_BS_SELECT_EXPLICIT",
222  "SQL_BS_ROW_COUNT_EXPLICIT",
223  "SQL_BS_SELECT_PROC",
224  "SQL_BS_ROW_COUNT_PROC"
225};
226
227
228static
229MASK (SQL_BOOKMARK_PERSISTENCE) =
230{
231  "SQL_BP_UNKNOWN",
232  "SQL_BP_CLOSE",
233  "SQL_BP_DELETE",
234  "SQL_BP_DROP",
235  "SQL_BP_TRANSACTION",
236  "SQL_BP_UPDATE",
237  "SQL_BP_OTHER_HSTMT",
238  "SQL_BP_SCROLL"
239};
240
241
242static
243MASK (SQL_CATALOG_LOCATION) =
244{
245  "SQL_CL_UNKNOWN",
246  "SQL_CL_START",
247  "SQL_CL_END"
248};
249
250
251static
252MASK (SQL_CATALOG_USAGE) =
253{
254  "SQL_CU_UNKNOWN",
255  "SQL_CU_DML_STATEMENTS",
256  "SQL_CU_PROCEDURE_INVOCATION",
257  "SQL_CU_TABLE_DEFINITION",
258  "SQL_CU_INDEX_DEFINITION",
259  "SQL_CU_PRIVILEGE_DEFINITION"
260};
261
262
263static
264MASK (SQL_CONCAT_NULL_BEHAVIOR) =
265{
266  "SQL_CB_NULL",
267  "SQL_CB_NON_NULL"
268};
269
270
271static
272MASK (CONVERT) =
273{
274  "SQL_CVT_UNKNOWN",
275  "SQL_CVT_CHAR",
276  "SQL_CVT_NUMERIC",
277  "SQL_CVT_DECIMAL",
278  "SQL_CVT_INTEGER",
279  "SQL_CVT_SMALLINT",
280  "SQL_CVT_FLOAT",
281  "SQL_CVT_REAL",
282  "SQL_CVT_DOUBLE",
283  "SQL_CVT_VARCHAR"
284  "SQL_CVT_LONGVARCHAR",
285  "SQL_CVT_BINARY",
286  "SQL_CVT_VARBINARY",
287  "SQL_CVT_BIT",
288  "SQL_CVT_TINYINT",
289  "SQL_CVT_BIGINT",
290  "SQL_CVT_DATE",
291  "SQL_CVT_TIME",
292  "SQL_CVT_TIMESTAMP",
293  "SQL_CVT_LONGVARBINARY",
294  "SQL_CVT_INTERVAL_YEAR_MONTH",
295  "SQL_CVT_INTERVAL_DAY_TIME",
296  "SQL_CVT_WCHAR",
297  "SQL_CVT_WLONGVARCHAR",
298  "SQL_CVT_WVARCHAR"
299};
300
301
302static
303MASK (SQL_CONVERT_FUNCTIONS) =
304{
305  "SQL_FN_CVT_UNKNOWN",
306  "SQL_FN_CVT_CONVERT",
307  "SQL_FN_CVT_CAST"
308};
309
310
311static
312MASK (SQL_CORRELATION_NAME) =
313{
314  "SQL_CN_NONE",
315  "SQL_CN_DIFFERENT",
316  "SQL_CN_ANY"
317};
318
319
320static
321MASK (SQL_CREATE_ASSERTION) =
322{
323  "SQL_CA_UNKNOWN",
324  "SQL_CA_CREATE_ASSERTION",
325  "SQL_CA_UNKNOWN_BIT 2",
326  "SQL_CA_UNKNOWN_BIT 3",
327  "SQL_CA_UNKNOWN_BIT 4",
328  "SQL_CA_CONSTRAINT_INITIALLY_DEFERRED",
329  "SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE",
330  "SQL_CA_CONSTRAINT_DEFERRABLE",
331  "SQL_CA_CONSTRAINT_NON_DEFERRABLE"
332};
333
334
335static
336MASK (SQL_CREATE_CHARACTER_SET) =
337{
338  "SQL_CSS_UNKNOWN",
339  "SQL_CSS_CREATE_CHARACTER_SET",
340  "SQL_CSS_COLLATE_CLAUSE",
341  "SQL_CSS_LIMITED_COLLATION"
342};
343
344
345static
346MASK (SQL_CREATE_COLLATION) =
347{
348  "SQL_CCOL_UNKNOWN",
349  "SQL_CCOL_CREATE_COLLATION"
350};
351
352
353static
354MASK (SQL_CREATE_DOMAIN) =
355{
356  "SQL_CDO_UNKNOWN",
357  "SQL_CDO_CREATE_DOMAIN",
358  "SQL_CDO_DEFAULT",
359  "SQL_CDO_CONSTRAINT",
360  "SQL_CDO_COLLATION",
361  "SQL_CDO_CONSTRAINT_NAME_DEFINITION",
362  "SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED",
363  "SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE",
364  "SQL_CDO_CONSTRAINT_DEFERRABLE",
365  "SQL_CDO_CONSTRAINT_NON_DEFERRABLE"
366};
367
368
369static
370MASK (SQL_CREATE_SCHEMA) =
371{
372  "SQL_CS_UNKNOWN",
373  "SQL_CS_CREATE_SCHEMA",
374  "SQL_CS_AUTHORIZATION",
375  "SQL_CS_DEFAULT_CHARACTER_SET"
376};
377
378
379static
380MASK (SQL_CREATE_TABLE) =
381{
382  "SQL_CT_UNKNOWN",
383  "SQL_CT_CREATE_TABLE",
384  "SQL_CT_COMMIT_PRESERVE",
385  "SQL_CT_COMMIT_DELETE",
386  "SQL_CT_GLOBAL_TEMPORARY",
387  "SQL_CT_LOCAL_TEMPORARY",
388  "SQL_CT_CONSTRAINT_INITIALLY_DEFERRED",
389  "SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE",
390  "SQL_CT_CONSTRAINT_DEFERRABLE",
391  "SQL_CT_CONSTRAINT_NON_DEFERRABLE",
392  "SQL_CT_COLUMN_CONSTRAINT",
393  "SQL_CT_COLUMN_DEFAULT",
394  "SQL_CT_COLUMN_COLLATION",
395  "SQL_CT_TABLE_CONSTRAINT",
396  "SQL_CT_CONSTRAINT_NAME_DEFINITION"
397};
398
399
400static
401MASK (SQL_CREATE_TRANSLATION) =
402{
403  "SQL_CTR_UNKNOWN",
404  "SQL_CTR_CREATE_TRANSLATION"
405};
406
407
408static
409MASK (SQL_CREATE_VIEW) =
410{
411  "SQL_CV_UNKNOWN",
412  "SQL_CV_CREATE_VIEW",
413  "SQL_CV_CHECK_OPTION",
414  "SQL_CV_CASCADED",
415  "SQL_CV_LOCAL"
416};
417
418
419static
420MASK (CURSOR_BEHAVIOR) =
421{
422  "SQL_CB_DELETE",
423  "SQL_CB_CLOSE",
424  "SQL_CB_PRESERVE"
425};
426
427static
428MASK (SQL_CURSOR_SENSITIVITY) =
429{
430  "SQL_UNSPECIFIED",
431  "SQL_INSENSITIVE",
432  "SQL_SENSITIVE"
433};
434
435
436static
437MASK (SQL_DATETIME_LITERALS) =
438{
439  "SQL_DL_SQL92_DATE",
440  "SQL_DL_SQL92_TIME",
441  "SQL_DL_SQL92_TIMESTAMP",
442  "SQL_DL_SQL92_INTERVAL_YEAR",
443  "SQL_DL_SQL92_INTERVAL_MONTH",
444  "SQL_DL_SQL92_INTERVAL_DAY",
445  "SQL_DL_SQL92_INTERVAL_HOUR",
446  "SQL_DL_SQL92_INTERVAL_MINUTE",
447  "SQL_DL_SQL92_INTERVAL_SECOND",
448  "SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH",
449  "SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR",
450  "SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE",
451  "SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND",
452  "SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE",
453  "SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND",
454  "SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND"
455};
456
457
458static
459MASK (SQL_DDL_INDEX) =
460{
461  "SQL_DI_UNKNOWN",
462  "SQL_DI_CREATE_INDEX",
463  "SQL_DI_DROP_INDEX"
464};
465
466
467static
468MASK (SQL_DROP_ASSERTION) =
469{
470  "SQL_DA_UNKNOWN",
471  "SQL_DA_DROP_ASSERTION"
472};
473
474
475static
476MASK (SQL_DROP_CHARACTER_SET) =
477{
478  "SQL_DCS_UNKNOWN",
479  "SQL_DCS_DROP_CHARACTER_SET"
480};
481
482
483static
484MASK (SQL_DROP_COLLATION) =
485{
486  "SQL_DC_UNKNOWN",
487  "SQL_DC_DROP_COLLATION"
488};
489
490
491static
492MASK (SQL_DROP_DOMAIN) =
493{
494  "SQL_DD_UNKNOWN",
495  "SQL_DD_DROP_DOMAIN",
496  "SQL_DD_RESTRICT",
497  "SQL_DD_CASCASE"
498};
499
500
501static
502MASK (SQL_DROP_SCHEMA) =
503{
504  "SQL_DS_UNKNOWN",
505  "SQL_DS_DROP_SCHEMA",
506  "SQL_DS_RESTRICT",
507  "SQL_DS_CASCADE"
508};
509
510
511static
512MASK (SQL_DROP_TABLE) =
513{
514  "SQL_DT_UNKNOWN",
515  "SQL_DT_DROP_TABLE",
516  "SQL_DT_RESTRICT",
517  "SQL_DT_CASCADE"
518};
519
520
521static
522MASK (SQL_DROP_TRANSLATION) =
523{
524  "SQL_DTR_UNKNOWN",
525  "SQL_DTR_DROP_TRANSLATION"
526};
527
528
529static
530MASK (SQL_DROP_VIEW) =
531{
532  "SQL_DV_UNKNOWN",
533  "SQL_DV_DROP_TABLE",
534  "SQL_DV_RESTRICT",
535  "SQL_DV_CASCADE"
536};
537
538
539static
540MASK (CURSOR_ATTRIBUTES1) =
541{
542  "SQL_CA1_UNKNOWN",
543  "SQL_CA1_NEXT",
544  "SQL_CA1_ABSOLUTE",
545  "SQL_CA1_RELATIVE",
546  "SQL_CA1_BOOKMARK",
547  "SQL_CA1_UNKNOWN_BIT 5",
548  "SQL_CA1_UNKNOWN_BIT 6",
549  "SQL_CA1_LOCK_NO_CHANGE",
550  "SQL_CA1_LOCK_EXCLUSIVE",
551  "SQL_CA1_LOCK_UNLOCK",
552  "SQL_CA1_POS_POSITION",
553  "SQL_CA1_POS_UPDATE",
554  "SQL_CA1_POS_DELETE",
555  "SQL_CA1_POS_REFRESH",
556  "SQL_CA1_POSITIONED_UPDATE",
557  "SQL_CA1_POSITIONED_DELETE",
558  "SQL_CA1_SELECT_FOR_UPDATE",
559  "SQL_CA1_BULK_ADD",
560  "SQL_CA1_BULK_UPDATE_BY_BOOKMARK",
561  "SQL_CA1_BULK_DELETE_BY_BOOKMARK",
562  "SQL_CA1_BULK_FETCH_BY_BOOKMARK"
563};
564
565
566static
567MASK (CURSOR_ATTRIBUTES2) =
568{
569  "SQL_CA2_UNKNOWN",
570  "SQL_CA2_READ_ONLY_CONCURRENCY",
571  "SQL_CA2_LOCK_CONCURRENCY",
572  "SQL_CA2_OPT_ROWVER_CONCURRENCY",
573  "SQL_CA2_OPT_VALUES_CONCURRENCY",
574  "SQL_CA2_SENSITIVITY_ADDITIONS",
575  "SQL_CA2_SENSITIVITY_DELETIONS",
576  "SQL_CA2_SENSITIVITY_UPDATES",
577  "SQL_CA2_MAX_ROWS_SELECT",
578  "SQL_CA2_MAX_ROWS_INSERT",
579  "SQL_CA2_MAX_ROWS_DELETE",
580  "SQL_CA2_MAX_ROWS_UPDATE",
581  "SQL_CA2_MAX_ROWS_CATALOG",
582  "SQL_CA2_CRC_EXACT",
583  "SQL_CA2_CRC_APPROXIMATE",
584  "SQL_CA2_SIMULATE_NON_UNIQUE",
585  "SQL_CA2_SIMULATE_TRY_UNIQUE",
586  "SQL_CA2_SIMULATE_UNIQUE"
587};
588
589
590static
591MASK (SQL_INDEX_KEYWORDS) =
592{
593  "SQL_IK_NONE",
594  "SQL_IK_ASC",
595  "SQL_IK_DESC"
596};
597
598
599static
600MASK (SQL_INFO_SCHEMA_VIEWS) =
601{
602  "SQL_ISV_UNKNOWN",
603  "SQL_ISV_ASSERTIONS",
604  "SQL_ISV_CHARACTER_SETS",
605  "SQL_ISV_CHECK_CONSTRAINTS",
606  "SQL_ISV_COLLATIONS",
607  "SQL_ISV_COLUMN_DOMAIN_USAGE",
608  "SQL_ISV_COLUMN_PRIVILEGES",
609  "SQL_ISV_COLUMNS",
610  "SQL_ISV_CONSTRAINT_COLUMN_USAGE",
611  "SQL_ISV_CONSTRAINT_TABLE_USAGE",
612  "SQL_ISV_DOMAIN_CONSTRAINTS",
613  "SQL_ISV_DOMAINS",
614  "SQL_ISV_KEY_COLUMN_USAGE",
615  "SQL_ISV_REFERENTIAL_CONSTRAINTS",
616  "SQL_ISV_SCHEMATA",
617  "SQL_ISV_SQL_LANGUAGES",
618  "SQL_ISV_TABLE_CONSTRAINTS",
619  "SQL_ISV_TABLE_PRIVILEGES",
620  "SQL_ISV_TABLES",
621  "SQL_ISV_TRANSLATIONS",
622  "SQL_ISV_USAGE_PRIVILEGES",
623  "SQL_ISV_VIEW_COLUMN_USAGE",
624  "SQL_ISV_VIEW_TABLE_USAGE",
625  "SQL_ISV_VIEWS"
626};
627
628
629static
630MASK (SQL_INSERT_STATEMENT) =
631{
632  "SQL_IS_UNKNOWN",
633  "SQL_IS_INSERT_LITERALS",
634  "SQL_IS_INSERT_SEARCHED",
635  "SQL_IS_SELECT_INTO"
636};
637
638
639static
640MASK (SQL_DTC_TRANSITION_COST) =
641{
642  "SQL_DTC_UNKNOWN",
643  "SQL_DTC_ENLIST_EXPENSIVE",
644  "SQL_DTC_UNENLIST_EXPENSIVE"
645};
646
647
648static
649MASK (TXN_ISOLATION) =
650{
651  "SQL_TXN_UNKNOWN",
652  "SQL_TXN_READ_UNCOMMITTED",
653  "SQL_TXN_READ_COMMITTED",
654  "SQL_TXN_REPEATABLE_READ",
655  "SQL_TXN_SERIALIZABLE",
656  "SQL_TXN_VERSIONING"
657};
658
659
660static
661MASK (SQL_FETCH_DIRECTION) =
662{
663  "SQL_FD_FETCH_UNKNOWN",
664  "SQL_FD_FETCH_NEXT",
665  "SQL_FD_FETCH_FIRST",
666  "SQL_FD_FETCH_LAST",
667  "SQL_FD_FETCH_PRIOR",
668  "SQL_FD_FETCH_ABSOLUTE",
669  "SQL_FD_FETCH_RELATIVE",
670  "SQL_FD_FETCH_RESUME",
671  "SQL_FD_FETCH_BOOKMARK"
672};
673
674
675static
676MASK (SQL_FILE_USAGE) =
677{
678  "SQL_FILE_NOT_SUPPORTED",
679  "SQL_FILE_TABLE",
680  "SQL_FILE_QUALIFIER"
681};
682
683
684static
685MASK (SQL_GETDATA_EXTENSIONS) =
686{
687  "SQL_GD_UNKNOWN",
688  "SQL_GD_ANY_COLUMN",
689  "SQL_GD_ANY_ORDER",
690  "SQL_GD_BLOCK",
691  "SQL_GD_BOUND"
692};
693
694
695static
696MASK (SQL_GROUP_BY) =
697{
698  "SQL_GB_NOT_SUPPORTED",
699  "SQL_GB_GROUP_BY_EQUALS_SELECT",
700  "SQL_GB_GROUP_BY_CONTAINS_SELECT",
701  "SQL_GB_NO_RELATION"
702};
703
704
705static
706MASK (IDENTIFIER_CASE) =
707{
708  "SQL_IC_UNKNOWN",
709  "SQL_IC_UPPER",
710  "SQL_IC_LOWER",
711  "SQL_IC_SENSITIVE",
712  "SQL_IC_MIXED"
713};
714
715
716static
717MASK (SQL_LOCK_TYPES) =
718{
719  "SQL_LCK_UNKNOWN",
720  "SQL_LCK_NO_CHANGE",
721  "SQL_LCK_EXCLUSIVE",
722  "SQL_LCK_UNLOCK"
723};
724
725
726static
727MASK (SQL_NON_NULLABLE_COLUMNS) =
728{
729  "SQL_NNC_NULL",
730  "SQL_NNC_NON_NULL"
731};
732
733
734static
735MASK (SQL_NULL_COLLATION) =
736{
737  "SQL_NC_HIGH",
738  "SQL_NC_LOW",
739  "SQL_NC_START"
740  "SQL_NC_END",
741};
742
743
744static
745MASK (SQL_NUMERIC_FUNCTIONS) =
746{
747  "SQL_FN_UNKNOWN",
748  "SQL_FN_NUM_ABS",
749  "SQL_FN_NUM_ACOS",
750  "SQL_FN_NUM_ASIN",
751  "SQL_FN_NUM_ATAN",
752  "SQL_FN_NUM_ATAN2",
753  "SQL_FN_NUM_CEILING",
754  "SQL_FN_NUM_COS",
755  "SQL_FN_NUM_COT",
756  "SQL_FN_NUM_EXP",
757  "SQL_FN_NUM_FLOOR",
758  "SQL_FN_NUM_LOG",
759  "SQL_FN_NUM_MOD",
760  "SQL_FN_NUM_SIGN",
761  "SQL_FN_NUM_SIN",
762  "SQL_FN_NUM_SQRT",
763  "SQL_FN_NUM_TAN",
764  "SQL_FN_NUM_PI",
765  "SQL_FN_NUM_RAND",
766  "SQL_FN_NUM_DEGREES",
767  "SQL_FN_NUM_LOG10",
768  "SQL_FN_NUM_POWER",
769  "SQL_FN_NUM_RADIANS",
770  "SQL_FN_NUM_ROUND",
771  "SQL_FN_NUM_TRUNCATE"
772};
773
774
775static
776MASK (SQL_ODBC_API_CONFORMANCE) =
777{
778  "SQL_OAC_NONE",
779  "SQL_OAC_LEVEL1",
780  "SQL_OAC_LEVEL2"
781};
782
783
784static
785MASK (SQL_ODBC_INTERFACE_CONFORMANCE) =
786{
787  "SQL_OIC_UNKNOWN",
788  "SQL_OAC_CORE",
789  "SQL_OAC_LEVEL1",
790  "SQL_OAC_LEVEL2"
791};
792
793
794static
795MASK (SQL_ODBC_SAG_CLI_CONFORMANCE) =
796{
797  "SQL_OSCC_NOT_COMPLIANT",
798  "SQL_OSCC_COMPLIANT"
799};
800
801
802static
803MASK (SQL_ODBC_SQL_CONFORMANCE) =
804{
805  "SQL_OSC_MINIMUM",
806  "SQL_OSC_CORE",
807  "SQL_OSC_EXTENDED"
808};
809
810
811static
812MASK (SQL_OJ_CAPABILITIES) =
813{
814  "SQL_OJ_UNKNOWN",
815  "SQL_OJ_LEFT",
816  "SQL_OJ_RIGHT",
817  "SQL_OJ_FULL",
818  "SQL_OJ_NESTED",
819  "SQL_OJ_NOT_ORDERED",
820  "SQL_OJ_INNER",
821  "SQL_OJ_ALL_COMPARISON_OPS"
822};
823
824
825#if (ODBCVER < 0x0300)
826static
827MASK (SQL_OWNER_USAGE) =
828{
829  "SQL_OU_UNKNOWN",
830  "SQL_OU_DML_STATEMENTS",
831  "SQL_OU_PROCEDURE_INVOCATION",
832  "SQL_OU_TABLE_DEFINITION",
833  "SQL_OU_INDEX_DEFINITION",
834  "SQL_OU_PRIVILEGE_DEFINITION"
835};
836#endif
837
838
839static
840MASK (SQL_PARAM_ARRAY_ROW_COUNTS) =
841{
842  "SQL_PARC_UNKNOWN",
843  "SQL_PARC_BATCH",
844  "SQL_PARC_NOBATCH"
845};
846
847
848static
849MASK (SQL_PARAM_ARRAY_SELECTS) =
850{
851  "SQL_PAS_UNKNOWN",
852  "SQL_PAS_BATCH",
853  "SQL_PAS_NO_BATCH",
854  "SQL_PAS_NO_SELECT"
855};
856
857
858static
859MASK (SQL_POSITIONED_STATEMENTS) =
860{
861  "SQL_PS_UNKNOWN",
862  "SQL_PS_POSITIONED_DELETE",
863  "SQL_PS_POSITIONED_UPDATE",
864  "SQL_PS_SELECT_FOR_UPDATE"
865};
866
867
868static
869MASK (SQL_POS_OPERATIONS) =
870{
871  "SQL_POS_UNKNOWN",
872  "SQL_POS_POSITION",
873  "SQL_POS_REFRESH",
874  "SQL_POS_UPDATE",
875  "SQL_POS_DELETE",
876  "SQL_POS_ADD"
877};
878
879
880#if (ODBCVER < 0x0300)
881static
882MASK (SQL_QUALIFIER_LOCATION) =
883{
884  "SQL_QL_UNKNOWN",
885  "SQL_QL_START",
886  "SQL_QL_END"
887};
888#endif
889
890
891#if (ODBCVER < 0x0300)
892static
893MASK (SQL_QUALIFIER_USAGE) =
894{
895  "SQL_QU_UNKNOWN",
896  "SQL_QU_DML_STATEMENTS",
897  "SQL_QU_PROCEDURE_INVOCATION",
898  "SQL_QU_TABLE_DEFINITION",
899  "SQL_QU_INDEX_DEFINITION",
900  "SQL_QU_PRIVILEGE_DEFINITION"
901};
902#endif
903
904
905static
906MASK (SQL_SCHEMA_USAGE) =
907{
908  "SQL_SU_UNKNOWN",
909  "SQL_SU_DML_STATEMENTS",
910  "SQL_SU_PROCEDURE_INVOCATION",
911  "SQL_SU_TABLE_DEFINITION",
912  "SQL_SU_INDEX_DEFINITION",
913  "SQL_SU_PRIVILEGE_DEFINITION"
914};
915
916
917static
918MASK (SQL_SCROLL_CONCURRENCY) =
919{
920  "SQL_SCCO_UNKNOWN",
921  "SQL_SCCO_READ_ONLY",
922  "SQL_SCCO_LOCK",
923  "SQL_SCCO_OPT_ROWVER",
924  "SQL_SCCO_OPT_VALUES"
925};
926
927
928static
929MASK (SQL_SCROLL_OPTIONS) =
930{
931  "SQL_SO_UNKNOWN",
932  "SQL_SO_FORWARD_ONLY",
933  "SQL_SO_KEYSET_DRIVEN",
934  "SQL_SO_DYNAMIC",
935  "SQL_SO_MIXED",
936  "SQL_SO_STATIC"
937};
938
939
940static
941MASK (SQL_SQL_CONFORMANCE) =
942{
943  "SQL_SC_UINKNOWN",
944  "SQL_SC_SQL92_ENTRY",
945  "SQL_SC_FIPS127_2_TRANSITIONAL",
946  "SQL_SC_SQL92_INTERMEDIATE",
947  "SQL_SC_SQL92_FULL"
948};
949
950
951static
952MASK (SQL_SQL92_DATETIME_FUNCTIONS) =
953{
954  "SQL_SDF_UNKNOWN",
955  "SQL_SDF_CURRENT_DATE",
956  "SQL_SDF_CURRENT_TIME",
957  "SQL_SDF_CURRENT_TIMESTAMP"
958};
959
960
961static
962MASK (SQL_SQL92_FOREIGN_KEY_DELETE_RULE) =
963{
964  "SQL_SFKD_UNKNOWN",
965  "SQL_SFKD_CASCADE",
966  "SQL_SFKD_NO_ACTION",
967  "SQL_SFKD_SET_DEFAULT",
968  "SQL_SFKD_SET_NULL"
969};
970
971
972static
973MASK (SQL_SQL92_FOREIGN_KEY_UPDATE_RULE) =
974{
975  "SQL_SFKU_UNKNOWN",
976  "SQL_SFKU_CASCADE",
977  "SQL_SFKU_NO_ACTION",
978  "SQL_SFKU_SET_DEFAULT",
979  "SQL_SFKU_SET_NULL"
980};
981
982
983static
984MASK (SQL_SQL92_GRANT) =
985{
986  "SQL_SG_UNKNOWN",
987  "SQL_SG_USAGE_ON_DOMAIN",
988  "SQL_SG_USAGE_ON_CHARACTER_SET",
989  "SQL_SG_USAGE_ON_COLLATION",
990  "SQL_SG_USAGE_ON_TRANSLATION",
991  "SQL_SG_WITH_GRANT_OPTION",
992  "SQL_SG_DELETE_TABLE",
993  "SQL_SG_INSERT_TABLE",
994  "SQL_SG_INSERT_COLUMN",
995  "SQL_SG_REFERENCES_TABLE",
996  "SQL_SG_REFERENCES_COLUMN",
997  "SQL_SG_SELECT_TABLE",
998  "SQL_SG_UPDATE_TABLE",
999  "SQL_SG_UPDATE_COLUMN"
1000};
1001
1002
1003static
1004MASK (SQL_SQL92_NUMERIC_VALUE_FUNCTIONS) =
1005{
1006  "SQL_SNVF_UNKNOWN",
1007  "SQL_SNVF_BIT_LENGTH",
1008  "SQL_SNVF_CHAR_LENGTH",
1009  "SQL_SNVF_CHARACTER_LENGTH",
1010  "SQL_SNVF_EXTRACT",
1011  "SQL_SNVF_OCTET_LENGTH",
1012  "SQL_SNVF_POSITION"
1013};
1014
1015
1016static
1017MASK (SQL_SQL92_PREDICATES) =
1018{
1019  "SQL_SP_UNKNOWN",
1020  "SQL_SP_EXISTS",
1021  "SQL_SP_ISNOTNULL",
1022  "SQL_SP_ISNULL",
1023  "SQL_SP_MATCH_FULL",
1024  "SQL_SP_MATCH_PARTIAL",
1025  "SQL_SP_MATCH_UNIQUE_FULL",
1026  "SQL_SP_MATCH_UNIQUE_PARTIAL",
1027  "SQL_SP_OVERLAPS",
1028  "SQL_SP_UNIQUE",
1029  "SQL_SP_LIKE",
1030  "SQL_SP_IN",
1031  "SQL_SP_BETWEEN",
1032  "SQL_SP_COMPARISON",
1033  "SQL_SP_QUANTIFIED_COMPARISON"
1034};
1035
1036
1037static
1038MASK (SQL_SQL92_RELATIONAL_JOIN_OPERATORS) =
1039{
1040  "SQL_SRJO_UNKOWN",
1041  "SQL_SRJO_CORRESPONDING_CLAUSE",
1042  "SQL_SRJO_CROSS_JOIN",
1043  "SQL_SRJO_EXCEPT_JOIN",
1044  "SQL_SRJO_FULL_OUTER_JOIN",
1045  "SQL_SRJO_INNER_JOIN",
1046  "SQL_SRJO_INTERSECT_JOIN",
1047  "SQL_SRJO_LEFT_OUTER_JOIN",
1048  "SQL_SRJO_NATURAL_JOIN",
1049  "SQL_SRJO_RIGHT_OUTER_JOIN",
1050  "SQL_SRJO_UNION_JOIN"
1051};
1052
1053
1054static
1055MASK (SQL_SQL92_REVOKE) =
1056{
1057  "SQL_SR_UNKNOWN",
1058  "SQL_SR_USAGE_ON_DOMAIN",
1059  "SQL_SR_USAGE_ON_CHARACTER_SET",
1060  "SQL_SR_USAGE_ON_COLLATION",
1061  "SQL_SR_USAGE_ON_TRANSLATION",
1062  "SQL_SR_GRANT_OPTION_FOR",
1063  "SQL_SR_CASCADE",
1064  "SQL_SR_RESTRICT",
1065  "SQL_SR_DELETE_TABLE",
1066  "SQL_SR_INSERT_TABLE",
1067  "SQL_SR_INSERT_COLUMN",
1068  "SQL_SR_REFERENCES_TABLE",
1069  "SQL_SR_REFERENCES_COLUMN",
1070  "SQL_SR_SELECT_TABLE",
1071  "SQL_SR_UPDATE_TABLE",
1072  "SQL_SR_UPDATE_COLUMN"
1073};
1074
1075
1076static
1077MASK (SQL_SQL92_ROW_VALUE_CONSTRUCTOR) =
1078{
1079  "SQL_SRVC_UNKOWN",
1080  "SQL_SRVC_VALUE_EXPRESSION",
1081  "SQL_SRVC_NULL",
1082  "SQL_SRVC_DEFAULT",
1083  "SQL_SRVC_ROW_SUBQUERY"
1084};
1085
1086
1087static
1088MASK (SQL_SQL92_STRING_FUNCTIONS) =
1089{
1090  "SQL_SSF_UNKNOWN",
1091  "SQL_SSF_CONVERT",
1092  "SQL_SSF_LOWER",
1093  "SQL_SSF_UPPER",
1094  "SQL_SSF_SUBSTRING",
1095  "SQL_SSF_TRANSLATE",
1096  "SQL_SSF_TRIM_BOTH",
1097  "SQL_SSF_TRIM_LEADING",
1098  "SQL_SSF_TRIM_TRAILING"
1099};
1100
1101
1102static
1103MASK (SQL_SQL92_VALUE_EXPRESSIONS) =
1104{
1105  "SQL_SVE_UNKNOWN",
1106  "SQL_SVE_CASE",
1107  "SQL_SVE_CAST",
1108  "SQL_SVE_COALESCE",
1109  "SQL_SVE_NULLIF"
1110};
1111
1112
1113static
1114MASK (SQL_STANDARD_CLI_CONFORMANCE) =
1115{
1116  "SQL_SCC_UNKNOWN",
1117  "SQL_SCC_XOPEN_CLI_VERSION1",
1118  "SQL_SCC_ISO92_CLI",
1119};
1120
1121
1122static
1123MASK (SQL_STATIC_SENSITIVITY) =
1124{
1125  "SQL_SS_UNKNOWN",
1126  "SQL_SS_ADDITIONS",
1127  "SQL_SS_DELETIONS",
1128  "SQL_SS_UPDATES"
1129};
1130
1131
1132static
1133MASK (SQL_STRING_FUNCTIONS) =
1134{
1135  "SQL_FN_STR_UNKNOWN",
1136  "SQL_FN_STR_CONCAT",
1137  "SQL_FN_STR_INSERT",
1138  "SQL_FN_STR_LEFT",
1139  "SQL_FN_STR_LTRIM",
1140  "SQL_FN_STR_LENGTH",
1141  "SQL_FN_STR_LOCATE",
1142  "SQL_FN_STR_LCASE",
1143  "SQL_FN_STR_REPEAT",
1144  "SQL_FN_STR_REPLACE",
1145  "SQL_FN_STR_RIGHT",
1146  "SQL_FN_STR_RTRIM",
1147  "SQL_FN_STR_SUBSTRING",
1148  "SQL_FN_STR_UCASE ",
1149  "SQL_FN_STR_ASCII",
1150  "SQL_FN_STR_CHAR",
1151  "SQL_FN_STR_DIFFERENCE",
1152  "SQL_FN_STR_LOCATE_2",
1153  "SQL_FN_STR_SOUNDEX",
1154  "SQL_FN_STR_SPACE",
1155  "SQL_FN_BIT_LENGTH",
1156  "SQL_FN_STR_CHAR_LENGTH",
1157  "SQL_FN_STR_CARACTER_LENGTH",
1158  "SQL_FN_STR_OCTET_LENGTH",
1159  "SQL_FN_STR_POSITION"
1160};
1161
1162
1163static
1164MASK (SQL_SUBQUERIES) =
1165{
1166  "SQL_SQ_UNKNOWN",
1167  "SQL_SQ_COMPARISON",
1168  "SQL_SQ_EXISTS",
1169  "SQL_SQ_IN",
1170  "SQL_SQ_QUANTIFIED",
1171  "SQL_SQ_CORRELATED_SUBQUERIES"
1172};
1173
1174
1175static
1176MASK (SQL_SYSTEM_FUNCTIONS) =
1177{
1178  "SQL_FN_SYS_UNKNOWN",
1179  "SQL_FN_SYS_USERNAME",
1180  "SQL_FN_SYS_DBNAME",
1181  "SQL_FN_SYS_IFNULL"
1182};
1183
1184
1185static
1186MASK (TIMEDATE_INTERVALS) =
1187{
1188  "SQL_FN_TSI_UNKNOWN",
1189  "SQL_FN_TSI_FRAC_SECOND",
1190  "SQL_FN_TSI_SECOND",
1191  "SQL_FN_TSI_MINUTE",
1192  "SQL_FN_TSI_HOUR",
1193  "SQL_FN_TSI_DAY",
1194  "SQL_FN_TSI_WEEK",
1195  "SQL_FN_TSI_MONTH",
1196  "SQL_FN_TSI_QUARTER",
1197  "SQL_FN_TSI_YEAR "
1198};
1199
1200
1201static
1202MASK (SQL_TIMEDATE_FUNCTIONS) =
1203{
1204  "SQL_FN_TD_UNKNOWN",
1205  "SQL_FN_TD_NOW",
1206  "SQL_FN_TD_CURDATE",
1207  "SQL_FN_TD_DAYOFMONTH",
1208  "SQL_FN_TD_DAYOFWEEK",
1209  "SQL_FN_TD_DAYOFYEAR",
1210  "SQL_FN_TD_MONTH",
1211  "SQL_FN_TD_QUARTER",
1212  "SQL_FN_TD_WEEK",
1213  "SQL_FN_TD_YEAR",
1214  "SQL_FN_TD_CURTIME",
1215  "SQL_FN_TD_HOUR",
1216  "SQL_FN_TD_MINUTE",
1217  "SQL_FN_TD_SECOND",
1218  "SQL_FN_TD_TIMESTAMPADD",
1219  "SQL_FN_TD_TIMESTAMPDIFF",
1220  "SQL_FN_TD_DAYNAME",
1221  "SQL_FN_TD_MONTHNAME",
1222  "SQL_FN_TD_CURRENT_DATE",
1223  "SQL_FN_TD_CURRENT_TIME",
1224  "SQL_FN_TD_CURRENT_TIMESTAMP",
1225  "SQL_FN_TD_EXTRACT"
1226};
1227
1228
1229static
1230MASK (SQL_TXN_CAPABLE) =
1231{
1232  "SQL_TC_NONE",
1233  "SQL_TC_DML",
1234  "SQL_TC_ALL",
1235  "SQL_TC_DDL_COMMIT",
1236  "SQL_TC_DDL_IGNORE",
1237};
1238
1239
1240static
1241MASK (SQL_UNION) =
1242{
1243  "SQL_U_UNION_UNKNOWN",
1244  "SQL_U_UNION",
1245  "SQL_U_UNION_ALL"
1246};
1247
1248
1249
1250/*
1251 *  Decode the various GetInfo return values and print them into the trace log
1252 */
1253static void
1254_trace_getinfo (
1255  SQLUSMALLINT		  fInfoType,
1256  SQLPOINTER		  rgbInfoValue,
1257  SQLSMALLINT		  cbInfoValueMax,
1258  SQLSMALLINT    	* pcbInfoValue,
1259  int			  output,
1260  char			  waMode)
1261{
1262  char *infoname;
1263  char **mask;
1264  int elem;
1265  int i;
1266
1267  cbInfoValueMax = cbInfoValueMax;	/*UNUSED*/
1268  pcbInfoValue = pcbInfoValue;		/*UNUSED*/
1269
1270  /*
1271   *  If the pointer is NULL, we have no information to decode, so
1272   *  we just print the generic details.
1273   */
1274  if (!rgbInfoValue)
1275    output = 0;
1276
1277  switch (fInfoType)
1278    {
1279
1280      /*
1281       *  ODBC 1.0
1282       */
1283      I_STR (SQL_ACCESSIBLE_TABLES);
1284
1285      I_STR (SQL_ACCESSIBLE_PROCEDURES);
1286
1287#if (ODBCVER < 0x0300)
1288      I_INT16 (SQL_ACTIVE_CONNECTIONS);	/* 3.0: SQL_MAX_DRIVER_CONNECTIONS */
1289#endif
1290
1291#if (ODBCVER < 0x0300)
1292      I_INT16 (SQL_ACTIVE_STATEMENTS);  /* 3.0: SQL_MAX_CONCURRENT_ACTIVITIES */
1293#endif
1294
1295      I_SVAL (SQL_CONCAT_NULL_BEHAVIOR);
1296
1297      I_MASK (SQL_CONVERT_FUNCTIONS);
1298
1299      I_MASK1 (SQL_CONVERT_BIGINT, CONVERT);
1300      I_MASK1 (SQL_CONVERT_BINARY, CONVERT);
1301      I_MASK1 (SQL_CONVERT_BIT, CONVERT);
1302      I_MASK1 (SQL_CONVERT_CHAR, CONVERT);
1303      I_MASK1 (SQL_CONVERT_DATE, CONVERT);
1304      I_MASK1 (SQL_CONVERT_DECIMAL, CONVERT);
1305      I_MASK1 (SQL_CONVERT_DOUBLE, CONVERT);
1306      I_MASK1 (SQL_CONVERT_FLOAT, CONVERT);
1307      I_MASK1 (SQL_CONVERT_INTEGER, CONVERT);
1308      I_MASK1 (SQL_CONVERT_LONGVARBINARY, CONVERT);
1309      I_MASK1 (SQL_CONVERT_LONGVARCHAR, CONVERT);
1310      I_MASK1 (SQL_CONVERT_NUMERIC, CONVERT);
1311      I_MASK1 (SQL_CONVERT_REAL, CONVERT);
1312      I_MASK1 (SQL_CONVERT_SMALLINT, CONVERT);
1313      I_MASK1 (SQL_CONVERT_TIME, CONVERT);
1314      I_MASK1 (SQL_CONVERT_TIMESTAMP, CONVERT);
1315      I_MASK1 (SQL_CONVERT_TINYINT, CONVERT);
1316      I_MASK1 (SQL_CONVERT_VARBINARY, CONVERT);
1317      I_MASK1 (SQL_CONVERT_VARCHAR, CONVERT);
1318
1319      I_SVAL1 (SQL_CURSOR_COMMIT_BEHAVIOR, CURSOR_BEHAVIOR);
1320
1321      I_SVAL1 (SQL_CURSOR_ROLLBACK_BEHAVIOR, CURSOR_BEHAVIOR);
1322
1323      I_STR (SQL_DATA_SOURCE_NAME);
1324
1325      I_STR (SQL_DATA_SOURCE_READ_ONLY);
1326
1327      I_STR (SQL_DATABASE_NAME);
1328
1329      I_STR (SQL_DBMS_NAME);
1330
1331      I_STR (SQL_DBMS_VER);
1332
1333      I_MASK1 (SQL_DEFAULT_TXN_ISOLATION, TXN_ISOLATION);
1334
1335      I_INT32 (SQL_DRIVER_HDBC);
1336
1337      I_INT32 (SQL_DRIVER_HENV);
1338
1339      I_INT32 (SQL_DRIVER_HSTMT);
1340
1341      I_STR (SQL_DRIVER_NAME);
1342
1343      I_STR (SQL_DRIVER_VER);
1344
1345      I_STR (SQL_EXPRESSIONS_IN_ORDERBY);
1346
1347      I_MASK (SQL_FETCH_DIRECTION);
1348
1349      I_SVAL1 (SQL_IDENTIFIER_CASE, IDENTIFIER_CASE);
1350
1351      I_STR (SQL_IDENTIFIER_QUOTE_CHAR);
1352
1353      I_INT16 (SQL_MAX_COLUMN_NAME_LEN);
1354
1355      I_INT16 (SQL_MAX_CURSOR_NAME_LEN);
1356
1357#if (ODBCVER < 0x0300)
1358      I_INT16 (SQL_MAX_OWNER_NAME_LEN); /* 3.0: SQL_MAX_SCHEMA_NAME_LEN */
1359#endif
1360
1361      I_INT16 (SQL_MAX_PROCEDURE_NAME_LEN);
1362
1363#if (ODBCVER < 0x0300)
1364      I_INT16 (SQL_MAX_QUALIFIER_NAME_LEN); /* 3.0: SQL_MAX_CATALOG_NAME_LEN */
1365#endif
1366
1367      I_INT16 (SQL_MAX_TABLE_NAME_LEN);
1368
1369      I_STR (SQL_MULT_RESULT_SETS);
1370
1371      I_STR (SQL_MULTIPLE_ACTIVE_TXN);
1372
1373      I_MASK (SQL_NUMERIC_FUNCTIONS);
1374
1375      I_SVAL (SQL_ODBC_API_CONFORMANCE);
1376
1377      I_SVAL (SQL_ODBC_SAG_CLI_CONFORMANCE);
1378
1379      I_SVAL (SQL_ODBC_SQL_CONFORMANCE);
1380
1381      I_STR (SQL_ODBC_VER);
1382
1383#if (ODBCVER < 0x0300)
1384      I_STR (SQL_ODBC_SQL_OPT_IEF); /* 3.0: SQL_INTEGRITY */
1385#endif
1386
1387#if (ODBCVER < 0x0300)
1388      I_STR (SQL_OWNER_TERM); /* 3.0: SQL_SCHEMA_TERM */
1389#endif
1390
1391      I_STR (SQL_OUTER_JOINS);
1392
1393      I_STR (SQL_PROCEDURE_TERM);
1394
1395      I_STR (SQL_PROCEDURES);
1396
1397#if (ODBCVER < 0x0300)
1398      I_STR (SQL_QUALIFIER_NAME_SEPARATOR); /* 3.0: SQL_CATALOG_NAME_SEPARATOR */
1399#endif
1400
1401#if (ODBCVER < 0x0300)
1402      I_STR (SQL_QUALIFIER_TERM); /* 3.0: SQL_CATALOG_TERM */
1403#endif
1404
1405      I_STR (SQL_ROW_UPDATES);
1406
1407      I_MASK (SQL_SCROLL_CONCURRENCY);
1408
1409      I_MASK (SQL_SCROLL_OPTIONS);
1410
1411      I_STR (SQL_SEARCH_PATTERN_ESCAPE);
1412
1413      I_STR (SQL_SERVER_NAME);
1414
1415      I_MASK (SQL_STRING_FUNCTIONS);
1416
1417      I_MASK (SQL_SYSTEM_FUNCTIONS);
1418
1419      I_STR (SQL_TABLE_TERM);
1420
1421      I_MASK (SQL_TIMEDATE_FUNCTIONS);
1422
1423      I_SVAL (SQL_TXN_CAPABLE);
1424
1425      I_MASK1 (SQL_TXN_ISOLATION_OPTION, TXN_ISOLATION);
1426
1427      I_STR (SQL_USER_NAME);
1428
1429
1430      /*
1431       * ODBC 1.0 Additions
1432       */
1433      I_SVAL (SQL_CORRELATION_NAME);
1434
1435      I_SVAL (SQL_NON_NULLABLE_COLUMNS);
1436
1437
1438      /*
1439       *  ODBC 2.0 Additions
1440       */
1441      I_MASK (SQL_ALTER_TABLE);
1442
1443      I_MASK (SQL_BOOKMARK_PERSISTENCE);
1444
1445      I_STR (SQL_COLUMN_ALIAS);
1446
1447      I_INT32 (SQL_DRIVER_HLIB);
1448
1449      I_STR (SQL_DRIVER_ODBC_VER);
1450
1451      I_MASK (SQL_GETDATA_EXTENSIONS);
1452
1453      I_SVAL (SQL_GROUP_BY);
1454
1455      I_SVAL (SQL_FILE_USAGE);
1456
1457      I_STR (SQL_KEYWORDS);
1458
1459      I_STR (SQL_LIKE_ESCAPE_CLAUSE);
1460
1461      I_MASK (SQL_LOCK_TYPES);
1462
1463      I_INT32 (SQL_MAX_BINARY_LITERAL_LEN);
1464
1465      I_INT32 (SQL_MAX_CHAR_LITERAL_LEN);
1466
1467      I_INT16 (SQL_MAX_COLUMNS_IN_GROUP_BY);
1468
1469      I_INT16 (SQL_MAX_COLUMNS_IN_INDEX);
1470
1471      I_INT16 (SQL_MAX_COLUMNS_IN_ORDER_BY);
1472
1473      I_INT16 (SQL_MAX_COLUMNS_IN_SELECT);
1474
1475      I_INT16 (SQL_MAX_COLUMNS_IN_TABLE);
1476
1477      I_INT32 (SQL_MAX_INDEX_SIZE);
1478
1479      I_STR (SQL_MAX_ROW_SIZE_INCLUDES_LONG);
1480
1481      I_INT32 (SQL_MAX_ROW_SIZE);
1482
1483      I_INT32 (SQL_MAX_STATEMENT_LEN);
1484
1485      I_INT16 (SQL_MAX_TABLES_IN_SELECT);
1486
1487      I_INT16 (SQL_MAX_USER_NAME_LEN);
1488
1489      I_STR (SQL_NEED_LONG_DATA_LEN);
1490
1491      I_SVAL (SQL_NULL_COLLATION);
1492
1493      I_STR (SQL_ORDER_BY_COLUMNS_IN_SELECT);
1494
1495#if (ODBCVER < 0x0300)
1496      I_MASK (SQL_OWNER_USAGE);  /* 3.0: SQL_SCHEMA_USAGE */
1497#endif
1498
1499      I_MASK (SQL_OJ_CAPABILITIES);
1500
1501      I_MASK (SQL_POS_OPERATIONS);
1502
1503      I_MASK (SQL_POSITIONED_STATEMENTS);
1504
1505#if (ODBCVER < 0x0300)
1506      I_SVAL (SQL_QUALIFIER_LOCATION); /* 3.0: SQL_CATALOG_LOCATION */
1507#endif
1508
1509#if (ODBCVER < 0x0300)
1510      I_MASK (SQL_QUALIFIER_USAGE); /* 3.0: SQL_CATALOG_USAGE */
1511#endif
1512
1513      I_SVAL1 (SQL_QUOTED_IDENTIFIER_CASE, IDENTIFIER_CASE);
1514
1515      I_STR (SQL_SPECIAL_CHARACTERS);
1516
1517      I_MASK (SQL_STATIC_SENSITIVITY);
1518
1519      I_MASK (SQL_SUBQUERIES);
1520
1521      I_MASK1 (SQL_TIMEDATE_ADD_INTERVALS, TIMEDATE_INTERVALS);
1522
1523      I_MASK1 (SQL_TIMEDATE_DIFF_INTERVALS, TIMEDATE_INTERVALS);
1524
1525      I_MASK (SQL_UNION);
1526
1527
1528      /*
1529       *  ODBC 3.0
1530       */
1531#if (ODBCVER >= 0x0300)
1532      I_INT16 (SQL_ACTIVE_ENVIRONMENTS);
1533
1534      I_MASK (SQL_AGGREGATE_FUNCTIONS);
1535
1536      I_MASK (SQL_ALTER_DOMAIN);
1537
1538      I_SVAL (SQL_ASYNC_MODE);
1539
1540      I_MASK (SQL_BATCH_ROW_COUNT);
1541
1542      I_MASK (SQL_BATCH_SUPPORT);
1543
1544      I_SVAL (SQL_CATALOG_LOCATION);
1545
1546      I_STR (SQL_CATALOG_NAME);
1547
1548      I_STR (SQL_CATALOG_NAME_SEPARATOR);
1549
1550      I_STR (SQL_CATALOG_TERM);
1551
1552      I_MASK (SQL_CATALOG_USAGE);
1553
1554      I_STR (SQL_COLLATION_SEQ);
1555
1556      I_MASK1 (SQL_CONVERT_INTERVAL_YEAR_MONTH, CONVERT);
1557
1558      I_MASK1 (SQL_CONVERT_INTERVAL_DAY_TIME, CONVERT);
1559
1560      I_MASK1 (SQL_CONVERT_WCHAR, CONVERT);
1561
1562      I_MASK1 (SQL_CONVERT_WLONGVARCHAR, CONVERT);
1563
1564      I_MASK1 (SQL_CONVERT_WVARCHAR, CONVERT);
1565
1566      I_MASK (SQL_CREATE_ASSERTION);
1567
1568      I_MASK (SQL_CREATE_CHARACTER_SET);
1569
1570      I_MASK (SQL_CREATE_COLLATION);
1571
1572      I_MASK (SQL_CREATE_DOMAIN);
1573
1574      I_MASK (SQL_CREATE_SCHEMA);
1575
1576      I_MASK (SQL_CREATE_TABLE);
1577
1578      I_MASK (SQL_CREATE_TRANSLATION);
1579
1580      I_MASK (SQL_CREATE_VIEW);
1581
1582      I_SVAL (SQL_CURSOR_SENSITIVITY);
1583
1584      I_MASK (SQL_DATETIME_LITERALS);
1585
1586      I_MASK (SQL_DDL_INDEX);
1587
1588      I_STR (SQL_DESCRIBE_PARAMETER);
1589
1590      I_STR (SQL_DM_VER);
1591
1592      I_MASK (SQL_DTC_TRANSITION_COST);
1593
1594      I_MASK (SQL_DROP_ASSERTION);
1595
1596      I_MASK (SQL_DROP_CHARACTER_SET);
1597
1598      I_MASK (SQL_DROP_COLLATION);
1599
1600      I_MASK (SQL_DROP_DOMAIN);
1601
1602      I_MASK (SQL_DROP_SCHEMA);
1603
1604      I_MASK (SQL_DROP_TABLE);
1605
1606      I_MASK (SQL_DROP_TRANSLATION);
1607
1608      I_MASK (SQL_DROP_VIEW);
1609
1610      I_MASK1 (SQL_DYNAMIC_CURSOR_ATTRIBUTES1, CURSOR_ATTRIBUTES1);
1611
1612      I_MASK1 (SQL_DYNAMIC_CURSOR_ATTRIBUTES2, CURSOR_ATTRIBUTES2);
1613
1614      I_MASK1 (SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, CURSOR_ATTRIBUTES1);
1615
1616      I_MASK1 (SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, CURSOR_ATTRIBUTES2);
1617
1618      I_MASK (SQL_INDEX_KEYWORDS);
1619
1620      I_MASK (SQL_INFO_SCHEMA_VIEWS);
1621
1622      I_MASK (SQL_INSERT_STATEMENT);
1623
1624      I_STR (SQL_INTEGRITY);
1625
1626      I_MASK1 (SQL_KEYSET_CURSOR_ATTRIBUTES1, CURSOR_ATTRIBUTES1);
1627
1628      I_MASK1 (SQL_KEYSET_CURSOR_ATTRIBUTES2, CURSOR_ATTRIBUTES2);
1629
1630      I_INT32 (SQL_MAX_ASYNC_CONCURRENT_STATEMENTS);
1631
1632      I_INT16 (SQL_MAX_CATALOG_NAME_LEN);
1633
1634      I_INT16 (SQL_MAX_CONCURRENT_ACTIVITIES);
1635
1636      I_INT16 (SQL_MAX_DRIVER_CONNECTIONS);
1637
1638      I_INT16 (SQL_MAX_IDENTIFIER_LEN);
1639
1640      I_INT16 (SQL_MAX_SCHEMA_NAME_LEN);
1641
1642      I_SVAL (SQL_ODBC_INTERFACE_CONFORMANCE);
1643
1644      I_SVAL (SQL_PARAM_ARRAY_ROW_COUNTS);
1645
1646      I_SVAL (SQL_PARAM_ARRAY_SELECTS);
1647
1648      I_STR (SQL_SCHEMA_TERM);
1649
1650      I_MASK (SQL_SCHEMA_USAGE);
1651
1652      I_SVAL (SQL_SQL_CONFORMANCE);
1653
1654      I_MASK (SQL_SQL92_DATETIME_FUNCTIONS);
1655
1656      I_MASK (SQL_SQL92_FOREIGN_KEY_DELETE_RULE);
1657
1658      I_MASK (SQL_SQL92_FOREIGN_KEY_UPDATE_RULE);
1659
1660      I_MASK (SQL_SQL92_GRANT);
1661
1662      I_MASK (SQL_SQL92_NUMERIC_VALUE_FUNCTIONS);
1663
1664      I_MASK (SQL_SQL92_PREDICATES);
1665
1666      I_MASK (SQL_SQL92_RELATIONAL_JOIN_OPERATORS);
1667
1668      I_MASK (SQL_SQL92_REVOKE);
1669
1670      I_MASK (SQL_SQL92_ROW_VALUE_CONSTRUCTOR);
1671
1672      I_MASK (SQL_SQL92_STRING_FUNCTIONS);
1673
1674      I_MASK (SQL_SQL92_VALUE_EXPRESSIONS);
1675
1676      I_MASK (SQL_STANDARD_CLI_CONFORMANCE);
1677
1678      I_MASK1 (SQL_STATIC_CURSOR_ATTRIBUTES1, CURSOR_ATTRIBUTES1);
1679
1680      I_MASK1 (SQL_STATIC_CURSOR_ATTRIBUTES2, CURSOR_ATTRIBUTES2);
1681
1682      I_STR (SQL_XOPEN_CLI_YEAR);
1683#endif
1684
1685    default:
1686      infoname = "unknown or driver specific";
1687      break;
1688    }
1689
1690
1691  /*
1692   *  If we arrive here, just print the generic pointer information
1693   */
1694  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1695      "SQLUSMALLINT", fInfoType, infoname);
1696  if (rgbInfoValue)
1697    trace_emit ("\t\t%-15.15s   %p\n", "SQLPOINTER", rgbInfoValue);
1698  else
1699    trace_emit ("\t\t%-15.15s   0x0\n", "SQLPOINTER");
1700  goto print_end;
1701
1702
1703print_int16:
1704  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1705      "SQLUSMALLINT", fInfoType, infoname);
1706  trace_emit ("\t\t%-15.15s   %p (%ld)\n",
1707      "SQLPOINTER", rgbInfoValue, (long) *((short *) rgbInfoValue));
1708  goto print_end;
1709
1710
1711print_int32:
1712  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1713  	"SQLUSMALLINT", fInfoType, infoname);
1714  trace_emit ("\t\t%-15.15s   %p (%ld)\n",
1715	"SQLPOINTER", rgbInfoValue, (long) *((int *) rgbInfoValue));
1716  goto print_end;
1717
1718
1719print_string:
1720  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1721  	"SQLUSMALLINT", fInfoType, infoname);
1722  trace_emit ("\t\t%-15.15s   %p\n",
1723  	"SQLPOINTER", rgbInfoValue);
1724  if (waMode == 'A')
1725    trace_emit_string ((SQLCHAR *) rgbInfoValue, pcbInfoValue ? *pcbInfoValue : SQL_NTS, 0);
1726  else
1727    {
1728      SQLCHAR *str_u8 = dm_SQL_W2A ((SQLWCHAR *) rgbInfoValue, pcbInfoValue ? *pcbInfoValue : SQL_NTS);
1729      trace_emit_string (str_u8, SQL_NTS, 1);
1730      free (str_u8);
1731    }
1732  goto print_end;
1733
1734
1735print_mask:
1736  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1737  	"SQLUSMALLINT", fInfoType, infoname);
1738  trace_emit ("\t\t%-15.15s   %p (0x%lX)\n",
1739	"SQLPOINTER", rgbInfoValue,
1740	(unsigned long) *((unsigned int *) rgbInfoValue));
1741
1742  if (*(int *) rgbInfoValue == 0)
1743    trace_emit ("\t\t\t\t  | %-40.40s |\n", mask[0]);
1744  else
1745    {
1746      register unsigned int val = *(unsigned int *) rgbInfoValue;
1747
1748      for (i = 1; i < 32; i++)
1749	{
1750	  if (val & (1 << (i - 1)))
1751	    {
1752	      if (i < elem)
1753		trace_emit ("\t\t\t\t  | %-40.40s |\n", mask[i]);
1754	      else
1755		trace_emit ("\t\t\t\t  | %-40.40s |\n", "UNKNOWN");
1756	    }
1757	}
1758    }
1759  goto print_end;
1760
1761
1762print_svalue:
1763  i = *((short *) rgbInfoValue);
1764  trace_emit ("\t\t%-15.15s   %d (%s)\n",
1765	"SQLUSMALLINT", fInfoType, infoname);
1766  trace_emit ("\t\t%-15.15s   %p (%ld)\n",
1767	"SQLPOINTER", rgbInfoValue, (long) *((SQLSMALLINT *) rgbInfoValue));
1768  trace_emit ("\t\t\t\t  | %-40.40s |\n",
1769  	(i < elem) ? mask[i] : "UNKNOWN");
1770  goto print_end;
1771
1772
1773  /*
1774   *  All done
1775   */
1776print_end:
1777  return;
1778}
1779
1780
1781void
1782trace_SQLGetInfo (int trace_leave, int retcode,
1783  SQLHDBC		  hdbc,
1784  SQLUSMALLINT		  fInfoType,
1785  SQLPOINTER		  rgbInfoValue,
1786  SQLSMALLINT		  cbInfoValueMax,
1787  SQLSMALLINT    	* pcbInfoValue)
1788{
1789  /* Trace function */
1790  _trace_print_function (en_GetInfo, trace_leave, retcode);
1791
1792  /* Trace Arguments */
1793  _trace_handle (SQL_HANDLE_DBC, hdbc);
1794  _trace_getinfo (fInfoType, rgbInfoValue, cbInfoValueMax, pcbInfoValue,
1795  	TRACE_OUTPUT_SUCCESS, 'A');
1796  _trace_smallint (cbInfoValueMax);
1797  _trace_smallint_p (pcbInfoValue, TRACE_OUTPUT_SUCCESS);
1798}
1799
1800
1801#if ODBCVER >= 0x0300
1802void
1803trace_SQLGetInfoW (int trace_leave, int retcode,
1804  SQLHDBC		  hdbc,
1805  SQLUSMALLINT		  fInfoType,
1806  SQLPOINTER		  rgbInfoValue,
1807  SQLSMALLINT		  cbInfoValueMax,
1808  SQLSMALLINT    	* pcbInfoValue)
1809{
1810  /* Trace function */
1811  _trace_print_function (en_GetInfoW, trace_leave, retcode);
1812
1813  /* Trace Arguments */
1814  _trace_handle (SQL_HANDLE_DBC, hdbc);
1815  _trace_getinfo (fInfoType, rgbInfoValue, cbInfoValueMax, pcbInfoValue,
1816  	TRACE_OUTPUT_SUCCESS, 'W');
1817  _trace_smallint (cbInfoValueMax);
1818  _trace_smallint_p (pcbInfoValue, TRACE_OUTPUT_SUCCESS);
1819}
1820#endif
1821