/*
 * Copyright 2004-2006 H2 Group. Licensed under the H2 License, Version 1.0 (http://h2database.com/html/license.html).
 */

#include "h2odbc.h"

SQLRETURN  SQL_API SQLGetInfo(SQLHDBC ConnectionHandle, 
           SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr, 
           SQLSMALLINT BufferLength, SQLSMALLINT* StringLengthPtr) {
    trace("SQLGetInfo");
    Connection* conn;
    conn=Connection::cast(ConnectionHandle);
    if(conn==0) {
        return SQL_INVALID_HANDLE;
    }
    conn->setError(0);
    const char* string=0;
    switch(InfoType) {
    case SQL_ALTER_TABLE:
        trace(" SQL_ALTER_TABLE");
        // todo
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_FETCH_DIRECTION:
        trace(" SQL_FETCH_DIRECTION");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_FD_FETCH_NEXT);
        break;
    case SQL_ODBC_API_CONFORMANCE:
        trace(" SQL_ODBC_API_CONFORMANCE");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_OAC_LEVEL1);
        break;
    case SQL_LOCK_TYPES:
        trace(" SQL_LOCK_TYPES");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_LCK_NO_CHANGE);
        break;
    case SQL_POS_OPERATIONS:
        trace(" SQL_POS_OPERATIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_POSITIONED_STATEMENTS:
        trace(" SQL_POSITIONED_STATEMENTS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_SCROLL_CONCURRENCY:
        trace(" SQL_SCROLL_CONCURRENCY");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SCCO_READ_ONLY);
        break;
    case SQL_STATIC_SENSITIVITY:
        trace(" SQL_STATIC_SENSITIVITY");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_ACCESSIBLE_PROCEDURES:
        trace(" SQL_ACCESSIBLE_PROCEDURES");
        string="Y";
        break;
    case SQL_ACCESSIBLE_TABLES:
        trace(" SQL_ACCESSIBLE_TABLES");
        string="Y";
        break;
    case SQL_ACTIVE_ENVIRONMENTS:
        trace(" SQL_ACTIVE_ENVIRONMENTS");
        returnSmall(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_AGGREGATE_FUNCTIONS:
        trace(" SQL_AGGREGATE_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_AF_ALL);
        break;
    case SQL_ALTER_DOMAIN:
        trace(" SQL_ALTER_DOMAIN");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_ASYNC_MODE:
        trace(" SQL_ASYNC_MODE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_AM_NONE);
        // todo SQL_AM_STATEMENT
        break;
    case SQL_BATCH_ROW_COUNT:
        trace(" SQL_BATCH_ROW_COUNT");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_BRC_EXPLICIT);
        break;
    case SQL_BATCH_SUPPORT:
        trace(" SQL_BATCH_SUPPORT");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        // todo
        break;
    case SQL_BOOKMARK_PERSISTENCE:
        trace(" SQL_BOOKMARK_PERSISTENCE");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        // todo
        break;
    case SQL_CATALOG_LOCATION:
        trace(" SQL_CATALOG_LOCATION");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_CL_START);
        break;
    case SQL_CATALOG_NAME:
        trace(" SQL_CATALOG_NAME");
        string="Y";
        break;
    case SQL_CATALOG_NAME_SEPARATOR:
        trace(" SQL_CATALOG_NAME_SEPARATOR");
        string=".";
        break;
    case SQL_CATALOG_TERM:
        trace(" SQL_CATALOG_TERM");
        string="catalog";
        break;
    case SQL_CATALOG_USAGE:
        trace(" SQL_CATALOG_USAGE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CU_DML_STATEMENTS | SQL_CU_PROCEDURE_INVOCATION | SQL_CU_TABLE_DEFINITION | SQL_CU_INDEX_DEFINITION | SQL_CU_PRIVILEGE_DEFINITION);
        break;
    case SQL_COLLATION_SEQ:
        trace(" SQL_COLLATION_SEQ");
        string="";
        // todo: ISO 8859-1 ?
        break;
    case SQL_CONCAT_NULL_BEHAVIOR:
        trace(" SQL_CONCAT_NULL_BEHAVIOR TODO");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_CB_NULL);
        break;
    case SQL_CONVERT_BIGINT:
    case SQL_CONVERT_BINARY:
    case SQL_CONVERT_BIT:
    case SQL_CONVERT_CHAR:
    case SQL_CONVERT_DATE:
    case SQL_CONVERT_DECIMAL:
    case SQL_CONVERT_DOUBLE:
    case SQL_CONVERT_FLOAT:
    case SQL_CONVERT_INTEGER:
    case SQL_CONVERT_INTERVAL_YEAR_MONTH:
    case SQL_CONVERT_INTERVAL_DAY_TIME:
    case SQL_CONVERT_LONGVARBINARY:
    case SQL_CONVERT_LONGVARCHAR:
    case SQL_CONVERT_NUMERIC:
    case SQL_CONVERT_REAL:
    case SQL_CONVERT_SMALLINT:
    case SQL_CONVERT_TIME:
    case SQL_CONVERT_TIMESTAMP:
    case SQL_CONVERT_TINYINT:
    case SQL_CONVERT_VARBINARY:
    case SQL_CONVERT_VARCHAR:
        trace(" SQL_CONVERT_ %d", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_CVT_BIGINT |
            SQL_CVT_BINARY |
            SQL_CVT_BIT |
            SQL_CVT_CHAR |
            SQL_CVT_DATE |
            SQL_CVT_DECIMAL |
            SQL_CVT_DOUBLE |
            SQL_CVT_FLOAT |
            SQL_CVT_INTEGER |
            SQL_CVT_INTERVAL_YEAR_MONTH |
            SQL_CVT_INTERVAL_DAY_TIME |
            SQL_CVT_LONGVARBINARY |
            SQL_CVT_LONGVARCHAR |
            SQL_CVT_NUMERIC |
            SQL_CVT_REAL |
            SQL_CVT_SMALLINT |
            SQL_CVT_TIME |
            SQL_CVT_TIMESTAMP |
            SQL_CVT_TINYINT |
            SQL_CVT_VARBINARY |
            SQL_CVT_VARCHAR);
        break;
    case SQL_CONVERT_FUNCTIONS:
        trace(" SQL_CONVERT_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_FN_CVT_CAST);
        // todo
        break;
    case SQL_CORRELATION_NAME:
        trace(" SQL_CORRELATION_NAME");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CN_ANY);
        break;
    case SQL_CREATE_ASSERTION:
    case SQL_CREATE_CHARACTER_SET:
    case SQL_CREATE_COLLATION:
    case SQL_CREATE_DOMAIN:
    case SQL_CREATE_SCHEMA:
        trace(" SQL_CREATE_ %d TODO", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_CREATE_TABLE:
        trace(" SQL_CREATE_TABLE TODO");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CT_CREATE_TABLE | SQL_CT_TABLE_CONSTRAINT);
        // todo: SQL_CT_CONSTRAINT_NAME_DEFINITION
        break;
    case SQL_CREATE_TRANSLATION:
        trace(" SQL_CREATE_TRANSLATION");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_CREATE_VIEW:
        trace(" SQL_CREATE_VIEW");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CV_CREATE_VIEW | SQL_CV_CHECK_OPTION);
        break;
    case SQL_CURSOR_COMMIT_BEHAVIOR:
        trace(" SQL_CURSOR_COMMIT_BEHAVIOR");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_CB_CLOSE);
        break;        
    case SQL_CURSOR_ROLLBACK_BEHAVIOR:
        trace(" SQL_CURSOR_ROLLBACK_BEHAVIOR");    
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_CB_CLOSE);
        break;
    case SQL_CURSOR_SENSITIVITY:
        trace(" SQL_CURSOR_SENSITIVITY");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_UNSPECIFIED);
        break;
    case SQL_DATA_SOURCE_NAME:
        trace(" SQL_DATA_SOURCE_NAME %s", conn->getDataSourceName().data());
        string=conn->getDataSourceName().data();
        break;
    case SQL_DATA_SOURCE_READ_ONLY:
        trace(" SQL_DATA_SOURCE_READ_ONLY");
        string="N";
        // todo
        break;
    case SQL_DATABASE_NAME:
        trace(" SQL_DATABASE_NAME");
        string="H2";
        // todo
        break;
    case SQL_DATETIME_LITERALS:
        trace(" SQL_DATETIME_LITERALS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_DL_SQL92_DATE | 
            SQL_DL_SQL92_TIME | 
            SQL_DL_SQL92_TIMESTAMP);
        // todo
    case SQL_DBMS_NAME:
        trace(" SQL_DBMS_NAME");
        string="h2";
        // todo
        break;
    case SQL_DBMS_VER:
        trace(" SQL_DBMS_VER");
        string="1.0";
        // todo
        break;
    case SQL_DDL_INDEX:
        trace(" SQL_DDL_INDEX");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_DI_CREATE_INDEX | SQL_DI_DROP_INDEX);
        break;
    case SQL_DEFAULT_TXN_ISOLATION:
        trace(" SQL_DEFAULT_TXN_ISOLATION");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_TXN_READ_COMMITTED);
        break;
    case SQL_DESCRIBE_PARAMETER:
        trace(" SQL_DESCRIBE_PARAMETER");
        string="N";
        break;
    case SQL_DM_VER:
    case SQL_DRIVER_HDBC:
    case SQL_DRIVER_HENV:
    case SQL_DRIVER_HDESC:
    case SQL_DRIVER_HLIB:
    case SQL_DRIVER_HSTMT:
        trace(" SQL_DRIVER_ %d", InfoType);
        // implemented by the DriverManager
        break;
    case SQL_DRIVER_NAME:
        trace(" SQL_DRIVER_NAME");
        string="h2";
        break;
    case SQL_DRIVER_ODBC_VER:
        trace(" SQL_DRIVER_ODBC_VER");
        string="03.00";
        break;
    case SQL_DRIVER_VER:
        trace(" SQL_DRIVER_VER");
        string="01.00.0000";
        break;
    case SQL_DROP_ASSERTION:
    case SQL_DROP_CHARACTER_SET:
    case SQL_DROP_COLLATION:
    case SQL_DROP_DOMAIN:
    case SQL_DROP_SCHEMA:
        trace(" SQL_DROP_ %d", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_DROP_TABLE:
        trace(" SQL_DROP_TABLE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_DT_DROP_TABLE);
        break;
    case SQL_DROP_TRANSLATION:
    case SQL_DROP_VIEW:
        trace(" SQL_DROP_ %d", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:
        trace(" SQL_DYNAMIC_CURSOR_ATTRIBUTES1");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        //SQL_CA1_NEXT | SQL_CA1_ABSOLUTE | SQL_CA1_RELATIVE;
        break;
    case SQL_DYNAMIC_CURSOR_ATTRIBUTES2:
        trace(" SQL_DYNAMIC_CURSOR_ATTRIBUTES2");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_EXPRESSIONS_IN_ORDERBY:
        trace(" SQL_EXPRESSIONS_IN_ORDERBY");
        string="Y";
        break;
    case SQL_FILE_USAGE:
        trace(" SQL_FILE_USAGE");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_FILE_NOT_SUPPORTED);
        break;
    case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:
        trace(" SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CA1_NEXT);
        break;
    case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2:
        trace(" SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CA2_READ_ONLY_CONCURRENCY);
        break;
    case SQL_GETDATA_EXTENSIONS:
        trace(" SQL_GETDATA_EXTENSIONS");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_GD_ANY_COLUMN | SQL_GD_ANY_ORDER);
        break;
    case SQL_GROUP_BY:
        trace(" SQL_GROUP_BY");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_GB_GROUP_BY_EQUALS_SELECT);
        break;
    case SQL_IDENTIFIER_CASE:
        trace(" SQL_IDENTIFIER_CASE");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_IC_UPPER);
        break;
    case SQL_IDENTIFIER_QUOTE_CHAR:
        trace(" SQL_IDENTIFIER_QUOTE_CHAR");
        string="\"";
        break;
    case SQL_INDEX_KEYWORDS:
        trace(" SQL_INDEX_KEYWORDS");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_IK_NONE);
        break;
    case SQL_INFO_SCHEMA_VIEWS:
        trace(" SQL_INFO_SCHEMA_VIEWS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_INSERT_STATEMENT:
        trace(" SQL_INSERT_STATEMENT");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_IS_INSERT_LITERALS | SQL_IS_INSERT_SEARCHED | SQL_IS_SELECT_INTO);
        break;
    case SQL_INTEGRITY:
        trace(" SQL_INTEGRITY");
        string="Y";
        break;
    case SQL_KEYSET_CURSOR_ATTRIBUTES1:
        trace(" SQL_KEYSET_CURSOR_ATTRIBUTES1");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CA1_NEXT);
        break;
    case SQL_KEYSET_CURSOR_ATTRIBUTES2:
        trace(" SQL_KEYSET_CURSOR_ATTRIBUTES2");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_CA2_READ_ONLY_CONCURRENCY);
        break;
    case SQL_KEYWORDS:
        trace(" SQL_KEYWORDS");
        string=SQL_ODBC_KEYWORDS;
        break;
    case SQL_LIKE_ESCAPE_CLAUSE:
        trace(" SQL_LIKE_ESCAPE_CLAUSE");
        string="Y";
        break;
    case SQL_MAX_ASYNC_CONCURRENT_STATEMENTS:
    case SQL_MAX_BINARY_LITERAL_LEN:
    case SQL_MAX_CHAR_LITERAL_LEN:
    case SQL_MAX_INDEX_SIZE:
    case SQL_MAX_ROW_SIZE:
    case SQL_MAX_STATEMENT_LEN:
        trace(" SQL_MAX_ %d", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_MAX_CATALOG_NAME_LEN:
    case SQL_MAX_COLUMN_NAME_LEN:
    case SQL_MAX_COLUMNS_IN_GROUP_BY:
    case SQL_MAX_COLUMNS_IN_INDEX:
    case SQL_MAX_COLUMNS_IN_ORDER_BY:
    case SQL_MAX_COLUMNS_IN_SELECT:
    case SQL_MAX_COLUMNS_IN_TABLE:
    case SQL_MAX_CONCURRENT_ACTIVITIES:
    case SQL_MAX_CURSOR_NAME_LEN:
    case SQL_MAX_DRIVER_CONNECTIONS:
    case SQL_MAX_IDENTIFIER_LEN:
    case SQL_MAX_PROCEDURE_NAME_LEN:
    case SQL_MAX_SCHEMA_NAME_LEN:
    case SQL_MAX_TABLE_NAME_LEN:
    case SQL_MAX_TABLES_IN_SELECT:
    case SQL_MAX_USER_NAME_LEN:
        trace(" SQL_MAX_ %d", InfoType);
        returnSmall(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
        trace(" SQL_MAX_ROW_SIZE_INCLUDES_LONG");
        string="Y";
        break;
    case SQL_MULT_RESULT_SETS:
        trace(" SQL_MULT_RESULT_SETS");
        string="N";
        break;
    case SQL_MULTIPLE_ACTIVE_TXN:
        trace(" SQL_MULTIPLE_ACTIVE_TXN");
        string="Y";
        break;
    case SQL_NEED_LONG_DATA_LEN:
        trace(" SQL_NEED_LONG_DATA_LEN");
        string="Y";
        break;
    case SQL_NON_NULLABLE_COLUMNS:
        trace(" SQL_NON_NULLABLE_COLUMNS");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_NNC_NON_NULL);
        break;
    case SQL_NULL_COLLATION:
        trace(" SQL_NULL_COLLATION");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_NC_LOW);
        break;
    case SQL_NUMERIC_FUNCTIONS:
        trace(" SQL_NUMERIC_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_FN_NUM_ABS |
            SQL_FN_NUM_ACOS |
            SQL_FN_NUM_ASIN |
            SQL_FN_NUM_ATAN |
            SQL_FN_NUM_ATAN2 |
            SQL_FN_NUM_CEILING |
            SQL_FN_NUM_COS |
            SQL_FN_NUM_COT |
            SQL_FN_NUM_DEGREES |
            SQL_FN_NUM_EXP |
            SQL_FN_NUM_FLOOR |
            SQL_FN_NUM_LOG |
            SQL_FN_NUM_LOG10 |
            SQL_FN_NUM_MOD |
            SQL_FN_NUM_PI |
            SQL_FN_NUM_POWER |
            SQL_FN_NUM_RADIANS |
            SQL_FN_NUM_RAND |
            SQL_FN_NUM_ROUND |
            SQL_FN_NUM_SIGN |
            SQL_FN_NUM_SIN |
            SQL_FN_NUM_SQRT |
            SQL_FN_NUM_TAN |
            SQL_FN_NUM_TRUNCATE);
        break;
    case SQL_ODBC_INTERFACE_CONFORMANCE:
        trace(" SQL_ODBC_INTERFACE_CONFORMANCE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_OIC_CORE);
        break;
    case SQL_ODBC_VER:
        trace(" SQL_ODBC_VER");
        // Driver Manager only
        break;
    case SQL_OJ_CAPABILITIES:
        trace(" SQL_OJ_CAPABILITIES");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_OJ_LEFT | SQL_OJ_RIGHT | SQL_OJ_INNER);
        break;
    case SQL_ORDER_BY_COLUMNS_IN_SELECT:
        trace(" SQL_ORDER_BY_COLUMNS_IN_SELECT");
        string="N";
        break;
    case SQL_PARAM_ARRAY_ROW_COUNTS:
    case SQL_PARAM_ARRAY_SELECTS:
        trace(" SQL_PARAM_ARRAY_ %d", InfoType);
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_PROCEDURE_TERM:
        trace(" SQL_PROCEDURE_TERM");
        string="procedure";
        break;
    case SQL_PROCEDURES:
        trace(" SQL_PROCEDURES");
        string="Y";
        break;
    case SQL_QUOTED_IDENTIFIER_CASE:
        trace(" SQL_QUOTED_IDENTIFIER_CASE");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_IC_SENSITIVE);
        break;
    case SQL_ROW_UPDATES:
        trace(" SQL_ROW_UPDATES");
        string="N";
        break;
    case SQL_SCHEMA_TERM:
        trace(" SQL_SCHEMA_TERM");
        string="schema";
        break;
    case SQL_SCHEMA_USAGE:
        trace(" SQL_SCHEMA_USAGE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SU_DML_STATEMENTS);
        break;
    case SQL_SCROLL_OPTIONS:
        trace(" SQL_SCROLL_OPTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SO_FORWARD_ONLY);
        break;
    case SQL_SEARCH_PATTERN_ESCAPE:
        trace(" SQL_SEARCH_PATTERN_ESCAPE");
        string="\\";
        break;
    case SQL_SERVER_NAME:
        trace(" SQL_SERVER_NAME TODO");
        string="h2";
        // todo
        break;
    case SQL_SPECIAL_CHARACTERS:
        trace(" SQL_SPECIAL_CHARACTERS");
        string="";
        break;
    case SQL_SQL_CONFORMANCE:
        trace(" SQL_SQL_CONFORMANCE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SC_SQL92_ENTRY);
        break;
    case SQL_SQL92_DATETIME_FUNCTIONS:
        trace(" SQL_SQL92_DATETIME_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SDF_CURRENT_DATE | SQL_SDF_CURRENT_TIME | SQL_SDF_CURRENT_TIMESTAMP);
        break;
    case SQL_SQL92_FOREIGN_KEY_DELETE_RULE:
        trace(" SQL_SQL92_FOREIGN_KEY_DELETE_RULE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SFKD_NO_ACTION);
        break;
    case SQL_SQL92_FOREIGN_KEY_UPDATE_RULE:
        trace(" SQL_SQL92_FOREIGN_KEY_UPDATE_RULE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SFKU_NO_ACTION);
        break;
    case SQL_SQL92_GRANT:
        trace(" SQL_SQL92_GRANT");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS:
        trace(" SQL_SQL92_NUMERIC_VALUE_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SNVF_BIT_LENGTH |
            SQL_SNVF_CHAR_LENGTH |
            SQL_SNVF_CHARACTER_LENGTH |
            SQL_SNVF_EXTRACT |
            SQL_SNVF_OCTET_LENGTH |
            SQL_SNVF_POSITION);
        break;
    case SQL_SQL92_PREDICATES:
        trace(" SQL_SQL92_PREDICATES");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SP_BETWEEN |
            SQL_SP_COMPARISON |
            SQL_SP_EXISTS |
            SQL_SP_IN |
            SQL_SP_ISNOTNULL |
            SQL_SP_ISNULL |
            SQL_SP_LIKE |
            SQL_SP_QUANTIFIED_COMPARISON |
            SQL_SP_UNIQUE);
        break;
    case SQL_SQL92_RELATIONAL_JOIN_OPERATORS:
        trace(" SQL_SQL92_RELATIONAL_JOIN_OPERATORS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SRJO_INNER_JOIN | 
            SQL_SRJO_LEFT_OUTER_JOIN | 
            SQL_SRJO_RIGHT_OUTER_JOIN);
        break;
    case SQL_SQL92_REVOKE:
        trace(" SQL_SQL92_REVOKE");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_SQL92_ROW_VALUE_CONSTRUCTOR:
        trace(" SQL_SQL92_ROW_VALUE_CONSTRUCTOR");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SRVC_VALUE_EXPRESSION | 
            SQL_SRVC_NULL | 
            SQL_SRVC_ROW_SUBQUERY);
        break;
    case SQL_SQL92_STRING_FUNCTIONS:
        trace(" SQL_SQL92_STRING_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SSF_CONVERT |
            SQL_SSF_LOWER |
            SQL_SSF_UPPER |
            SQL_SSF_SUBSTRING |
            SQL_SSF_TRANSLATE |
            SQL_SSF_TRIM_BOTH |
            SQL_SSF_TRIM_LEADING |
            SQL_SSF_TRIM_TRAILING);
        break;
    case SQL_SQL92_VALUE_EXPRESSIONS:
        trace(" SQL_SQL92_VALUE_EXPRESSIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_STANDARD_CLI_CONFORMANCE:
        trace(" SQL_STANDARD_CLI_CONFORMANCE");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_SCC_XOPEN_CLI_VERSION1);
        break;
    case SQL_STATIC_CURSOR_ATTRIBUTES1:
        trace(" SQL_STATIC_CURSOR_ATTRIBUTES1");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_CA1_NEXT /* | SQL_CA1_ABSOLUTE | SQL_CA1_RELATIVE */);
        break;
    case SQL_STATIC_CURSOR_ATTRIBUTES2:
        trace(" SQL_STATIC_CURSOR_ATTRIBUTES2");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_STRING_FUNCTIONS:
        trace(" SQL_STRING_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_FN_STR_ASCII |
            SQL_FN_STR_BIT_LENGTH |
            SQL_FN_STR_CHAR |
            SQL_FN_STR_CHAR_LENGTH |
            SQL_FN_STR_CHARACTER_LENGTH |
            SQL_FN_STR_CONCAT |
            SQL_FN_STR_DIFFERENCE |
            SQL_FN_STR_INSERT |
            SQL_FN_STR_LCASE |
            SQL_FN_STR_LEFT |
            SQL_FN_STR_LENGTH |
            SQL_FN_STR_LOCATE |
            SQL_FN_STR_LTRIM |
            SQL_FN_STR_OCTET_LENGTH |
            SQL_FN_STR_POSITION |
            SQL_FN_STR_REPEAT |
            SQL_FN_STR_REPLACE |
            SQL_FN_STR_RIGHT |
            SQL_FN_STR_RTRIM |
            SQL_FN_STR_SOUNDEX |
            SQL_FN_STR_SPACE |
            SQL_FN_STR_SUBSTRING |
            SQL_FN_STR_UCASE);
        break;
    case SQL_SUBQUERIES:
        trace(" SQL_SUBQUERIES");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_SQ_CORRELATED_SUBQUERIES |
            SQL_SQ_COMPARISON |
            SQL_SQ_EXISTS |
            SQL_SQ_IN |
            SQL_SQ_QUANTIFIED);
        break;
    case SQL_SYSTEM_FUNCTIONS:
        trace(" SQL_SYSTEM_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_FN_SYS_DBNAME |
            SQL_FN_SYS_IFNULL |
            SQL_FN_SYS_USERNAME);
        break;
    case SQL_TABLE_TERM:
        trace(" SQL_TABLE_TERM");
        string="table";
        break;
    case SQL_TIMEDATE_ADD_INTERVALS:
        trace(" SQL_TIMEDATE_ADD_INTERVALS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_TIMEDATE_DIFF_INTERVALS:
        trace(" SQL_TIMEDATE_DIFF_INTERVALS");
        returnInt(InfoValuePtr, StringLengthPtr, 0);
        break;
    case SQL_TIMEDATE_FUNCTIONS:
        trace(" SQL_TIMEDATE_FUNCTIONS");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_FN_TD_CURRENT_DATE |
            SQL_FN_TD_CURRENT_TIME |
            SQL_FN_TD_CURRENT_TIMESTAMP |
            SQL_FN_TD_CURDATE |
            SQL_FN_TD_CURTIME);
        break;
    case SQL_TXN_CAPABLE:
        trace(" SQL_TXN_CAPABLE");
        returnSmall(InfoValuePtr, StringLengthPtr, SQL_TC_DDL_COMMIT);
        break;
    case SQL_TXN_ISOLATION_OPTION:
        trace(" SQL_TXN_ISOLATION_OPTION");
        returnInt(InfoValuePtr, StringLengthPtr, 
            SQL_TXN_SERIALIZABLE | 
            SQL_TXN_REPEATABLE_READ | 
            SQL_TXN_READ_COMMITTED);
        break;
    case SQL_UNION:
        trace(" SQL_UNION");
        returnInt(InfoValuePtr, StringLengthPtr, SQL_U_UNION | SQL_U_UNION_ALL);
        break;
    case SQL_USER_NAME:
        trace(" SQL_USER_NAME TODO");
        string="sa";
        // todo
        break;
    case SQL_XOPEN_CLI_YEAR:
        trace(" SQL_XOPEN_CLI_YEAR");
        string="2002";
        break;
    default:
        trace(" ? %d TODO", InfoType);
        conn->setError(E_HY096);
        return SQL_ERROR;
/*        
SQL_ACCESSIBLE_PROCEDURES
SQL_ACCESSIBLE_TABLES
SQL_ACTIVE_ENVIRONMENTS
SQL_AGGREGATE_FUNCTIONS
SQL_ALTER_DOMAIN
SQL_ALTER_TABLE
SQL_ASYNC_MODE
SQL_BATCH_ROW_COUNT
SQL_BATCH_SUPPORT
SQL_BOOKMARK_PERSISTENCE
SQL_CATALOG_LOCATION
SQL_CATALOG_NAME
SQL_CATALOG_NAME_SEPARATOR
SQL_CATALOG_TERM
SQL_CATALOG_USAGE
SQL_COLLATION_SEQ
SQL_COLUMN_ALIAS
SQL_CONCAT_NULL_BEHAVIOR
SQL_CONVERT_BIGINT
SQL_CONVERT_BINARY
SQL_CONVERT_BIT
SQL_CONVERT_CHAR
SQL_CONVERT_DATE
SQL_CONVERT_DECIMAL
SQL_CONVERT_DOUBLE
SQL_CONVERT_FLOAT
SQL_CONVERT_FUNCTIONS
SQL_CONVERT_GUID
SQL_CONVERT_INTEGER
SQL_CONVERT_INTERVAL_DAY_TIME
SQL_CONVERT_INTERVAL_YEAR_MONTH
SQL_CONVERT_LONGVARBINARY
SQL_CONVERT_LONGVARCHAR
SQL_CONVERT_NUMERIC
SQL_CONVERT_REAL
SQL_CONVERT_SMALLINT
SQL_CONVERT_TIME
SQL_CONVERT_TIMESTAMP
SQL_CONVERT_TINYINT
SQL_CONVERT_VARBINARY
SQL_CONVERT_VARCHAR
SQL_CORRELATION_NAME
SQL_CREATE_ASSERTION
SQL_CREATE_CHARACTER_SET
SQL_CREATE_COLLATION
SQL_CREATE_DOMAIN
SQL_CREATE_SCHEMA
SQL_CREATE_TABLE
SQL_CREATE_TRANSLATION
SQL_CREATE_VIEW
SQL_CURSOR_COMMIT_BEHAVIOR
SQL_CURSOR_ROLLBACK_BEHAVIOR
SQL_CURSOR_ROLLBACK_SQL_CURSOR_SENSITIVITY
SQL_DATA_SOURCE_NAME
SQL_DATA_SOURCE_READ_ONLY
SQL_DATABASE_NAME
SQL_DATETIME_LITERALS
SQL_DBMS_NAME
SQL_DBMS_VER
SQL_DDL_INDEX
SQL_DEFAULT_TXN_ISOLATION
SQL_DESCRIBE_PARAMETER
SQL_DM_VER
SQL_DRIVER_HDBC
SQL_DRIVER_HDESC
SQL_DRIVER_HENV
SQL_DRIVER_HLIB
SQL_DRIVER_HSTMT
SQL_DRIVER_NAME
SQL_DRIVER_ODBC_VER
SQL_DRIVER_VER
SQL_DROP_ASSERTION
SQL_DROP_CHARACTER_SET
SQL_DROP_COLLATION
SQL_DROP_DOMAIN
SQL_DROP_SCHEMA
SQL_DROP_TABLE
SQL_DROP_TRANSLATION
SQL_DROP_VIEW
SQL_DYNAMIC_CURSOR_ATTRIBUTES1
SQL_DYNAMIC_CURSOR_ATTRIBUTES2
SQL_EXPRESSIONS_IN_ORDERBY
SQL_FILE_USAGE
SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1
SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2
SQL_GETDATA_EXTENSIONS
SQL_GROUP_BY
SQL_IDENTIFIER_CASE
SQL_IDENTIFIER_QUOTE_CHAR
SQL_INDEX_KEYWORDS
SQL_INFO_SCHEMA_VIEWS
SQL_INSERT_STATEMENT
SQL_INTEGRITY
SQL_KEYSET_CURSOR_ATTRIBUTES1
SQL_KEYSET_CURSOR_ATTRIBUTES2
SQL_KEYWORDS
SQL_LIKE_ESCAPE_CLAUSE
SQL_MAX_ASYNC_CONCURRENT_STATEMENTS
SQL_MAX_BINARY_LITERAL_LEN
SQL_MAX_CATALOG_NAME_LEN
SQL_MAX_CHAR_LITERAL_LEN
SQL_MAX_COLUMN_NAME_LEN
SQL_MAX_COLUMNS_IN_GROUP_BY
SQL_MAX_COLUMNS_IN_INDEX
SQL_MAX_COLUMNS_IN_ORDER_BY
SQL_MAX_COLUMNS_IN_SELECT
SQL_MAX_COLUMNS_IN_TABLE
SQL_MAX_CONCURRENT_ACTIVITIES
SQL_MAX_CURSOR_NAME_LEN
SQL_MAX_DRIVER_CONNECTIONS
SQL_MAX_IDENTIFIER_LEN
SQL_MAX_INDEX_SIZE
SQL_MAX_PROCEDURE_NAME_LEN
SQL_MAX_ROW_SIZE
SQL_MAX_ROW_SIZE_INCLUDES_LONG
SQL_MAX_SCHEMA_NAME_LEN
SQL_MAX_STATEMENT_LEN
SQL_MAX_TABLE_NAME_LEN
SQL_MAX_TABLES_IN_SELECT
SQL_MAX_USER_NAME_LEN
SQL_MULT_RESULT_SETS
SQL_MULTIPLE_ACTIVE_TXN
SQL_NEED_LONG_DATA_LEN
SQL_NON_NULLABLE_COLUMNS
SQL_NULL_COLLATION
SQL_NUMERIC_FUNCTIONS
SQL_ODBC_INTERFACE_CONFORMANCE
SQL_ODBC_VER
SQL_OJ_CAPABILITIES
SQL_ORDER_BY_COLUMNS_IN_SELECT
SQL_PARAM_ARRAY_ROW_COUNTS
SQL_PARAM_ARRAY_SELECTS
SQL_POS_OPERATIONS
SQL_PROCEDURE_TERM
SQL_PROCEDURES
SQL_QUOTED_IDENTIFIER_CASE
SQL_ROW_UPDATES
SQL_SCHEMA_TERM
SQL_SCHEMA_USAGE
SQL_SCROLL_OPTIONS
SQL_SEARCH_PATTERN_ESCAPE
SQL_SERVER_NAME
SQL_SPECIAL_CHARACTERS
SQL_SQL_CONFORMANCE
SQL_SQL92_DATETIME_FUNCTIONS
SQL_SQL92_FOREIGN_KEY_DELETE_RULE
SQL_SQL92_FOREIGN_KEY_UPDATE_RULE
SQL_SQL92_GRANT
SQL_SQL92_NUMERIC_InfoValuePtr_FUNCTIONS
SQL_SQL92_PREDICATES
SQL_SQL92_RELATIONAL_JOIN_OPERATORS
SQL_SQL92_REVOKE
SQL_SQL92_ROW_InfoValuePtr_CONSTRUCTOR
SQL_SQL92_STRING_FUNCTIONS
SQL_SQL92_InfoValuePtr_EXPRESSIONS
SQL_STANDARD_CLI_CONFORMANCE
SQL_STATIC_CURSOR_ATTRIBUTES1
SQL_STATIC_CURSOR_ATTRIBUTES2
SQL_STRING_FUNCTIONS
SQL_SUBQUERIES
SQL_SYSTEM_FUNCTIONS
SQL_TABLE_TERM
SQL_TIMEDATE_ADD_INTERVALS
SQL_TIMEDATE_DIFF_INTERVALS
SQL_TIMEDATE_FUNCTIONS
SQL_TXN_CAPABLE
SQL_TXN_ISOLATION_OPTION
SQL_UNION
SQL_USER_NAME
SQL_XOPEN_CLI_YEAR
    
        
*/        
    }
    if(string!=0) {
        trace("   =%s", string);
        returnString((SQLCHAR*)InfoValuePtr, BufferLength, StringLengthPtr, string);
    }
    return SQL_SUCCESS;
}