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