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
+}
+
+
+
+