You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by ma...@apache.org on 2015/07/15 11:42:41 UTC

[08/14] incubator-kylin git commit: add odbc driver to maven repository

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_INFO.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_INFO.CPP b/odbc/Driver/KO_INFO.CPP
new file mode 100644
index 0000000..cc8356d
--- /dev/null
+++ b/odbc/Driver/KO_INFO.CPP
@@ -0,0 +1,1152 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_INFO.CPP
+//
+// Purpose: This file is dedicated to the single function SQLGetInfo.
+//          Almost all information about your driver, server
+//          and current state required by the client is obtained
+//          using this function. Most of the values need to be
+//          changed to values as per your server. I believe
+//          that you will not require to query your server for
+//          most information, but u can do that if u like your
+//          driver to be more flexible.
+//
+//          Some info like current database ofcourse needs to be
+//          queried live from the server. Clients like MS Word,
+//          SQL server use a whole bunch of info from this function.
+//          You have to go thru each attribute and provide
+//          the info.
+//
+//          Another function SQLGetTypeInfo is implemented in this
+//          file. This function is a catalog function used to obtain
+//          the data types supported by the server and the associated
+//          details required by the client to interpret them correctly.
+//          This function does an Rest call to the server to obtain the
+//          details at the very beginning of SQLConnect
+//
+//
+// Exported functions:
+//                       SQLGetInfo
+//                       SQLGetTypeInfo
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+// -----------------------------------------------------------------------
+// to get driver related information
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetInfoW ( SQLHDBC                    pConn,
+                              SQLUSMALLINT                pInfoType,
+                              SQLPOINTER                  pInfoValuePtr,
+                              SQLSMALLINT                 pBufferLength,
+                              SQLSMALLINT*                pStringLengthPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetInfoW called: Field: %d, Length: %d", pInfoType, pBufferLength ) );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    // check the info required
+    // check this page for detailed http://msdn.microsoft.com/en-us/library/ms711681(v=vs.85).aspx
+    switch ( pInfoType ) {
+        case SQL_COLUMN_ALIAS://87 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_CONVERT_FUNCTIONS ://48 called
+            break;
+            
+        case SQL_MAX_IDENTIFIER_LEN : //10005 called
+            break;
+            
+        case SQL_ODBC_INTERFACE_CONFORMANCE://152 called
+            break;
+            
+        case SQL_SQL_CONFORMANCE: //118 called
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the SQL-92 datetime literals supported by the data source. Note that these are the datetime literals listed in the SQL-92 specification and are separate from the datetime literal escape clauses defined by ODBC. For more information about the ODBC datetime literal escape clauses, see Date, Time, and Timestamp Literals.
+            A FIPS Transitional level�Cconformant driver will always return the "1" value in the bitmask for the bits in the following list. A value of "0" means that SQL-92 datetime literals are not supported.
+            The following bitmasks are used to determine which literals are supported:
+            SQL_DL_SQL92_DATESQL_DL_SQL92_TIMESQL_DL_SQL92_TIMESTAMPSQL_DL_SQL92_INTERVAL_YEARSQL_DL_SQL92_INTERVAL_MONTHSQL_DL_SQL92_INTERVAL_DAYSQL_DL_SQL92_INTERVAL_HOURSQL_DL_SQL92_INTERVAL_MINUTESQL_DL_SQL92_INTERVAL_SECONDSQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHSQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
+            SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTESQL_DL_SQL92_INTERVAL_DAY_TO_SECONDSQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTESQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDSQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND
+        */
+        case SQL_DATETIME_LITERALS: //119 called
+            //assuming all datetime literals are supported
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_DL_SQL92_DATE                       |
+                SQL_DL_SQL92_TIME                       |
+                SQL_DL_SQL92_TIMESTAMP                  |
+                SQL_DL_SQL92_INTERVAL_YEAR              |
+                SQL_DL_SQL92_INTERVAL_MONTH             |
+                SQL_DL_SQL92_INTERVAL_DAY               |
+                SQL_DL_SQL92_INTERVAL_HOUR              |
+                SQL_DL_SQL92_INTERVAL_MINUTE            |
+                SQL_DL_SQL92_INTERVAL_SECOND            |
+                SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR       |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND     |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE    |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND    |
+                SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND  ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPADD scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.SQL_DATETIME_LITERALS(ODBC 3.0)
+        */
+        case SQL_TIMEDATE_ADD_INTERVALS : // 109 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPDIFF scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.
+        */
+        case SQL_TIMEDATE_DIFF_INTERVALS : //110 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        case SQL_AGGREGATE_FUNCTIONS: //169 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_AF_ALL | SQL_AF_AVG | SQL_AF_COUNT | SQL_AF_DISTINCT | SQL_AF_MAX | SQL_AF_MIN |
+                                            SQL_AF_SUM ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the datetime scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+            The following bitmasks are used to determine which datetime functions are supported:
+            SQL_SDF_CURRENT_DATESQL_SDF_CURRENT_TIMESQL_SDF_CURRENT_TIMESTAMP
+        */
+        case SQL_SQL92_DATETIME_FUNCTIONS: //155 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_SDF_CURRENT_DATE                |
+                SQL_SDF_CURRENT_TIME                |
+                SQL_SDF_CURRENT_TIMESTAMP           ;
+            break;
+            
+        case SQL_SQL92_VALUE_EXPRESSIONS: //165 called
+            break;
+            
+        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS: //159 called
+            break;
+            
+        case SQL_SQL92_STRING_FUNCTIONS: //164 called
+            break;
+            
+        case SQL_SQL92_PREDICATES                    : //160 called
+            break;
+            
+        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS   : //161 called
+            break;
+            
+        case SQL_DRIVER_ODBC_VER:                           // 77 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "03.00", -1 );
+            //*pStringLengthPtr = *pStringLengthPtr *2;
+            break;
+            
+        case SQL_CURSOR_COMMIT_BEHAVIOR:  //23 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_COMMIT_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_CORRELATION_NAME:  //74
+            //MessageBox ( GetDesktopWindow(), "SQL_CORRELATION_NAME", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CN_ANY;
+            break;
+            
+        case SQL_MAX_CONCURRENT_ACTIVITIES:                     // 1
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_MAX_CONCURRENT_ACTIVITIES", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = 2; }
+            
+            break;
+            
+        case SQL_ODBC_API_CONFORMANCE:                          // 9
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_ODBC_API_CONFORMANCE", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = SQL_OAC_NONE; }    // for MS Access
+            
+            break;
+            
+        case SQL_DATA_SOURCE_READ_ONLY:                         // 25
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_READ_ONLY", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_DRIVER_NAME:                                   // 6 //called by tb
+            //MessageBox ( GetDesktopWindow(), "SQL_DRIVER_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "driver.DLL", -1 );
+            break;
+            
+        case SQL_SEARCH_PATTERN_ESCAPE:                         // 14
+            //MessageBox ( GetDesktopWindow(), "SQL_SEARCH_PATTERN_ESCAPE", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\\", -1 );
+            break;
+            
+        case SQL_NON_NULLABLE_COLUMNS:                          // 75
+            //MessageBox ( GetDesktopWindow(), "SQL_NON_NULLABLE_COLUMNS", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_NNC_NULL;
+            break;
+            
+        case SQL_QUALIFIER_NAME_SEPARATOR:                      // 41 called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_NAME_SEPARATOR", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, ".", -1 );
+            break;
+            
+        case SQL_FILE_USAGE:                                    // 84
+            //MessageBox ( GetDesktopWindow(), "SQL_FILE_USAGE", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_FILE_NOT_SUPPORTED;
+            break;
+            
+        case SQL_QUALIFIER_TERM:                                // 42  // SQL_CATALOG_TERM: called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_TERM", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "database", -1 );
+            break;
+            
+        case SQL_OWNER_TERM:                                    // 39 //called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "owner", -1 );
+            break;
+            
+        case SQL_TABLE_TERM:                                    // 45 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "table", -1 );
+            break;
+            
+        case SQL_CURSOR_ROLLBACK_BEHAVIOR:                      // 24 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_ROLLBACK_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_DATA_SOURCE_NAME:                              // 2
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "GODBC", -1 );
+            break;
+            
+        case 16:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_PROCEDURES:                                    // 21
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_IDENTIFIER_QUOTE_CHAR:                         // 29  //called by tb
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\"", -1 );
+            break;
+            
+        case SQL_MAX_SCHEMA_NAME_LEN:
+            * ( ( short* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_USER_NAME:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_POS_OPERATIONS:                                // 79
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_POS_POSITION;
+            break;
+            
+        case SQL_STATIC_SENSITIVITY:                            // 83
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SS_ADDITIONS;
+            break;
+            
+        case SQL_LOCK_TYPES:                                    // 78
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_LCK_NO_CHANGE;
+            break;
+            
+        case SQL_GETDATA_EXTENSIONS:                            // 81 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_GD_ANY_COLUMN;
+            break;
+            
+        case SQL_TXN_ISOLATION_OPTION:                          // 72
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_SERIALIZABLE;
+            break;
+            
+        case SQL_BOOKMARK_PERSISTENCE:                          // 82
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            break;
+            
+        case SQL_SCROLL_OPTIONS:                                // 44
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SO_FORWARD_ONLY;
+            break;
+            
+        case SQL_SCROLL_CONCURRENCY:                            // 43
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SCCO_READ_ONLY;
+            break;
+            
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:                    // 144
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES1:                     // 150
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES1:                     // 167
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:               // 146
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES2:                     // 151
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES2:                     // 168
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_NEED_LONG_DATA_LEN:                            // 111
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_TXN_CAPABLE:                                   // 46 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_TC_NONE;
+            break;
+            
+        case SQL_DEFAULT_TXN_ISOLATION:                         // 26
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_READ_COMMITTED;
+            break;
+            
+        case SQL_DBMS_NAME:                                     // 17 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Gen ODBC Server", -1 );
+            break;
+            
+        case SQL_ODBC_SQL_CONFORMANCE:                          // 15
+            // deprecated
+            * ( ( Word* ) pInfoValuePtr ) = SQL_OSC_MINIMUM;
+            break;
+            
+        case SQL_INTEGRITY:                                     // 73
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_QUALIFIER_USAGE:                               // 92 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CU_DML_STATEMENTS | SQL_CU_PROCEDURE_INVOCATION | SQL_CU_TABLE_DEFINITION;
+            break;
+            
+        case SQL_DBMS_VER:                                      // 18 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            break;
+            
+        case SQL_QUOTED_IDENTIFIER_CASE:                        // 93 called
+            //*(( Word* )pInfoValuePtr) = SQL_IC_SENSITIVE;
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_UPPER;
+            break;
+            
+        case SQL_MAX_CATALOG_NAME_LEN:                          // 34
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_MAX_TABLE_NAME_LEN:                            // 35
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_ACTIVE_CONNECTIONS:                            // 0
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACTIVE_CONNECTIONS" ));
+            break;
+            
+        case SQL_CATALOG_LOCATION:                              // 114
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CL_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CATALOG_LOCATION" ));
+            break;
+            
+        case SQL_CONCAT_NULL_BEHAVIOR:                           // 22
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CB_NULL;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CONCAT_NULL_BEHAVIOR" ));
+            break;
+            
+        case SQL_GROUP_BY:                                      // 88
+            * ( ( Word* ) pInfoValuePtr ) = SQL_GB_GROUP_BY_EQUALS_SELECT;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_GROUP_BY" ));
+            break;
+            
+        case SQL_IDENTIFIER_CASE:                               // 28
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_MIXED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_IDENTIFIER_CASE" ));
+            break;
+            
+        case SQL_MAX_INDEX_SIZE:                                // 102
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_INDEX_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE:                                  // 104
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:                    // 103
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE_INCLUDES_LONG" ));
+            break;
+            
+        case SQL_MAX_TABLES_IN_SELECT:                          // 106
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_TABLES_IN_SELECT" ));
+            break;
+            
+        case SQL_NULL_COLLATION:                                // 85
+            * ( ( Word* ) pInfoValuePtr ) = SQL_NC_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NULL_COLLATION" ));
+            break;
+            
+        case SQL_ORDER_BY_COLUMNS_IN_SELECT:                    // 90
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ORDER_BY_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_PROCEDURE_TERM:                                // 40
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "procedure", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_PROCEDURE_TERM" ));
+            break;
+            
+        case SQL_OWNER_USAGE:                                   // 91 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_SU_DML_STATEMENTS | SQL_SU_TABLE_DEFINITION | SQL_SU_PRIVILEGE_DEFINITION;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OWNER_USAGE" ));
+            break;
+            
+        case SQL_SUBQUERIES:                                    // 95
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SQ_CORRELATED_SUBQUERIES |
+                                            SQL_SQ_COMPARISON |
+                                            SQL_SQ_EXISTS |
+                                            SQL_SQ_IN |
+                                            SQL_SQ_QUANTIFIED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SUBQUERIES" ));
+            break;
+            
+        case SQL_MULT_RESULT_SETS:                              // 36:
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MULT_RESULT_SETS" ));
+            break;
+            
+        case SQL_SERVER_NAME:                                   // 13
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16,
+                                ( ( pODBCConn ) pConn )->Server ? ( ( pODBCConn ) pConn )->Server : "", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SERVER_NAME" ));
+            break;
+            
+        case SQL_ACCESSIBLE_PROCEDURES:                         // 20
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_PROCEDURES" ));
+            break;
+            
+        case SQL_ACCESSIBLE_TABLES:                             // 19
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_TABLES" ));
+            break;
+            
+        case SQL_OJ_CAPABILITIES:                               // 115 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_OJ_LEFT |
+                                            SQL_OJ_RIGHT |
+                                            SQL_OJ_FULL |
+                                            SQL_OJ_NESTED |
+                                            SQL_OJ_NOT_ORDERED |
+                                            SQL_OJ_INNER |
+                                            SQL_OJ_ALL_COMPARISON_OPS;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OJ_CAPABILITIES" ));
+            break;
+            
+        case SQL_DRIVER_VER:                                    // 7 called
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_DRIVER_VER" ));
+            break;
+            
+        case SQL_LIKE_ESCAPE_CLAUSE:                            // 113
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_LIKE_ESCAPE_CLAUSE" ));
+            break;
+            
+        case SQL_SPECIAL_CHARACTERS:                            // 94 //called by tb
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "$_", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SPECIAL_CHARACTERS" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_GROUP_BY:                       // 97
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_GROUP_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_INDEX:                          // 98
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_INDEX" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_ORDER_BY:                       // 99
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_ORDER_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_SELECT:                         // 100
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_TABLE:                          // 101
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_TABLE" ));
+            break;
+            
+        case SQL_NUMERIC_FUNCTIONS:                             // 49 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard numeric functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NUMERIC_FUNCTIONS" ));
+            break;
+            
+        case SQL_OUTER_JOINS:                                   // 38
+            _SQLCopyWCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            // __ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OUTER_JOINS" ));
+            break;
+            
+        case SQL_STRING_FUNCTIONS:                              // 50 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard string functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_STRING_FUNCTIONS" ));
+            break;
+            
+        case SQL_SYSTEM_FUNCTIONS:                              // 51 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SYSTEM_FUNCTIONS" ));
+            break;
+            
+        /*
+            Note: The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.
+            An SQLUINTEGER bitmask enumerating the scalar date and time functions supported by the driver and associated data source.
+            The following bitmasks are used to determine which date and time functions are supported:
+            SQL_FN_TD_CURRENT_DATE ODBC 3.0)SQL_FN_TD_CURRENT_TIME (ODBC 3.0)SQL_FN_TD_CURRENT_TIMESTAMP (ODBC 3.0)SQL_FN_TD_CURDATE (ODBC 1.0)SQL_FN_TD_CURTIME (ODBC 1.0) SQL_FN_TD_DAYNAME (ODBC 2.0)SQL_FN_TD_DAYOFMONTH (ODBC 1.0)SQL_FN_TD_DAYOFWEEK (ODBC 1.0)SQL_FN_TD_DAYOFYEAR (ODBC 1.0) SQL_FN_TD_EXTRACT (ODBC 3.0)SQL_FN_TD_HOUR (ODBC 1.0)SQL_FN_TD_MINUTE (ODBC 1.0)SQL_FN_TD_MONTH (ODBC 1.0)SQL_FN_TD_MONTHNAME (ODBC 2.0)SQL_FN_TD_NOW (ODBC 1.0)SQL_FN_TD_QUARTER (ODBC 1.0)SQL_FN_TD_SECOND (ODBC 1.0)SQL_FN_TD_TIMESTAMPADD (ODBC 2.0)SQL_FN_TD_TIMESTAMPDIFF (ODBC 2.0)SQL_FN_TD_WEEK (ODBC 1.0)SQL_FN_TD_YEAR (ODBC 1.0)
+        */
+        case SQL_TIMEDATE_FUNCTIONS:                            // 52 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                //SQL_FN_TD_CURRENT_DATE |
+                //SQL_FN_TD_CURRENT_TIME |
+                SQL_FN_TD_CURRENT_TIMESTAMP |
+                SQL_FN_TD_CURDATE |
+                SQL_FN_TD_CURTIME |
+                //SQL_FN_TD_DAYNAME |
+                //SQL_FN_TD_DAYOFMONTH |
+                //SQL_FN_TD_DAYOFWEEK |
+                //SQL_FN_TD_DAYOFYEAR |
+                SQL_FN_TD_EXTRACT
+                //SQL_FN_TD_HOUR |
+                //SQL_FN_TD_MINUTE |
+                //SQL_FN_TD_MONTH |
+                //SQL_FN_TD_MONTHNAME |
+                //SQL_FN_TD_NOW |
+                //SQL_FN_TD_QUARTER |
+                //SQL_FN_TD_SECOND |
+                //SQL_FN_TD_TIMESTAMPADD |
+                //SQL_FN_TD_TIMESTAMPDIFF |
+                //SQL_FN_TD_WEEK |
+                //SQL_FN_TD_YEAR
+                ;
+            break;
+            
+        default:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR,
+                                      "Function Missing!!! SQLGetInfoW, Field: %d, DataPtr: %d, BufLen: %d, SizePtr: %d\n",  pInfoType, pInfoValuePtr,
+                                      pBufferLength, pStringLengthPtr ) );
+    }
+    
+    if ( pStringLengthPtr ) {
+        *pStringLengthPtr = ( *pStringLengthPtr ) * 2;
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+RETCODE SQL_API SQLGetInfo ( SQLHDBC         pConn,
+                             SQLUSMALLINT    pInfoType,
+                             SQLPOINTER      pInfoValuePtr,
+                             SQLSMALLINT     pBufferLength,
+                             SQLSMALLINT*    pStringLengthPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetInfo called: Field: %d, Length: %d", pInfoType, pBufferLength ) );
+    _SQLFreeDiag ( _DIAGCONN ( pConn ) );
+    
+    // check the info required
+    switch ( pInfoType ) {
+        case SQL_COLUMN_ALIAS://87 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_CONVERT_FUNCTIONS ://48 called
+            break;
+            
+        case SQL_MAX_IDENTIFIER_LEN : //10005 called
+            break;
+            
+        case SQL_ODBC_INTERFACE_CONFORMANCE://152 called
+            break;
+            
+        case SQL_SQL_CONFORMANCE: //118 called
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the SQL-92 datetime literals supported by the data source. Note that these are the datetime literals listed in the SQL-92 specification and are separate from the datetime literal escape clauses defined by ODBC. For more information about the ODBC datetime literal escape clauses, see Date, Time, and Timestamp Literals.
+            A FIPS Transitional level�Cconformant driver will always return the "1" value in the bitmask for the bits in the following list. A value of "0" means that SQL-92 datetime literals are not supported.
+            The following bitmasks are used to determine which literals are supported:
+            SQL_DL_SQL92_DATESQL_DL_SQL92_TIMESQL_DL_SQL92_TIMESTAMPSQL_DL_SQL92_INTERVAL_YEARSQL_DL_SQL92_INTERVAL_MONTHSQL_DL_SQL92_INTERVAL_DAYSQL_DL_SQL92_INTERVAL_HOURSQL_DL_SQL92_INTERVAL_MINUTESQL_DL_SQL92_INTERVAL_SECONDSQL_DL_SQL92_INTERVAL_YEAR_TO_MONTHSQL_DL_SQL92_INTERVAL_DAY_TO_HOUR
+            SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTESQL_DL_SQL92_INTERVAL_DAY_TO_SECONDSQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTESQL_DL_SQL92_INTERVAL_HOUR_TO_SECONDSQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND
+        */
+        case SQL_DATETIME_LITERALS: //119 called
+            //assuming all datetime literals are supported
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_DL_SQL92_DATE                       |
+                SQL_DL_SQL92_TIME                       |
+                SQL_DL_SQL92_TIMESTAMP                  |
+                SQL_DL_SQL92_INTERVAL_YEAR              |
+                SQL_DL_SQL92_INTERVAL_MONTH             |
+                SQL_DL_SQL92_INTERVAL_DAY               |
+                SQL_DL_SQL92_INTERVAL_HOUR              |
+                SQL_DL_SQL92_INTERVAL_MINUTE            |
+                SQL_DL_SQL92_INTERVAL_SECOND            |
+                SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR       |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE     |
+                SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND     |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE    |
+                SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND    |
+                SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND  ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPADD scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.SQL_DATETIME_LITERALS(ODBC 3.0)
+        */
+        case SQL_TIMEDATE_ADD_INTERVALS : // 109 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPDIFF scalar function.
+            The following bitmasks are used to determine which intervals are supported:
+            SQL_FN_TSI_FRAC_SECONDSQL_FN_TSI_SECONDSQL_FN_TSI_MINUTESQL_FN_TSI_HOURSQL_FN_TSI_DAYSQL_FN_TSI_WEEKSQL_FN_TSI_MONTHSQL_FN_TSI_QUARTERSQL_FN_TSI_YEAR
+            An FIPS Transitional level�Cconformant driver will always return a bitmask in which all of these bits are set.
+        */
+        case SQL_TIMEDATE_DIFF_INTERVALS : //110 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TSI_FRAC_SECOND              |
+                SQL_FN_TSI_SECOND                   |
+                SQL_FN_TSI_MINUTE                   |
+                SQL_FN_TSI_HOUR                     |
+                SQL_FN_TSI_DAY                      |
+                SQL_FN_TSI_WEEK                     |
+                SQL_FN_TSI_MONTH                    |
+                SQL_FN_TSI_QUARTER                  |
+                SQL_FN_TSI_YEAR                     ;
+            break;
+            
+        case SQL_AGGREGATE_FUNCTIONS: //169 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_AF_ALL | SQL_AF_AVG | SQL_AF_COUNT | SQL_AF_DISTINCT | SQL_AF_MAX | SQL_AF_MIN |
+                                            SQL_AF_SUM ;
+            break;
+            
+        /*
+            An SQLUINTEGER bitmask enumerating the datetime scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+            The following bitmasks are used to determine which datetime functions are supported:
+            SQL_SDF_CURRENT_DATESQL_SDF_CURRENT_TIMESQL_SDF_CURRENT_TIMESTAMP
+        */
+        case SQL_SQL92_DATETIME_FUNCTIONS: //155 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_SDF_CURRENT_DATE                |
+                SQL_SDF_CURRENT_TIME                |
+                SQL_SDF_CURRENT_TIMESTAMP           ;
+            break;
+            
+        case SQL_SQL92_VALUE_EXPRESSIONS: //165 called
+            break;
+            
+        case SQL_SQL92_NUMERIC_VALUE_FUNCTIONS: //159 called
+            break;
+            
+        case SQL_SQL92_STRING_FUNCTIONS: //164 called
+            break;
+            
+        case SQL_SQL92_PREDICATES                    : //160 called
+            break;
+            
+        case SQL_SQL92_RELATIONAL_JOIN_OPERATORS   : //161 called
+            break;
+            
+        case SQL_DRIVER_ODBC_VER:                           // 77 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "03.00", -1 );
+            break;
+            
+        case SQL_CURSOR_COMMIT_BEHAVIOR:  //23 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_COMMIT_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_CORRELATION_NAME:  //74
+            //MessageBox ( GetDesktopWindow(), "SQL_CORRELATION_NAME", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CN_ANY;
+            break;
+            
+        case SQL_MAX_CONCURRENT_ACTIVITIES:                     // 1
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_MAX_CONCURRENT_ACTIVITIES", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = 2; }
+            
+            break;
+            
+        case SQL_ODBC_API_CONFORMANCE:                          // 9
+        
+            //MessageBox ( GetDesktopWindow(), "SQL_ODBC_API_CONFORMANCE", "SQLGetInfo", MB_OK );
+            if ( pInfoValuePtr ) { * ( ( Word* ) pInfoValuePtr ) = SQL_OAC_NONE; }    // for MS Access
+            
+            break;
+            
+        case SQL_DATA_SOURCE_READ_ONLY:                         // 25
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_READ_ONLY", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_DRIVER_NAME:                                   // 6 //called by tb
+            //MessageBox ( GetDesktopWindow(), "SQL_DRIVER_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "driver.DLL", -1 );
+            break;
+            
+        case SQL_SEARCH_PATTERN_ESCAPE:                         // 14
+            //MessageBox ( GetDesktopWindow(), "SQL_SEARCH_PATTERN_ESCAPE", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\\", -1 );
+            break;
+            
+        case SQL_NON_NULLABLE_COLUMNS:                          // 75
+            //MessageBox ( GetDesktopWindow(), "SQL_NON_NULLABLE_COLUMNS", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_NNC_NULL;
+            break;
+            
+        case SQL_QUALIFIER_NAME_SEPARATOR:                      // 41 called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_NAME_SEPARATOR", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, ".", -1 );
+            break;
+            
+        case SQL_FILE_USAGE:                                    // 84
+            //MessageBox ( GetDesktopWindow(), "SQL_FILE_USAGE", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_FILE_NOT_SUPPORTED;
+            break;
+            
+        case SQL_QUALIFIER_TERM:                                // 42  // SQL_CATALOG_TERM: called
+            //MessageBox ( GetDesktopWindow(), "SQL_QUALIFIER_TERM", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "database", -1 );
+            break;
+            
+        case SQL_OWNER_TERM:                                    // 39 //called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "owner", -1 );
+            break;
+            
+        case SQL_TABLE_TERM:                                    // 45 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "table", -1 );
+            break;
+            
+        case SQL_CURSOR_ROLLBACK_BEHAVIOR:                      // 24 called
+            //MessageBox ( GetDesktopWindow(), "SQL_CURSOR_ROLLBACK_BEHAVIOR", "SQLGetInfo", MB_OK );
+            * ( ( short* ) pInfoValuePtr ) = SQL_CB_CLOSE;
+            break;
+            
+        case SQL_DATA_SOURCE_NAME:                              // 2
+            //MessageBox ( GetDesktopWindow(), "SQL_DATA_SOURCE_NAME", "SQLGetInfo", MB_OK );
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "GODBC", -1 );
+            break;
+            
+        case 16:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_PROCEDURES:                                    // 21
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_IDENTIFIER_QUOTE_CHAR:                         // 29  //called by tb
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "\"", -1 );
+            break;
+            
+        case SQL_MAX_SCHEMA_NAME_LEN:
+            * ( ( short* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_USER_NAME:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "default", -1 );
+            break;
+            
+        case SQL_POS_OPERATIONS:                                // 79
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_POS_POSITION;
+            break;
+            
+        case SQL_STATIC_SENSITIVITY:                            // 83
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SS_ADDITIONS;
+            break;
+            
+        case SQL_LOCK_TYPES:                                    // 78
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_LCK_NO_CHANGE;
+            break;
+            
+        case SQL_GETDATA_EXTENSIONS:                            // 81 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_GD_ANY_COLUMN;
+            break;
+            
+        case SQL_TXN_ISOLATION_OPTION:                          // 72
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_SERIALIZABLE;
+            break;
+            
+        case SQL_BOOKMARK_PERSISTENCE:                          // 82
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            break;
+            
+        case SQL_SCROLL_OPTIONS:                                // 44
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SO_FORWARD_ONLY;
+            break;
+            
+        case SQL_SCROLL_CONCURRENCY:                            // 43
+            // deprecated
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SCCO_READ_ONLY;
+            break;
+            
+        case SQL_DYNAMIC_CURSOR_ATTRIBUTES1:                    // 144
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES1:                     // 150
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES1:                     // 167
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1:               // 146
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA1_NEXT;
+            break;
+            
+        case SQL_KEYSET_CURSOR_ATTRIBUTES2:                     // 151
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_STATIC_CURSOR_ATTRIBUTES2:                     // 168
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CA2_READ_ONLY_CONCURRENCY;
+            break;
+            
+        case SQL_NEED_LONG_DATA_LEN:                            // 111
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            break;
+            
+        case SQL_TXN_CAPABLE:                                   // 46 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_TC_NONE;
+            break;
+            
+        case SQL_DEFAULT_TXN_ISOLATION:                         // 26
+            * ( ( Long* ) pInfoValuePtr ) = SQL_TXN_READ_COMMITTED;
+            break;
+            
+        case SQL_DBMS_NAME:                                     // 17 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Gen ODBC Server", -1 );
+            break;
+            
+        case SQL_ODBC_SQL_CONFORMANCE:                          // 15
+            // deprecated
+            * ( ( Word* ) pInfoValuePtr ) = SQL_OSC_MINIMUM;
+            break;
+            
+        case SQL_INTEGRITY:                                     // 73
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            break;
+            
+        case SQL_QUALIFIER_USAGE:                               // 92 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_CU_DML_STATEMENTS | SQL_CU_PROCEDURE_INVOCATION | SQL_CU_TABLE_DEFINITION;
+            break;
+            
+        case SQL_DBMS_VER:                                      // 18 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            break;
+            
+        case SQL_QUOTED_IDENTIFIER_CASE:                        // 93 called
+            //*(( Word* )pInfoValuePtr) = SQL_IC_SENSITIVE;
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_UPPER;
+            break;
+            
+        case SQL_MAX_CATALOG_NAME_LEN:                          // 34
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_MAX_TABLE_NAME_LEN:                            // 35
+            * ( ( Word* ) pInfoValuePtr ) = 128;
+            break;
+            
+        case SQL_ACTIVE_CONNECTIONS:                            // 0
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACTIVE_CONNECTIONS" ));
+            break;
+            
+        case SQL_CATALOG_LOCATION:                              // 114
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CL_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CATALOG_LOCATION" ));
+            break;
+            
+        case SQL_CONCAT_NULL_BEHAVIOR:                           // 22
+            * ( ( Word* ) pInfoValuePtr ) = SQL_CB_NULL;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_CONCAT_NULL_BEHAVIOR" ));
+            break;
+            
+        case SQL_GROUP_BY:                                      // 88
+            * ( ( Word* ) pInfoValuePtr ) = SQL_GB_GROUP_BY_EQUALS_SELECT;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_GROUP_BY" ));
+            break;
+            
+        case SQL_IDENTIFIER_CASE:                               // 28
+            * ( ( Word* ) pInfoValuePtr ) = SQL_IC_MIXED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_IDENTIFIER_CASE" ));
+            break;
+            
+        case SQL_MAX_INDEX_SIZE:                                // 102
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_INDEX_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE:                                  // 104
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE" ));
+            break;
+            
+        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:                    // 103
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_ROW_SIZE_INCLUDES_LONG" ));
+            break;
+            
+        case SQL_MAX_TABLES_IN_SELECT:                          // 106
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_TABLES_IN_SELECT" ));
+            break;
+            
+        case SQL_NULL_COLLATION:                                // 85
+            * ( ( Word* ) pInfoValuePtr ) = SQL_NC_START;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NULL_COLLATION" ));
+            break;
+            
+        case SQL_ORDER_BY_COLUMNS_IN_SELECT:                    // 90
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "N", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ORDER_BY_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_PROCEDURE_TERM:                                // 40
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "procedure", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_PROCEDURE_TERM" ));
+            break;
+            
+        case SQL_OWNER_USAGE:                                   // 91 called
+            * ( ( Word* ) pInfoValuePtr ) = SQL_SU_DML_STATEMENTS | SQL_SU_TABLE_DEFINITION | SQL_SU_PRIVILEGE_DEFINITION;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OWNER_USAGE" ));
+            break;
+            
+        case SQL_SUBQUERIES:                                    // 95
+            * ( ( Long* ) pInfoValuePtr ) = SQL_SQ_CORRELATED_SUBQUERIES |
+                                            SQL_SQ_COMPARISON |
+                                            SQL_SQ_EXISTS |
+                                            SQL_SQ_IN |
+                                            SQL_SQ_QUANTIFIED;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SUBQUERIES" ));
+            break;
+            
+        case SQL_MULT_RESULT_SETS:                              // 36:
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MULT_RESULT_SETS" ));
+            break;
+            
+        case SQL_SERVER_NAME:                                   // 13
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16,
+                               ( ( pODBCConn ) pConn )->Server ? ( ( pODBCConn ) pConn )->Server : "", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SERVER_NAME" ));
+            break;
+            
+        case SQL_ACCESSIBLE_PROCEDURES:                         // 20
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_PROCEDURES" ));
+            break;
+            
+        case SQL_ACCESSIBLE_TABLES:                             // 19
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_ACCESSIBLE_TABLES" ));
+            break;
+            
+        case SQL_OJ_CAPABILITIES:                               // 115 called
+            * ( ( Long* ) pInfoValuePtr ) = SQL_OJ_LEFT |
+                                            SQL_OJ_RIGHT |
+                                            SQL_OJ_FULL |
+                                            SQL_OJ_NESTED |
+                                            SQL_OJ_NOT_ORDERED |
+                                            SQL_OJ_INNER |
+                                            SQL_OJ_ALL_COMPARISON_OPS;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OJ_CAPABILITIES" ));
+            break;
+            
+        case SQL_DRIVER_VER:                                    // 7 called
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "01.00.00000", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_DRIVER_VER" ));
+            break;
+            
+        case SQL_LIKE_ESCAPE_CLAUSE:                            // 113
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_LIKE_ESCAPE_CLAUSE" ));
+            break;
+            
+        case SQL_SPECIAL_CHARACTERS:                            // 94 //called by tb
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "$_", -1 );
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SPECIAL_CHARACTERS" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_GROUP_BY:                       // 97
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_GROUP_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_INDEX:                          // 98
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_INDEX" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_ORDER_BY:                       // 99
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_ORDER_BY" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_SELECT:                         // 100
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_SELECT" ));
+            break;
+            
+        case SQL_MAX_COLUMNS_IN_TABLE:                          // 101
+            * ( ( Word* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_MAX_COLUMNS_IN_TABLE" ));
+            break;
+            
+        case SQL_NUMERIC_FUNCTIONS:                             // 49 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard numeric functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_NUMERIC_FUNCTIONS" ));
+            break;
+            
+        case SQL_OUTER_JOINS:                                   // 38
+            _SQLCopyCharData ( _DIAGCONN ( pConn ), pInfoValuePtr, pBufferLength, pStringLengthPtr, 16, "Y", -1 );
+            // __ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_OUTER_JOINS" ));
+            break;
+            
+        case SQL_STRING_FUNCTIONS:                              // 50 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;                  // ???? set of standard string functions
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_STRING_FUNCTIONS" ));
+            break;
+            
+        case SQL_SYSTEM_FUNCTIONS:                              // 51 called
+            * ( ( Long* ) pInfoValuePtr ) = 0;
+            //__ODBCPOPMSG(_ODBCPopMsg("SQLGetInfo, SQL_SYSTEM_FUNCTIONS" ));
+            break;
+            
+        /*
+            Note: The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.
+            An SQLUINTEGER bitmask enumerating the scalar date and time functions supported by the driver and associated data source.
+            The following bitmasks are used to determine which date and time functions are supported:
+            SQL_FN_TD_CURRENT_DATE ODBC 3.0)SQL_FN_TD_CURRENT_TIME (ODBC 3.0)SQL_FN_TD_CURRENT_TIMESTAMP (ODBC 3.0)SQL_FN_TD_CURDATE (ODBC 1.0)SQL_FN_TD_CURTIME (ODBC 1.0) SQL_FN_TD_DAYNAME (ODBC 2.0)SQL_FN_TD_DAYOFMONTH (ODBC 1.0)SQL_FN_TD_DAYOFWEEK (ODBC 1.0)SQL_FN_TD_DAYOFYEAR (ODBC 1.0) SQL_FN_TD_EXTRACT (ODBC 3.0)SQL_FN_TD_HOUR (ODBC 1.0)SQL_FN_TD_MINUTE (ODBC 1.0)SQL_FN_TD_MONTH (ODBC 1.0)SQL_FN_TD_MONTHNAME (ODBC 2.0)SQL_FN_TD_NOW (ODBC 1.0)SQL_FN_TD_QUARTER (ODBC 1.0)SQL_FN_TD_SECOND (ODBC 1.0)SQL_FN_TD_TIMESTAMPADD (ODBC 2.0)SQL_FN_TD_TIMESTAMPDIFF (ODBC 2.0)SQL_FN_TD_WEEK (ODBC 1.0)SQL_FN_TD_YEAR (ODBC 1.0)
+        */
+        case SQL_TIMEDATE_FUNCTIONS:                            // 52 called
+            * ( ( Long* ) pInfoValuePtr ) =
+                SQL_FN_TD_CURRENT_DATE |
+                SQL_FN_TD_CURRENT_TIME |
+                SQL_FN_TD_CURRENT_TIMESTAMP |
+                SQL_FN_TD_CURDATE |
+                SQL_FN_TD_CURTIME |
+                SQL_FN_TD_DAYNAME |
+                SQL_FN_TD_DAYOFMONTH |
+                SQL_FN_TD_DAYOFWEEK |
+                SQL_FN_TD_DAYOFYEAR |
+                SQL_FN_TD_EXTRACT |
+                SQL_FN_TD_HOUR |
+                SQL_FN_TD_MINUTE |
+                SQL_FN_TD_MONTH |
+                SQL_FN_TD_MONTHNAME |
+                SQL_FN_TD_NOW |
+                SQL_FN_TD_QUARTER |
+                SQL_FN_TD_SECOND |
+                SQL_FN_TD_TIMESTAMPADD |
+                SQL_FN_TD_TIMESTAMPDIFF |
+                SQL_FN_TD_WEEK |
+                SQL_FN_TD_YEAR ;
+            break;
+            
+        default:
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR,
+                                      "Function Missing!!! SQLGetInfo, Field: %d, DataPtr: %d, BufLen: %d, SizePtr: %d\n",  pInfoType, pInfoValuePtr,
+                                      pBufferLength, pStringLengthPtr ) );
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get type related information, this communicates with the server
+// -----------------------------------------------------------------------
+
+//TODO
+RETCODE SQL_API SQLGetTypeInfo ( HSTMT pStmt, SWORD pDataType ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfo called, Stmt: %d, DataType: %d", ( Long ) pStmt,
+                              pDataType ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetType Info is not supported" ) );
+    return SQL_SUCCESS;
+}
+
+
+// -----------------------------------------------------------------------
+// to get function related information
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLGetFunctions ( SQLHDBC pConn, SQLUSMALLINT  pFuncID, SQLUSMALLINT*  pOutput ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetFunctions called" ) );
+    // the functions is currently not being exported
+    // bcoz of implemenation difficulties for
+    // SQL_API_ODBC3_ALL_FUNCTIONS param
+    // which requires an array to be built
+    // to satisfy the functioning of the macro  SQL_FUNC_EXISTS.
+    // in any case the driver manager provides for a proper
+    // stub
+    // SQLFUNCEXISTS ---- ( ( *(((UWORD*) (pfExists)) + ((uwAPI) >> 4)) & (1 << ((uwAPI) & 0x000F))) ? SQL_TRUE : SQL_FALSE )
+    return SQL_SUCCESS;
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_PARAM.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_PARAM.CPP b/odbc/Driver/KO_PARAM.CPP
new file mode 100644
index 0000000..8df4fe5
--- /dev/null
+++ b/odbc/Driver/KO_PARAM.CPP
@@ -0,0 +1,85 @@
+
+// ----------------------------------------------------------------------------
+//
+// File:    KO_PARAM.CPP
+//
+// Purpose: This file contains functions for implementing
+//          parameterized queries. Since I have not shown
+//          implementation of params in the sample, all the
+//          functions r just placeholders. Params work
+//          thru APD and IPD just like actual results
+//          work thru ARD and IRD
+//
+// Exported functions:
+//                       SQLBindParameter
+//                       SQLDescribeParam
+//                       SQLNumParams
+//                       SQLParamData
+//
+// ----------------------------------------------------------------------------
+#include "stdafx.h"
+
+
+
+// -----------------------------------------------------------------------
+// to bind a buffer to a parameter marker in an SQL statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLBindParameter ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pParamNum,
+                                   SQLSMALLINT     pIOType,
+                                   SQLSMALLINT     pValueType,
+                                   SQLSMALLINT     pParamType,
+                                   SQLUINTEGER     pColSize,
+                                   SQLSMALLINT     pDecimalDigits,
+                                   SQLPOINTER      pParamValuePtr,
+                                   SQLINTEGER      pParamValueSize,
+                                   SQLINTEGER*     pParamValueSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBindParameter called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLBindParameter not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+
+// -----------------------------------------------------------------------
+// to get param descriptions for a specified bound param
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLDescribeParam ( SQLHSTMT        pStmt,
+                                   SQLUSMALLINT    pParamNum,
+                                   SQLSMALLINT*    pDataTypePtr,
+                                   SQLUINTEGER*    pParamSizePtr,
+                                   SQLSMALLINT*    pDecimalDigitsPtr,
+                                   SQLSMALLINT*    pNullablePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDescribeParam called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLDescribeParam not implemented" ) );
+    return SQL_ERROR;
+}
+
+
+// -----------------------------------------------------------------------
+// to get the number of parameters in a statement
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLNumParams ( SQLHSTMT pStmt, SQLSMALLINT* pParamCountPtr ) {
+    // since the concept of parameters has not been implemented
+    // this function returns zero in the number of params to
+    // make sure that the calle does not proceed forward on this issue
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumParams called" ) );
+    
+    if ( pParamCountPtr )
+    { *pParamCountPtr = 0; }
+    
+    return SQL_SUCCESS;
+}
+
+// -----------------------------------------------------------------------
+// to be used wth SQLPutData to provide param data at execution time
+// -----------------------------------------------------------------------
+
+RETCODE SQL_API SQLParamData ( SQLHSTMT pStmt, SQLPOINTER* pValuePtrPtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLParamData called" ) );
+    __ODBCPOPMSG ( _ODBCPopMsg ( "SQLParamData not implemented" ) );
+    return SQL_ERROR;
+}

http://git-wip-us.apache.org/repos/asf/incubator-kylin/blob/d1dcfd15/odbc/Driver/KO_UTILS.CPP
----------------------------------------------------------------------
diff --git a/odbc/Driver/KO_UTILS.CPP b/odbc/Driver/KO_UTILS.CPP
new file mode 100644
index 0000000..9962a6a
--- /dev/null
+++ b/odbc/Driver/KO_UTILS.CPP
@@ -0,0 +1,566 @@
+
+// ---------------------------------------------------------------------------------
+//
+// File:    KO_UTILS.CPP
+//
+// Notes:   contains generic utility functions used across files/modules.
+//          Data conversion and copying functions w.r.t ODBC type params
+//          like its type, size, its size pointer, src data and src size etc.
+//
+//          As explained in the article ODBC specifies a way in which
+//          buffers r laid out along with their size and return length
+//          placeholders. The functions _SQLCopyCharData, _SQLCopyNumData
+//          and _SQLCopyDateTimeData have been designed to copy char, numeric
+//          and date time data from src ( buffer,size,type ) to tgt ( buffer,
+//          size, type ) whichever params r applicable.
+//
+// ----------------------------------------------------------------------------------
+#include "stdafx.h"
+
+// ------------------------- local functions ----------------------------
+eGoodBad    GetDateFromString ( const char* pDateStr, struct tagDATE_STRUCT* pDateStruct );
+eGoodBad    GetTimestampFromString ( const char* pDateStr, struct tagTIMESTAMP_STRUCT* pTimestampStruct );
+
+
+// ----------------------------------------------------------------------
+// to extract date from string assuming server format to be yyyy-mm-dd or yyyymmdd
+// ----------------------------------------------------------------------
+
+eGoodBad GetDateFromString ( const char* pDateStr, struct tagDATE_STRUCT* pDateStruct ) {
+    char    val[5];
+    short   x;
+    short   day, month;
+    // length of source
+    x = strlen ( pDateStr );
+    
+    // 10 byte date yyyy-mm-dd, 8 byte date yyyymmdd
+    if ( x == 8 || x == 10 ) {
+        // calc  pos of day and month in string
+        if ( x == 8 ) {
+            day     = 6;
+            month   = 4;
+        }
+        
+        else {
+            day     = 8;
+            month   = 5;
+        }
+        
+        // convert day value
+        pDateStruct->day = atoi ( pDateStr + day );
+        // copy and convert month
+        strncpy ( val, pDateStr + month, 2 ); val[2] = 0;
+        pDateStruct->month  = atoi ( val );
+        strncpy ( val, pDateStr, 4 ); val[4] = 0;
+        pDateStruct->year   = atoi ( val );
+        return GOOD;
+    }
+    
+    else {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Invalid date string for conversion: %s", pDateStr ) );
+        return BAD;
+    }
+}
+
+//Timestamps in text files have to use the format yyyy-mm-dd hh:mm:ss[.f...]
+eGoodBad    GetTimestampFromString ( const char* pStr, struct tagTIMESTAMP_STRUCT* pTimestampStruct ) {
+    char    val[10];
+    short   x;
+    short   day, month, hour, minute, second, frag;
+    // length of source
+    x = strlen ( pStr );
+    const char* p = pStr;
+    
+    while ( ( *p != ' ' ) && ( p < pStr + x ) ) {
+        p++;
+    }
+    
+    if ( ( p - pStr ) != 10 || ( x < 19 ) ) {
+        __ODBCPOPMSG ( _ODBCPopMsg ( "Invalid timestamp string for conversion: %s", pStr ) );
+        return BAD;
+    }
+    
+    month   = 5;
+    day     = 8;
+    hour = 11;
+    minute = 14;
+    second = 17;
+    frag = 20;
+    // convert day value
+    strncpy ( val, pStr + day, 2 );
+    val[2] = 0;
+    pTimestampStruct->day = atoi ( val );
+    // copy and convert month
+    strncpy ( val, pStr + month, 2 );
+    val[2] = 0;
+    pTimestampStruct->month  = atoi ( val );
+    //convert year
+    strncpy ( val, pStr, 4 );
+    val[4] = 0;
+    pTimestampStruct->year   = atoi ( val );
+    //convert hour
+    strncpy ( val, pStr + hour, 2 );
+    val[2] = 0;
+    pTimestampStruct->hour = atoi ( val );
+    //convert minute
+    strncpy ( val, pStr + minute, 2 );
+    val[2] = 0;
+    pTimestampStruct->minute = atoi ( val );
+    //convert second
+    strncpy ( val, pStr + second, 2 );
+    val[2] = 0;
+    pTimestampStruct->second = atoi ( val );
+    
+    if ( x >= 21 ) {
+        pTimestampStruct->fraction = atoi ( pStr + frag );
+    }
+    
+    else {
+        pTimestampStruct->fraction = 0;
+    }
+    
+    return GOOD;
+}
+
+// ----------------------------------------------------------------------
+// to create a copy of char data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+RETCODE SQL_API _SQLCopyCharData ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                   Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG,
+                              "_SQLCopyCharData called,pDataBufSize %d, the src is %s, strlen(src) %d, pSrcDataSize %d", pDataBufSize, pSrcData,
+                              strlen ( pSrcData ), pSrcDataSize ) );
+    Long    n;
+    
+    // caller safe
+    if ( pTgtDataPtr )
+    { * ( ( StrPtr ) pTgtDataPtr ) = 0; }
+    
+    // DATA SIZE
+    
+    // check source data to compute size
+    if ( pSrcData && _stricmp ( ( StrPtr ) pSrcData, "NULL" ) != 0 )
+    { n = ( pSrcDataSize < 0 ) ? strlen ( ( StrPtr ) pSrcData ) : pSrcDataSize; }        // compute length based on whether null terminated
+    
+    else
+    { n = 0; }
+    
+    // check if there is a holder for size
+    if ( pSizePtr ) {
+        // set size as per ptr type 16-bt or 32-bit
+        if ( pSizePtrSize == 16 )
+        { * ( ( Word* ) pSizePtr ) = ( Word ) n; }
+        
+        else
+        { * ( ( Long* ) pSizePtr ) = n; }
+    }
+    
+    // check if src data but no size holder
+    else if ( pSrcData ) {
+        // check if diag to be set
+        if ( pDiag )
+        { _SQLPutDiagRow ( pDiag, "_SQLCopyCharData", "01000", -1, "No holder for data size", NULL ); }
+        
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCopyCharData - No holder for data size" ) );
+        return SQL_ERROR;
+    }
+    
+    // check if there is a target holder
+    if ( pTgtDataPtr ) {
+        // check if there is a source pointer
+        if ( pSrcData ) {
+            // does all of it fit with null char
+            if ( pDataBufSize >= n + 1 ) {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, n );
+                ( ( StrPtr ) pTgtDataPtr ) [n] = 0;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyCharData has been called, the string(not truncated) is %s",
+                                          pTgtDataPtr ) );
+                return SQL_SUCCESS;
+            }
+            
+            // all of it does not fit
+            else {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, pDataBufSize - 1 );
+                ( ( StrPtr ) pTgtDataPtr ) [pDataBufSize - 1] = 0;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "_SQLCopyCharData has been called, the target string is (truncated) %s",
+                                          pTgtDataPtr ) );
+                //return SQL_SUCCESS_WITH_INFO may cause error in tableau
+                //if ( pDiag )
+                //  _SQLPutDiagRow ( pDiag, "_SQLCopyCharData", "01000", -1, "string data truncated", NULL );
+                //return SQL_SUCCESS_WITH_INFO;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "string data truncated" ) );
+                return SQL_SUCCESS;
+            }
+        }
+        
+        // tgt data but no src data
+        else {
+            // clear tgt
+            * ( ( Char* ) pTgtDataPtr ) = 0;
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyCharData has been called, the string is (empty) %s", pTgtDataPtr ) );
+        }
+    }
+    
+    return SQL_SUCCESS;
+}
+
+RETCODE SQL_API _SQLCopyWCharData ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                    Word pSizePtrSize, CStrPtr pSrcData, Long pSrcDataSize ) {
+    unique_ptr<wchar_t[]> pWCS ( char2wchar ( pSrcData ) );
+    return _SQLCopyWCharDataW ( pDiag,  pTgtDataPtr,  pDataBufSize,  pSizePtr,  pSizePtrSize,  pWCS.get(),  pSrcDataSize );
+}
+//mhb added, for those ard that accept wchar
+RETCODE SQL_API _SQLCopyWCharDataW ( pODBCDiag pDiag, void* pTgtDataPtr, Long pDataBufSize, void* pSizePtr,
+                                     Word pSizePtrSize, const wchar_t* pSrcData, Long pSrcDataSize ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW called, pTgtDataPtr is null? %d, pSizePtr == null? %d",
+                              pTgtDataPtr == NULL, pSizePtr == NULL ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW called, the src string is :" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, pSrcData ) );
+    Long    n;
+    
+    // caller safe
+    if ( pTgtDataPtr )
+    { * ( ( wchar_t* ) pTgtDataPtr ) = 0; }
+    
+    // DATA SIZE
+    
+    // check source data to compute size
+    if ( pSrcData && _wcsicmp ( pSrcData, L"NULL" ) != 0 )
+    { n = ( pSrcDataSize < 0 ) ?  wcslen ( pSrcData ) : pSrcDataSize; }         // compute length based on whether null terminated
+    
+    else
+    { n = 0; }
+    
+    // check if there is a holder for size
+    if ( pSizePtr ) {
+        // set size as per ptr type 16-bt or 32-bit
+        
+        //should be number of characters
+        if ( pSizePtrSize == 16 )
+        { * ( ( Word* ) pSizePtr ) = ( Word ) ( 2 * n ); }
+        
+        else
+        { * ( ( Long* ) pSizePtr ) = ( 2 * n ); }
+        
+        __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pSizePtr is set to %d", n ) );
+    }
+    
+    // check if src data but no size holder
+    else if ( pSrcData ) {
+        // check if diag to be set
+        if ( pDiag )
+        { _SQLPutDiagRow ( pDiag, "_SQLCopyWCharDataW", "01000", -1, "No holder for data size", NULL ); }
+        
+        __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLCopyWCharDataW - No holder for data size" ) );
+        return SQL_ERROR;
+    }
+    
+    // DATA
+    
+    // check if there is a target holder
+    if ( pTgtDataPtr ) {
+        // check if there is a source pointer
+        if ( pSrcData ) {
+            // does all of it fit with null char
+            if ( pDataBufSize >= ( n + 1 ) ) {
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, 2 * ( n + 1 ) );
+                ( ( wchar_t* ) pTgtDataPtr ) [n] = '\0';
+                //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"_SQLCopyWCharDataW has been called, the target string(not truncated) is :"));
+                //unique_ptr<char[]> temp2(wchar2char( (wchar_t*)pTgtDataPtr));
+                //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,temp2.get()));
+                return SQL_SUCCESS;
+            }
+            
+            // all of it does not fit
+            else {
+                //if(pDataBufSize % 2 == 1)
+                //  pDataBufSize -= 1;
+                memcpy ( ( StrPtr ) pTgtDataPtr, pSrcData, 2 * ( pDataBufSize - 1 ) );
+                ( ( wchar_t* ) pTgtDataPtr ) [pDataBufSize - 1] = 0;
+                //__ODBCLOG(_ODBCLogMsg(LogLevel_WARN,"_SQLCopyWCharDataW has been called, the target string is(truncated) :"));
+                unique_ptr<char[]> temp ( wchar2char ( ( wchar_t* ) pTgtDataPtr ) );
+                //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG, temp.get()));
+                //return SQL_SUCCESS_WITH_INFO may cause error in tableau
+                //if ( pDiag )
+                //  _SQLPutDiagRow ( pDiag, "_SQLCopyWCharDataW", "01000", -1, "string data truncated", NULL );
+                //return SQL_SUCCESS_WITH_INFO;
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_WARN, "string data truncated" ) );
+                return SQL_SUCCESS;
+            }
+        }
+        
+        // tgt data but no src data
+        else {
+            // clear tgt
+            * ( ( wchar_t* ) pTgtDataPtr ) = 0;
+            __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyWCharDataW has been called, the string is (empty) %s",
+                                      pTgtDataPtr ) );
+        }
+    }
+    
+    return SQL_SUCCESS;
+}
+
+
+// ----------------------------------------------------------------------
+// to create a copy of numeric data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+
+//TODO: it seems that the unsigned values are not treated specially
+Word _SQLCopyNumData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData, Word pSrcDataType ,
+                       Long* pTgtDataSizePtr ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyNumData called" ) );
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The src is %s", pSrcData ) );
+    // note
+    // source data is received as character string
+    // target data size indicates the type of int - 8bit, 16bit, 32bit, float, double etc
+    // source data type is also recd. but is not being checked right now
+    // this can be used to detrmine if the conversion is possible at all
+    bool    isnull;
+    // check if source data is NULL
+    isnull = ( !pSrcData || _stricmp ( pSrcData, "NULL" ) == 0 ) ? TRUE : 0;
+    
+    // check if target is there
+    if ( pTgtDataPtr ) {
+        // check the data type
+        switch ( pTgtDataType ) {
+            case SQL_C_UTINYINT:
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( unsigned char* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( char ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( char );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (unsigned char)",
+                                          * ( ( unsigned char* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_STINYINT:
+            case SQL_C_TINYINT:
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( char* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( char ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( char );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d  (signed char)", * ( ( char* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_USHORT:             // unsigned short
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( Word* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Word ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Word );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %u (signed short)",
+                                          * ( ( unsigned short* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_SHORT:             // case i2
+            case SQL_C_SSHORT:             // signed short
+                if ( !isnull ) {
+                    int i32;
+                    i32 = atoi ( pSrcData );
+                    * ( ( Word* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Word ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Word );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (signed short)", * ( ( Word* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_ULONG:               // unsigned long
+                if ( !isnull ) {
+                    unsigned long ui32;
+                    ui32 = strtoul ( pSrcData , NULL, 10 );
+                    * ( ( unsigned long* ) pTgtDataPtr ) = ui32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( unsigned long ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( unsigned long );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %u (unsigned int)",
+                                          * ( ( unsigned long* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_LONG:               // case i4
+            case SQL_C_SLONG:               // signed long
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    long i32;
+                    i32 = atol ( pSrcData );
+                    * ( ( Long* ) pTgtDataPtr ) = i32;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( Long ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( Long );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %d (signed int)", * ( ( Long* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_C_UBIGINT:
+                if ( !isnull ) {
+                    unsigned __int64 x64;
+                    x64 = _strtoui64 ( pSrcData, NULL, 10 );
+                    * ( ( unsigned __int64* ) pTgtDataPtr ) = x64;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( unsigned __int64 ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( unsigned __int64 );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %I64u (unsigned big int)",
+                                          * ( ( unsigned __int64* ) pTgtDataPtr ) ) );
+                break;
+                
+            case SQL_BIGINT:
+            case SQL_C_SBIGINT:
+                if ( !isnull ) {
+                    __int64 x64;
+                    x64 = _strtoi64 ( pSrcData, NULL, 10 );
+                    * ( ( __int64* ) pTgtDataPtr ) = x64;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( __int64 ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( __int64 );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %I64d (signed big int)",
+                                          * ( ( __int64* ) pTgtDataPtr ) ) );
+                break;
+                
+            //case SQL_DECIMAL: //decimal type has a special struct
+            case SQL_FLOAT:
+            case SQL_C_FLOAT:
+                if ( !isnull ) {
+                    // ???? check src type
+                    double f;
+                    f = atof ( pSrcData );
+                    * ( ( float* ) pTgtDataPtr ) = ( float ) f;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( float ) ); }
+                
+                *pTgtDataSizePtr  = sizeof ( float );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %9.9f (float)", * ( ( float* ) pTgtDataPtr ) ) );
+                break;
+                
+            //case SQL_REAL:
+            //case SQL_NUMERIC:                           // case float
+            
+            case SQL_C_DOUBLE:
+                if ( !isnull ) {
+                    // ???? check src type
+                    char*   e;
+                    double  d;
+                    
+                    if ( pSrcDataType == SQL_BIT )
+                    { d = 1; }
+                    
+                    else
+                    { d = strtod ( pSrcData, &e ); }
+                    
+                    * ( ( double* ) pTgtDataPtr ) = d;
+                }
+                
+                else
+                { memset ( pTgtDataPtr, 0, sizeof ( double ) ); }
+                
+                *pTgtDataSizePtr = sizeof ( double );
+                __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The num is set to %9.9f (double), with the pTgtDataSizePtr %d",
+                                          * ( ( double* ) pTgtDataPtr ), *pTgtDataSizePtr ) );
+                break;
+                
+            default:
+                return 1;               // data type not understood
+        }
+        
+        return 0;                       // successful, at least data type recognized
+    }
+    
+    else
+    { return -1; }                      // should not typically happen
+}
+
+
+// ----------------------------------------------------------------------
+// to create a copy of date/time data to specified tgt buffer
+// ----------------------------------------------------------------------
+
+Word _SQLCopyDateTimeData ( pODBCDiag pDiag, void* pTgtDataPtr, Word pTgtDataType, CStrPtr pSrcData,
+                            Word pSrcDataType ) {
+    __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLCopyDateTimeData called, with the src : %s", pSrcData ) );
+    // note
+    // source data is received as character string
+    // source data type is also recd. but is not being checked right now
+    // this can be used to detrmine if the conversion is possible at all
+    bool    isnull;
+    // check if source data is NULL
+    isnull = ( !pSrcData || _stricmp ( pSrcData, "NULL" ) == 0 ) ? TRUE : 0;
+    
+    // check if target is there
+    if ( pTgtDataPtr ) {
+        // check the data size
+        switch ( pTgtDataType ) {
+            case SQL_C_TYPE_DATE:                     // 91
+            case SQL_C_DATE:
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    memset ( pTgtDataPtr, 0, sizeof ( struct tagDATE_STRUCT ) );
+                    GetDateFromString ( pSrcData, ( struct tagDATE_STRUCT* ) pTgtDataPtr );
+                }
+                
+                break;
+                
+            case SQL_C_TYPE_TIME:                     // 92
+            case SQL_C_TIME:
+                //not suppporting Time
+                return 1;
+                
+            case SQL_C_TYPE_TIMESTAMP:                // 93
+            case SQL_C_TIMESTAMP:
+            
+                // ???? check src type
+                if ( !isnull ) {
+                    memset ( pTgtDataPtr, 0, sizeof ( struct tagTIMESTAMP_STRUCT ) );
+                    GetTimestampFromString ( pSrcData, ( struct tagTIMESTAMP_STRUCT* ) pTgtDataPtr );
+                }
+                
+                break;
+                
+            default:
+                return 1;               // data type not understood
+        }
+        
+        return 0;                       // successful, at least data type recognized
+    }
+    
+    else
+    { return -1; }                      // should not typically happen
+}
+
+
+
+