From 9258c0430faa83f06f1ad377f5ae2e05c2208463 Mon Sep 17 00:00:00 2001 From: lidongsjtu Date: Wed, 28 Oct 2015 12:44:47 +0800 Subject: [PATCH] KYLIN-1065 ODBC driver support tableau 9.1 --- odbc/Driver/KO_DESC.CPP | 5623 ++++++++++++++++++++++---------------------- odbc/Driver/KO_DIAG.CPP | 3 +- odbc/Driver/KO_FETCH.CPP | 2659 ++++++++++----------- odbc/Driver/KO_INFO.CPP | 2389 ++++++++++--------- odbc/Driver/KO_UTILS.CPP | 1191 +++++----- odbc/Driver/KylinODBC.H | 4 +- odbc/Driver/driver.vcxproj | 747 +++--- 7 files changed, 6320 insertions(+), 6296 deletions(-) diff --git a/odbc/Driver/KO_DESC.CPP b/odbc/Driver/KO_DESC.CPP index 9d9e14a..b555648 100644 --- a/odbc/Driver/KO_DESC.CPP +++ b/odbc/Driver/KO_DESC.CPP @@ -1,2800 +1,2823 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -// ---------------------------------------------------------------------------- -// -// File: KO_DESC.CPP -// -// Purpose: Contains descriptor functions. -// As explained in the article, descriptors r the heart -// as far as driver design is concerned. Descriptors -// r essntially data structures to encapsulate one type of -// data. Say results from server. Say col specification from -// application and so. All the four descriptors (ARD,IRD,APD,IPD) -// r encapsulated inside the statement structure. -// -// The local functions provided for each descriptor include -// 1. maintaining the link list _SQLAttachXXXItem/_SQLDetachXXXItem -// 2. getting an desc item from link list _SQLGetXXXItem -// 3. setting default values in desc header/item _SQLSetXXXFieldsDefault/_SQLSetXXXItemFieldsDefault -// 4. setting values in desc header/item _SQLSetXXXField/_SQLSetXXXItemField -// 5. getting values from desc header/item _SQLGetXXXField/_SQLGetXXXItemField -// where XXX is the descriptor type ARD,IRD,APD,IPD -// -// These functions are used internally by most functions -// like SQLBindCol, SQLColAttribiute and so on to maintain -// info in the descriptor structures. -// -// The exposed functions allow the client to directly -// manipulate the descriptor values, and these functions -// also use these local functions only. -// But use of the exposed descriptor function is not very -// common in the ODBC parlance. -// -// Exported functions: -// SQLGetDescField -// SQLSetDescField -// SQLGetDescRec -// SQLSetDescRec -// SQLCopyDesc -// -// ---------------------------------------------------------------------------- -#include "stdafx.h" - - -// ------------------------ local functions ----------------------------------- -pAPDItem _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum ); -pIPDItem _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum ); -pARDItem _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum ); -pIRDItem _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum ); - -eGoodBad _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt ); -eGoodBad _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem ); - -eGoodBad _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt ); -eGoodBad _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem ); - -eGoodBad _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt ); -eGoodBad _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum ); - -eGoodBad _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt ); -eGoodBad _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem ); - -RETCODE SQL_API _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ); -RETCODE SQL_API _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); - -RETCODE SQL_API _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ); -RETCODE SQL_API _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); - -RETCODE SQL_API _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ); -RETCODE SQL_API _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); - -RETCODE SQL_API _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ); -RETCODE SQL_API _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ); -RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr , bool isANSI ); - -RETCODE SQL_API _SQLFreeAPDContent ( const pODBCAPD pDesc ); -RETCODE SQL_API _SQLFreeIPDContent ( const pODBCIPD pDesc ); -RETCODE SQL_API _SQLFreeARDContent ( const pODBCARD pDesc ); -RETCODE SQL_API _SQLFreeIRDContent ( const pODBCIRD pDesc ); - -eGoodBad _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem ); -eGoodBad _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem ); - - -// ----------------------------------------------------------------------- -// to get value of specified descriptor field -// ----------------------------------------------------------------------- - -RETCODE _SQLGetDescField_basic ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize, - SQLINTEGER* pDataSizePtr, - bool isANSI ) { - bool invalidfld; - bool headerfld; - Word desctype; - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - invalid params" ) ); - return SQL_ERROR; - } - - // initializations - invalidfld = FALSE; - headerfld = TRUE; - desctype = _DESCTYPE ( pDesc ); - - // check if descriptor is valid & reset diags - switch ( desctype ) { - case SQL_DESC_APD: - _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) ); - break; - - case SQL_DESC_IPD: - _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) ); - break; - - case SQL_DESC_ARD: - _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) ); - break; - - case SQL_DESC_IRD: - _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) ); - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid descriptor handle" ) ); - return SQL_ERROR; - } - - // HEADER FIELDS - - // check the field type - header field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - - /***** - SQLSMALLINT - ARD: R APD: R IRD: R IPD: R - ARD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER - APD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER - IRD: SQL_DESC_ALLOC_AUTO - IPD: SQL_DESC_ALLOC_AUTO - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - } - - break; - - case SQL_DESC_ARRAY_SIZE: - - /********* - SQLUINTEGER - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD:[1] APD:[1] IRD: Unused IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - - /********** - SQLUSMALLINT* - ARD: R/W APD: R/W IRD: R/W IPD: R/W - ARD: Null ptr APD: Null ptr IRD: Null ptr IPD: Null ptr - **********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - } - - break; - - case SQL_DESC_BIND_OFFSET_PTR: - - /********** - SQLINTEGER* - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused - **********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_BIND_TYPE: - - /********** - SQLINTEGER - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD: SQL_BIND_BY_COLUMN - APD: SQL_BIND_BY_COLUMN IRD: Unused IPD: Unused - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_COUNT: - - /********** - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: 0 APD: 0 IRD: D IPD: 0 - **********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - } - - break; - - case SQL_DESC_ROWS_PROCESSED_PTR: - - /********** - SQLUINTEGER* - ARD: Unused APD: Unused IRD: R/W IPD: R/W - ARD: Unused APD: Unused IRD: Null ptr IPD: Null ptr - ***********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - default: - headerfld = FALSE; - } - - // check if not an header field - if ( headerfld == TRUE ) - { return SQL_SUCCESS; } - - // check if invalid field - if ( invalidfld == TRUE ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) ); - return SQL_ERROR; - } - - // check the field type - record field - switch ( pFldID ) { - case SQL_DESC_AUTO_UNIQUE_VALUE: - - /*********** - SQLINTEGER - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - *********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_BASE_COLUMN_NAME: - - /********** - SQLCHAR * - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - **********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_BASE_TABLE_NAME: - - /******** - SQLCHAR * - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - *******/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_CASE_SENSITIVE: - - /********** - SQLINTEGER - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: D IPD: D - *******/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_CATALOG_NAME: - - /********** - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_CONCISE_TYPE: - - /********** - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_DATA_PTR: - - /*********** - SQLPOINTER - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused - ************/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - - /********** - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - - /********* - SQLINTEGER - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - **********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_DISPLAY_SIZE: - - /********* - SQLINTEGER - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - **********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_FIXED_PREC_SCALE: - - /********* - SQLSMALLINT - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: D IPD: D[1] - *********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_INDICATOR_PTR: - - /********** - SQLINTEGER * - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_LABEL: - - /********* - SQLCHAR * - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - ***********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_LENGTH: - - /******** - SQLUINTEGER - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - } - - break; - - case SQL_DESC_LITERAL_PREFIX: - - /********** - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - **********/ - - // a read-only IRD field - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_LITERAL_SUFFIX: - - /********** - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - **********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_LOCAL_TYPE_NAME: - - /*********** - SQLCHAR * - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: D IPD: D - ***********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_NAME: - - /*********** - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - *********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_NULLABLE: - - /********** - SQLSMALLINT - ARD: Unused APD: Unused IRD: R IPD: R - ARD: ND APD: ND IRD: D IPD: ND - ***********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_NUM_PREC_RADIX: - - /********* - SQLINTEGER - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_OCTET_LENGTH: - - /********** - SQLINTEGER - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_OCTET_LENGTH_PTR: - - /****** - SQLINTEGER* - ARD: R/W APD: R/W IRD: Unused IPD: Unused - ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_PARAMETER_TYPE: - - /********* - SQLSMALLINT - ARD: Unused APD: Unused IRD: Unused IPD: R/W - ARD: Unused APD: Unused IRD: Unused IPD: D=SQL_PARAM_INPUT - *********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_PRECISION: - - /********* - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_ROWVER: - - /********* - SQLSMALLINT - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: ND IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_SCALE: - - /******** - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_SCHEMA_NAME: - - /********* - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_SEARCHABLE: - - /********* - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_TABLE_NAME: - - /******** - SQLCHAR* - ARD: Unused APD: Unused IRD: R IPD: Unused - ARD: Unused APD: Unused IRD: D IPD: Unused - ********/ - switch ( desctype ) { - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_TYPE: - - /********* - SQLSMALLINT - ARD: R/W APD: R/W IRD: R IPD: R/W - ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND - *********/ - switch ( desctype ) { - case SQL_DESC_APD: - return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_ARD: - return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - } - - break; - - case SQL_DESC_TYPE_NAME: - - /********* - SQLCHAR * - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: D IPD: D - **********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_UNNAMED: - - /******** - SQLSMALLINT - ARD: Unused APD: Unused IRD: R IPD: R/W - ARD: ND APD: ND IRD: D IPD: ND - ********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - case SQL_DESC_UNSIGNED: - - /********* - SQLSMALLINT - ARD: Unused APD: Unused IRD: R IPD: R - ARD: Unused APD: Unused IRD: D IPD: D - ********/ - switch ( desctype ) { - case SQL_DESC_IPD: - return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); - - case SQL_DESC_IRD: - return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); - - default: - invalidfld = TRUE; - } - - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Unknown field %d", pFldID ) ); - return SQL_ERROR; - } - - // check if invalid field - if ( invalidfld == TRUE ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) ); - return SQL_ERROR; - } - - return SQL_SUCCESS; -} - - -RETCODE SQL_API SQLGetDescFieldW ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize, - SQLINTEGER* pDataSizePtr ) - -{ - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLGetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, - ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); - return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, false ); -} - -RETCODE SQL_API SQLGetDescField ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize, - SQLINTEGER* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLGetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, - ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); - return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, true ); -} - -// ----------------------------------------------------------------------- -// to set a single field in a desc record -// ----------------------------------------------------------------------- -RETCODE SQL_API SQLSetDescFieldW ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLSetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, - ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescFieldW Not implemented" ) ); - return SQL_ERROR; -} - -RETCODE SQL_API SQLSetDescField ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLSetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, - ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescField Not implemented" ) ); - return SQL_ERROR; -} - - -// ----------------------------------------------------------------------- -// to get multiple fields from a desc record, at one shot -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLGetDescRec ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLCHAR* pName, - SQLSMALLINT pNameSize, - SQLSMALLINT* pNameSizePtr, - SQLSMALLINT* pTypePtr, - SQLSMALLINT* pSubTypePtr, - SQLINTEGER* pLengthPtr, - SQLSMALLINT* pPrecisionPtr, - SQLSMALLINT* pScalePtr, - SQLSMALLINT* pNullablePtr ) - -{ - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc, - pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) ); - Word desctype; - Long i; - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec - invalid params" ) ); - return SQL_ERROR; - } - - // initializations - desctype = _DESCTYPE ( pDesc ); - - switch ( desctype ) { - case SQL_DESC_APD: - pAPDItem apditem; - _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) ); - // get item from APD - apditem = _SQLGetAPDItem ( ( pODBCAPD ) pDesc, pRecNum ); - - // check if item located - if ( apditem == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid APD item" ) ); - return SQL_ERROR; - } - - // get the fields - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); - *pNameSizePtr = ( Word ) i; - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, - NULL ); - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); - _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); - break; - - case SQL_DESC_IPD: - pIPDItem ipditem; - _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) ); - // get item from IPD - ipditem = _SQLGetIPDItem ( ( pODBCIPD ) pDesc, pRecNum ); - - // check if item located - if ( ipditem == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid IPD item" ) ); - return SQL_ERROR; - } - - // set the fields - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); - *pNameSizePtr = ( Word ) i; - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, - NULL ); - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); - _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); - break; - - case SQL_DESC_ARD: - pARDItem arditem; - _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) ); - // get item from ARD - arditem = _SQLGetARDItem ( ( pODBCARD ) pDesc, pRecNum ); - - // check if item located - if ( arditem == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid ARD item" ) ); - return SQL_ERROR; - } - - // get the fields - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); - *pNameSizePtr = ( Word ) i; - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, - NULL ); - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); - _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); - break; - - case SQL_DESC_IRD: - _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) ); - - // fall thru - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescRec - Invalid descriptor handle" ) ); - return SQL_ERROR; - } - - return SQL_SUCCESS; -} - - -// ----------------------------------------------------------------------- -// to set multiple fields in a desc record, at one shot -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLSetDescRec ( SQLHDESC pDesc, - SQLSMALLINT pRecNum, - SQLSMALLINT pType, - SQLSMALLINT pSubType, - SQLINTEGER pLength, - SQLSMALLINT pPrecision, - SQLSMALLINT pScale, - SQLPOINTER pDataPtr, - SQLINTEGER* pDataSizePtr, - SQLINTEGER* pDataIndPtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc, - pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec Not implemented" ) ); - return SQL_ERROR; -} - - -// ----------------------------------------------------------------------- -// to copy descriptor information from one descriptor handle to another -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLCopyDesc ( SQLHDESC pSrcDescHandle, - SQLHDESC pTgtDescHandle ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLCopyDesc called" ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLCopyDesc not implemented" ) ); - return SQL_ERROR; -} - - -/////////////////////// TO GET A DESC ITEM - - -// ----------------------------------------------------------------------- -// to get a particular ARD item -// ----------------------------------------------------------------------- - -pARDItem _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum ) { - pARDItem i; - - // loop to see if binding for that col already exists - for ( i = pDesc->BindCols; i != NULL && i->ColNum != pRecNum; i = i->Next ); - - // return the ARD item - return i; -} - - -// ----------------------------------------------------------------------- -// to get a particular IPD item -// ----------------------------------------------------------------------- - -pAPDItem _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum ) { - pAPDItem i; - - // loop to see if binding for that col already exists - for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next ); - - // return the ARD item - return i; -} - - -// ----------------------------------------------------------------------- -// to get a particular IRD item, mhb -// ----------------------------------------------------------------------- - -pIRDItem _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum ) { - // check if descriptor is valid - if ( pDesc == NULL || pDesc->RowDesc == NULL ) - { return NULL; } - - return pDesc->RowDesc->columnMetas.at ( pRecNum - 1 ); -} - - -// ----------------------------------------------------------------------- -// to get a particular IPD item -// ----------------------------------------------------------------------- - -pIPDItem _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum ) { - pIPDItem i; - - // loop to see if binding for that col already exists - for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next ); - - // return the ARD item - return i; -} - - - -/////////////////////// DEFAULTS - - -// ----------------------------------------------------------------------- -// to set default values of APD header -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt ) { - // reset all - memset ( pDesc, 0, sizeof ( ODBCAPD ) ); - // set explicit defaults - pDesc->Sign = SQL_DESC_APD; - pDesc->Stmt = pStmt; - pDesc->AllocType = SQL_DESC_ALLOC_AUTO; - pDesc->RowArraySize = 1; - pDesc->BindTypeOrSize = SQL_BIND_BY_COLUMN; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of APD item -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem ) { - // reset all - memset ( pDescItem, 0, sizeof ( APDItem ) ); - // set explicit defaults - pDescItem->DataConciseType = SQL_C_DEFAULT; - pDescItem->DataVerboseType = SQL_C_DEFAULT; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of IPD header -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt ) { - // reset all - memset ( pDesc, 0, sizeof ( ODBCIPD ) ); - // set explicit defaults - pDesc->Sign = SQL_DESC_IPD; - pDesc->Stmt = pStmt; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of IPD item -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem ) { - // reset all - memset ( pDescItem, 0, sizeof ( IPDItem ) ); - // set explicit defaults - pDescItem->ParamType = SQL_PARAM_INPUT; - pDescItem->DataConciseType = SQL_DEFAULT; - pDescItem->DataVerboseType = SQL_DEFAULT; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of ARD header -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt ) { - // reset all - memset ( pDesc, 0, sizeof ( ODBCARD ) ); - // set explicit defaults - pDesc->Sign = SQL_DESC_ARD; - pDesc->Stmt = pStmt; - pDesc->AllocType = SQL_DESC_ALLOC_AUTO; - pDesc->RowArraySize = 1; - pDesc->BindTypeOrSize = SQL_BIND_BY_COLUMN; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of ARD item -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum ) { - // reset - memset ( pDescItem, 0, sizeof ( ARDItem ) ); - // set explicit defaults - pDescItem->ColNum = pRecNum; - pDescItem->DataConciseType = SQL_C_DEFAULT; - pDescItem->DataVerboseType = SQL_C_DEFAULT; - return GOOD; -} - - -// ----------------------------------------------------------------------- -// to set default values of IRD header -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt ) { - // reset all - memset ( pDesc, 0, sizeof ( ODBCIRD ) ); - // set explicit defaults - pDesc->Sign = SQL_DESC_IRD; - pDesc->Stmt = pStmt; - return GOOD; -} - -// ----------------------------------------------------------------------- -// to set default values of IRD item -// ----------------------------------------------------------------------- - -eGoodBad _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem ) { - return GOOD; -} - - -//////////////////////// GET AND SET FIELD VALUES - -/////////////////////// APD - -// ----------------------------------------------------------------------- -// to set a field value in APD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", - pDesc, pFldID, pDataPtr, pDataSize ) ); - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - invalid params" ) ); - return SQL_ERROR; - } - - switch ( pFldID ) { - case SQL_DESC_ARRAY_SIZE: - pDesc->RowArraySize = ( ULong ) pDataPtr; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; - break; - - case SQL_DESC_BIND_OFFSET_PTR: - pDesc->BindOffsetPtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_BIND_TYPE: - pDesc->BindTypeOrSize = ( Long ) pDataPtr; - break; - - case SQL_DESC_COUNT: - // ???? requires that all descriptors which r above the specified - // value are freed - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - SQL_DESC_COUNT not implemented" ) ); - return SQL_ERROR; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to set a field value in APD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLSetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, - pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); - pAPDItem item; - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been explicitly specified - if ( pDescItem == NULL ) { - // get item from APD - item = _SQLGetAPDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - // as a patch for SQL server it is temporarily ignoring the error - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDItemField - invalid item" ) ); - return SQL_SUCCESS; - /////////// actual action is as follows ///////// - //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item")); - //return SQL_ERROR; - ///////////////////////////////////////////////// - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CONCISE_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATA_PTR: - item->DataPtr = ( void* ) pDataPtr; - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, - & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - item->DateTimeIntervalPrec = ( Long ) pDataPtr; - break; - - case SQL_DESC_INDICATOR_PTR: - item->SizeIndPtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - item->DataSize = ( Long ) pDataPtr; - break; - - case SQL_DESC_NUM_PREC_RADIX: - item->NumPrecRadix = ( Long ) pDataPtr; - break; - - case SQL_DESC_OCTET_LENGTH_PTR: - item->SizePtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_PRECISION: - item->DataSize = ( Word ) pDataPtr; - break; - - case SQL_DESC_SCALE: - item->Scale = ( Word ) pDataPtr; - break; - - case SQL_DESC_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to get a field value from APD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, - pDataSize, pDataSizePtr ) ); - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetAPDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - * ( ( Word* ) pDataPtr ) = pDesc->AllocType; - break; - - case SQL_DESC_ARRAY_SIZE: - * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; - break; - - case SQL_DESC_BIND_OFFSET_PTR: - * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr; - break; - - case SQL_DESC_BIND_TYPE: - * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize; - break; - - case SQL_DESC_COUNT: - * ( ( Word* ) pDataPtr ) = pDesc->DescCount; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to get a field value from an APD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", - pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); - pAPDItem item; - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from IPD - item = _SQLGetAPDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - // as a patch fro SQL server it is temporarily ignoring the error - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLGetAPDItemField - invalid item" ) ); - return SQL_SUCCESS; - /////////// actual action is as follows ///////// - //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item")); - //return SQL_ERROR; - ///////////////////////////////////////////////// - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CONCISE_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataConciseType; - break; - - case SQL_DESC_DATA_PTR: - * ( ( Long* ) pDataPtr ) = ( Long ) ( item->DataPtr ); - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; - break; - - case SQL_DESC_INDICATOR_PTR: - * ( ( Long** ) pDataPtr ) = item->SizeIndPtr; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - * ( ( Long* ) pDataPtr ) = item->DataSize; - break; - - case SQL_DESC_NUM_PREC_RADIX: - * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; - break; - - case SQL_DESC_OCTET_LENGTH_PTR: - * ( ( Long** ) pDataPtr ) = item->SizePtr; - break; - - case SQL_DESC_PRECISION: - * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); - break; - - case SQL_DESC_SCALE: - * ( ( Word* ) pDataPtr ) = ( Word ) ( item->Scale ); - break; - - case SQL_DESC_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataVerboseType; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - - -/////////////////////// IPD - - -// ----------------------------------------------------------------------- -// to set a field value in IPD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", - pDesc, pFldID, pDataPtr, pDataSize ) ); - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - // assumes automatic alloc by driver as appl alloc - // is not allowed as of now - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; - break; - - case SQL_DESC_COUNT: - // ???? requires that all descriptors which r above the specified - // value are freed. not implemented as of now - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - SQL_DESC_COUNT not implemented" ) ); - return SQL_ERROR; - break; - - case SQL_DESC_ROWS_PROCESSED_PTR: - pDesc->RowsProcessedPtr = ( ULong* ) pDataPtr; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to set a field value in IPD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLSetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, - pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); - pIPDItem item; - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from IRD - item = _SQLGetIPDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid item" ) ); - return SQL_ERROR; - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CONCISE_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, - & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - item->DateTimeIntervalPrec = ( Long ) pDataPtr; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - item->DataSize = ( Long ) pDataPtr; - break; - - case SQL_DESC_NAME: - if ( pDataPtr && strlen ( ( Char* ) pDataPtr ) <= 32 ) - { strcpy ( item->ParamName, ( Char* ) pDataPtr ); } - - else - { item->ParamName[0] = 0; } - - case SQL_DESC_NUM_PREC_RADIX: - item->NumPrecRadix = ( Long ) pDataPtr; - break; - - case SQL_DESC_PARAMETER_TYPE: - item->ParamType = ( Word ) pDataPtr; - break; - - case SQL_DESC_PRECISION: - item->DataSize = ( Word ) pDataPtr; - break; - - case SQL_DESC_SCALE: - item->Scale = ( Word ) pDataPtr; - break; - - case SQL_DESC_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_UNNAMED: - // dummy, is related to SQL_DESC_NAME - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to get a field value from IPD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, - pDataSize, pDataSizePtr ) ); - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - * ( ( Word* ) pDataPtr ) = SQL_DESC_ALLOC_AUTO; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; - break; - - case SQL_DESC_COUNT: - * ( ( Word* ) pDataPtr ) = pDesc->DescCount; - break; - - case SQL_DESC_ROWS_PROCESSED_PTR: - * ( ( ULong** ) pDataPtr ) = pDesc->RowsProcessedPtr; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - -// ----------------------------------------------------------------------- -// to get a field value from an IPD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", - pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); - pIPDItem item; - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from IPD - item = _SQLGetIPDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid item" ) ); - return SQL_ERROR; - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CASE_SENSITIVE: - * ( ( Long* ) pDataPtr ) = SQL_FALSE; // whether a param is case-sensitive - break; - - case SQL_DESC_CONCISE_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataConciseType; - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; - break; - - case SQL_DESC_FIXED_PREC_SCALE: - * ( ( Word* ) pDataPtr ) = item->FixedPrecScale; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - * ( ( Long* ) pDataPtr ) = item->DataSize; - break; - - case SQL_DESC_TYPE_NAME: - case SQL_DESC_LOCAL_TYPE_NAME: - // ???? there is no param type string defined in IPD as of now - _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, "", -1 ); - break; - - case SQL_DESC_NAME: - _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, item->ParamName, -1 ); - break; - - case SQL_DESC_NULLABLE: - * ( ( Word* ) pDataPtr ) = item->Nullable; - break; - - case SQL_DESC_NUM_PREC_RADIX: - * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; - break; - - case SQL_DESC_PARAMETER_TYPE: - * ( ( Word* ) pDataPtr ) = item->ParamType; - break; - - case SQL_DESC_PRECISION: - * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); - break; - - case SQL_DESC_ROWVER: - * ( ( Word* ) pDataPtr ) = SQL_FALSE; // assumes that all cols r not auto-updating - break; - - case SQL_DESC_SCALE: - * ( ( Word* ) pDataPtr ) = item->Scale; - break; - - case SQL_DESC_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataVerboseType; - break; - - case SQL_DESC_UNNAMED: - * ( ( Word* ) pDataPtr ) = SQL_NAMED; - break; - - case SQL_DESC_UNSIGNED: - * ( ( Word* ) pDataPtr ) = SQL_FALSE; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - - - -/////////////////////// ARD - -// ----------------------------------------------------------------------- -// to set a field value in ARD header -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", - pDesc, pFldID, pDataPtr, pDataSize ) ); - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ARRAY_SIZE: - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD RowArraySize is set to %d", ( ULong ) pDataPtr ) ); - pDesc->RowArraySize = ( ULong ) pDataPtr; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; - break; - - case SQL_DESC_BIND_OFFSET_PTR: - pDesc->BindOffsetPtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_BIND_TYPE: - pDesc->BindTypeOrSize = ( Long ) pDataPtr; - break; - - case SQL_DESC_COUNT: - // ???? requires that all descriptors which r above the specified - // value are freed - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - SQL_DESC_COUNT not implemented" ) ); - return SQL_ERROR; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - -// ----------------------------------------------------------------------- -// to set a field value in ARD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID, - const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLSetARDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, - pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); - pARDItem item; - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from ARD - item = _SQLGetARDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid item" ) ); - return SQL_ERROR; - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CONCISE_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATA_PTR: - item->DataPtr = ( void* ) pDataPtr; - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, - & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - item->DateTimeIntervalPrec = ( Long ) pDataPtr; - break; - - case SQL_DESC_INDICATOR_PTR: - item->SizeIndPtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - item->DataSize = ( Long ) pDataPtr; - break; - - case SQL_DESC_NUM_PREC_RADIX: - item->NumPrecRadix = ( Long ) pDataPtr; - break; - - case SQL_DESC_OCTET_LENGTH_PTR: // 1004 - item->SizePtr = ( Long* ) pDataPtr; - break; - - case SQL_DESC_PRECISION: - item->DataSize = ( Word ) pDataPtr; // bytes required for numeric type - break; - - case SQL_DESC_SCALE: - item->Scale = ( Word ) pDataPtr; - break; - - case SQL_DESC_TYPE: - _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), - & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - -// ----------------------------------------------------------------------- -// to get a field value from ARD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, - pDataSize, pDataSizePtr ) ); - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - * ( ( Word* ) pDataPtr ) = pDesc->AllocType; - break; - - case SQL_DESC_ARRAY_SIZE: - * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; - break; - - case SQL_DESC_BIND_OFFSET_PTR: - * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr; - break; - - case SQL_DESC_BIND_TYPE: - * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize; - break; - - case SQL_DESC_COUNT: - * ( ( Word* ) pDataPtr ) = pDesc->DescCount; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - -// ----------------------------------------------------------------------- -// to get a field value from an ARD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", - pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); - pARDItem item; - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from ARD - item = _SQLGetARDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - invalid item" ) ); - return SQL_ERROR; - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_CONCISE_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataConciseType; - break; - - case SQL_DESC_DATA_PTR: - * ( ( Long* ) pDataPtr ) = ( Long ) ( item->DataPtr ); - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE: - * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION: - * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; - break; - - case SQL_DESC_INDICATOR_PTR: - * ( ( Long** ) pDataPtr ) = item->SizeIndPtr; - break; - - case SQL_DESC_LENGTH: - case SQL_DESC_OCTET_LENGTH: - * ( ( Long* ) pDataPtr ) = item->DataSize; - break; - - case SQL_DESC_NUM_PREC_RADIX: - * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; - break; - - case SQL_DESC_OCTET_LENGTH_PTR: - * ( ( Long** ) pDataPtr ) = item->SizePtr; - break; - - case SQL_DESC_PRECISION: - * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); - break; - - case SQL_DESC_SCALE: - * ( ( Word* ) pDataPtr ) = ( Word ) ( item->Scale ); - break; - - case SQL_DESC_TYPE: - * ( ( Word* ) pDataPtr ) = item->DataVerboseType; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - - - -/////////////////////// IRD - - -// ----------------------------------------------------------------------- -// to set a field value in IRD item -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetIRDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", - pDesc, pFldID, pDataPtr, pDataSize ) ); - - // precaution - if ( pDesc == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIRDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ARRAY_STATUS_PTR: - pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; - break; - - case SQL_DESC_ROWS_PROCESSED_PTR: - pDesc->RowsProcessedPtr = ( ULong* ) pDataPtr; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIRDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -/********** - // ----------------------------------------------------------------------- - // to set a field value in IRD item - // ----------------------------------------------------------------------- - - RETCODE SQL_API _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID, const void* pDataPtr, Long pDataSize ) - { - __ODBCPOPMSG(_ODBCPopMsg("_SQLSetIRDItemField - unknown field (%d)", pFldID)); - - return SQL_SUCCESS; - } -**********/ - -// ----------------------------------------------------------------------- -// to get a field value from IRD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, - Long* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetIRDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, - pDataSize, pDataSizePtr ) ); - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDField - invalid params" ) ); - return SQL_ERROR; - } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_ALLOC_TYPE: - * ( ( Word* ) pDataPtr ) = SQL_DESC_ALLOC_AUTO; - break; - - case SQL_DESC_ARRAY_STATUS_PTR: - * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; - break; - - case SQL_DESC_COUNT: - * ( ( Word* ) pDataPtr ) = pDesc->DescCount; - break; - - case SQL_DESC_ROWS_PROCESSED_PTR: - * ( ( ULong** ) pDataPtr ) = pDesc->RowsProcessedPtr; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - return SQL_SUCCESS; -} - -static bool isApproximateNumerical ( int type ) { - //According to this article: - //Data Types in SQL Statements - //http://developer.mimer.com/documentation/Mimer_SQL_Reference_Manual/Syntax_Rules4.html - if ( type == ( int ) ODBCTypes::ODBC_Float || - type == ( int ) ODBCTypes::ODBC_Real || - type == ( int ) ODBCTypes::ODBC_Double ) { - return true; - } - - return false; -} - - -// ----------------------------------------------------------------------- -// to get a field value from an IRD item, mhb -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum, - Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr, bool isANSI ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "_SQLGetIRDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d, isANSI: %d", - pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ) ); - CStrPtr s; - pIRDItem item; - - // precaution - if ( pDesc == NULL || pDataPtr == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - invalid params" ) ); - return SQL_ERROR; - } - - // check if item has not been specified directly - if ( pDescItem == NULL ) { - // get item from IRD - item = _SQLGetIRDItem ( pDesc, pRecNum ); - - // check if item located - if ( item == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - invalid item" ) ); - return SQL_ERROR; - } - } - - else - { item = pDescItem; } - - // as per required field - switch ( pFldID ) { - case SQL_DESC_AUTO_UNIQUE_VALUE: - * ( ( Long* ) pDataPtr ) = pDescItem->isAutoIncrement; // whether a col is auto-incrementing - break; - - case SQL_DESC_NAME://1011 - case SQL_DESC_LABEL://18 - case SQL_DESC_BASE_COLUMN_NAME://22 - s = pDescItem->name.c_str(); - - // transfer col name - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } - - break; - - case SQL_DESC_BASE_TABLE_NAME://23 - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, pDescItem->tableName.c_str(), -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, pDescItem->tableName.c_str(), -1 ); } - - break; - - case SQL_DESC_CASE_SENSITIVE://12 - * ( ( Long* ) pDataPtr ) = pDescItem->isCaseSensitive; // whether a col is case-sensitive - break; - - case SQL_DESC_CATALOG_NAME://17 - s = pDescItem->catelogName.c_str(); - - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, s, -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, s, -1 ); } - - break; - - case SQL_DESC_TYPE://1002 - case SQL_DESC_CONCISE_TYPE://2 - * ( ( Long* ) pDataPtr ) = pDescItem->columnType; - break; - - case SQL_DESC_DATETIME_INTERVAL_CODE://1007 - * ( ( Word* ) pDataPtr ) = 0; - break; - - case SQL_DESC_DATETIME_INTERVAL_PRECISION://26 - * ( ( Long* ) pDataPtr ) = 0; - break; - - case SQL_COLUMN_LENGTH://3 - case SQL_DESC_LENGTH://1003 - case SQL_DESC_DISPLAY_SIZE://6 - if ( isANSI ) - { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize; } - - else - { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize * 2; } - - break; - - case SQL_DESC_OCTET_LENGTH://1013 - if ( isANSI ) - { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize; } - - else - { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize * 2; } - - break; - - case SQL_DESC_FIXED_PREC_SCALE://9 - - //SQL_TRUE if the column has a fixed precision and nonzero scale that are data source�Cspecific. - //SQL_FALSE if the column does not have a fixed precision and nonzero scale that are data source�Cspecific. - if ( isApproximateNumerical ( pDescItem->columnType ) ) { - * ( ( Long* ) pDataPtr ) = SQL_FALSE; - } - - else { - * ( ( Long* ) pDataPtr ) = SQL_TRUE; - } - - break; - - case SQL_DESC_LITERAL_PREFIX://27 - case SQL_DESC_LITERAL_SUFFIX://28 - - // assumes prefix and suffix to be single quote - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "\"", -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "\"", -1 ); } - - break; - - case SQL_DESC_TYPE_NAME://14 - case SQL_DESC_LOCAL_TYPE_NAME://29 - s = pDescItem->columnTypeName.c_str(); - - // trasnfer col type name - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - break; - - case SQL_DESC_NULLABLE://1008 - if ( pDescItem->isNullable == 1 ) { - * ( ( Word* ) pDataPtr ) = SQL_NULLABLE; - break; - } - - else if ( pDescItem->isNullable == 0 ) { - * ( ( Word* ) pDataPtr ) = SQL_NO_NULLS; - break; - } - - // fall thru - * ( ( Word* ) pDataPtr ) = SQL_NULLABLE_UNKNOWN; - break; - - case SQL_DESC_NUM_PREC_RADIX://32 - - //If the data type in the SQL_DESC_TYPE field is an approximate numeric data type, - //this SQLINTEGER field contains a value of 2 because the SQL_DESC_PRECISION field contains the number of bits. - //If the data type in the SQL_DESC_TYPE field is an exact numeric data type, - //this field contains a value of 10 because the SQL_DESC_PRECISION field contains the number of decimal digits. - //This field is set to 0 for all non-numeric data types. - if ( isApproximateNumerical ( pDescItem->columnType ) ) { - * ( ( Long* ) pDataPtr ) = 2; - } - - else { - * ( ( Long* ) pDataPtr ) = 10; - } - - break; - - case SQL_COLUMN_PRECISION: //4 - case SQL_DESC_PRECISION: //1005 - * ( ( Long* ) pDataPtr ) = pDescItem->precision; - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "precision is returned as %i ", * ( ( Word* ) pDataPtr ) ) ); - break; - - case SQL_DESC_ROWVER://35 - // assumes that all cols r not auto-updating like TIMESTAMP - * ( ( Word* ) pDataPtr ) = SQL_FALSE; - break; - - case SQL_COLUMN_SCALE: //5 - case SQL_DESC_SCALE://1006 - * ( ( Long* ) pDataPtr ) = pDescItem->scale; - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "scale is returned as %i ", * ( ( Word* ) pDataPtr ) ) ); - break; - - case SQL_DESC_SCHEMA_NAME://16 - s = pDescItem->schemaName.c_str(); - - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - break; - - case SQL_DESC_SEARCHABLE://13 - * ( ( Long* ) pDataPtr ) = SQL_PRED_SEARCHABLE; - break; - - case SQL_DESC_TABLE_NAME://15 - s = pDescItem->tableName.c_str(); - - if ( isANSI ) - { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - else - { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } - - break; - - case SQL_DESC_UNNAMED://1012 - * ( ( Long* ) pDataPtr ) = SQL_NAMED; - break; - - case SQL_DESC_UNSIGNED://8 - * ( ( Long* ) pDataPtr ) = !pDescItem->isSigned; - break; - - case SQL_DESC_UPDATABLE://10 - * ( ( Long* ) pDataPtr ) = SQL_ATTR_READONLY; - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - unknown field (%d)", pFldID ) ); - return SQL_ERROR; - break; - } - - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "get item returned" ) ); - return SQL_SUCCESS; -} - - -///////////////////// FREE - -// ----------------------------------------------------------------------- -// to free/release the content of APD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFreeAPDContent ( pODBCAPD pDesc ) { - // since params have not been implemented - // it assumes that no params have been allocated - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to free/release the content of IPD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFreeIPDContent ( pODBCIPD pDesc ) { - // since params have not been implemented - // it assumes that no params have been allocated - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to free/release the content of ARD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFreeARDContent ( pODBCARD pDesc ) { - pARDItem ardcol; // application row descriptor item - - // check if there r any bound cols in ARD - if ( pDesc->BindCols ) { - // loop to free all the bound cols - while ( pDesc->BindCols ) { - // get the first ard-col - ardcol = pDesc->BindCols; - // detach it from ARD link list - _SQLDetachARDItem ( pDesc, ardcol ); - // free - delete ardcol; - } - } - - // reset the highest descriptor count - pDesc->DescCount = 0; - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to free/release the content of IRD -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFreeIRDContent ( pODBCIRD pDesc ) { - pDesc->DescCount = 0; - - if ( pDesc->RowDesc ) { - pDesc->RowDesc = NULL; - } - - return SQL_SUCCESS; -} - - -////////////////////// ATTACH/DETACH - -// ----------------------------------------------------------------------- -// to attach a new item to ARD link list -// ----------------------------------------------------------------------- - -eGoodBad _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem ) { - // note - // this function also helps in maintaining highest desc number - pARDItem l; - - // precaution - if ( pDesc == NULL || pDescItem == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLAttachARDItem - invalid params" ) ); - return BAD; - } - - // check if this is the first item - if ( pDesc->BindCols == NULL ) { - // set as first and only item - pDesc->BindCols = pDescItem; - pDescItem->Prev = NULL; - pDescItem->Next = NULL; - return GOOD; - } - - // move to tail item - for ( l = pDesc->BindCols; l->Next != NULL; l = l->Next ); - - // attach to tail - l->Next = pDescItem; - pDescItem->Prev = l; - pDescItem->Next = NULL; - - // maintain highest desc number - if ( pDesc->DescCount < pDescItem->ColNum ) - { pDesc->DescCount = pDescItem->ColNum; } - - return GOOD; -} - -// ----------------------------------------------------------------------- -// to detach an existing item from ARD link-list -// ----------------------------------------------------------------------- - -eGoodBad _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem ) { - // note - // this function also helps in maintaining highest desc number - - // precaution - if ( pDesc == NULL || pDescItem == NULL ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLDetachARDItem - invalid params" ) ); - return BAD; - } - - if ( pDescItem->Prev ) - { ( pDescItem->Prev )->Next = pDescItem->Next; } // attach prev to next - - else - { pDesc->BindCols = pDescItem->Next; } // set head to next if any - - if ( pDescItem->Next ) - { ( pDescItem->Next )->Prev = pDescItem->Prev; } // set next to prev if any - - // maintain highest desc number - if ( pDesc->DescCount == pDescItem->ColNum ) { - Word i; - pARDItem p; - - // loop to find the highest number and set that - for ( i = 0, p = pDesc->BindCols; p != NULL; p = p->Next ) - if ( p->ColNum > i ) - { i = p->ColNum; } - - // set the highest count to this column - pDesc->DescCount = i; - } - - return GOOD; -} - -//////////////////// UTILITY functions - -// ----------------------------------------------------------------------- -// to get converted col descriptor information -// ----------------------------------------------------------------------- - -eGoodBad GetIRDColDescInfo ( SelectedColumnMeta* pColDesc, Word* pDataType, Word* pPrecision, Word* pScale, - Long* pLength ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "GetIRDColDescInfo called" ) ); - - // precaution - if ( !pColDesc ) - { return BAD; } - - // caller safe - if ( pDataType ) { *pDataType = 0; } - - if ( pPrecision ) { *pPrecision = 0; } - - if ( pScale ) { *pScale = 0; } - - if ( pLength ) { *pLength = 0; } - - if ( pDataType ) { *pDataType = pColDesc->columnType; } - - if ( pPrecision ) { *pPrecision = pColDesc->precision; } - - if ( pScale ) { *pScale = pColDesc->scale; } - - if ( pLength ) { *pLength = pColDesc->displaySize; } - - return GOOD; -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + +// ---------------------------------------------------------------------------- +// +// File: KO_DESC.CPP +// +// Purpose: Contains descriptor functions. +// As explained in the article, descriptors r the heart +// as far as driver design is concerned. Descriptors +// r essntially data structures to encapsulate one type of +// data. Say results from server. Say col specification from +// application and so. All the four descriptors (ARD,IRD,APD,IPD) +// r encapsulated inside the statement structure. +// +// The local functions provided for each descriptor include +// 1. maintaining the link list _SQLAttachXXXItem/_SQLDetachXXXItem +// 2. getting an desc item from link list _SQLGetXXXItem +// 3. setting default values in desc header/item _SQLSetXXXFieldsDefault/_SQLSetXXXItemFieldsDefault +// 4. setting values in desc header/item _SQLSetXXXField/_SQLSetXXXItemField +// 5. getting values from desc header/item _SQLGetXXXField/_SQLGetXXXItemField +// where XXX is the descriptor type ARD,IRD,APD,IPD +// +// These functions are used internally by most functions +// like SQLBindCol, SQLColAttribiute and so on to maintain +// info in the descriptor structures. +// +// The exposed functions allow the client to directly +// manipulate the descriptor values, and these functions +// also use these local functions only. +// But use of the exposed descriptor function is not very +// common in the ODBC parlance. +// +// Exported functions: +// SQLGetDescField +// SQLSetDescField +// SQLGetDescRec +// SQLSetDescRec +// SQLCopyDesc +// +// ---------------------------------------------------------------------------- +#include "stdafx.h" + + +// ------------------------ local functions ----------------------------------- +pAPDItem _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum ); +pIPDItem _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum ); +pARDItem _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum ); +pIRDItem _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum ); + +eGoodBad _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt ); +eGoodBad _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem ); + +eGoodBad _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt ); +eGoodBad _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem ); + +eGoodBad _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt ); +eGoodBad _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum ); + +eGoodBad _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt ); +eGoodBad _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem ); + +RETCODE SQL_API _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ); +RETCODE SQL_API _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); + +RETCODE SQL_API _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ); +RETCODE SQL_API _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); + +RETCODE SQL_API _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ); +RETCODE SQL_API _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ); + +RETCODE SQL_API _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ); +RETCODE SQL_API _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ); +RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr , bool isANSI ); + +RETCODE SQL_API _SQLFreeAPDContent ( const pODBCAPD pDesc ); +RETCODE SQL_API _SQLFreeIPDContent ( const pODBCIPD pDesc ); +RETCODE SQL_API _SQLFreeARDContent ( const pODBCARD pDesc ); +RETCODE SQL_API _SQLFreeIRDContent ( const pODBCIRD pDesc ); + +eGoodBad _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem ); +eGoodBad _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem ); + + +// ----------------------------------------------------------------------- +// to get value of specified descriptor field +// ----------------------------------------------------------------------- + +RETCODE _SQLGetDescField_basic ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize, + SQLINTEGER* pDataSizePtr, + bool isANSI ) { + bool invalidfld; + bool headerfld; + Word desctype; + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - invalid params" ) ); + return SQL_ERROR; + } + + // initializations + invalidfld = FALSE; + headerfld = TRUE; + desctype = _DESCTYPE ( pDesc ); + + // check if descriptor is valid & reset diags + switch ( desctype ) { + case SQL_DESC_APD: + _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) ); + break; + + case SQL_DESC_IPD: + _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) ); + break; + + case SQL_DESC_ARD: + _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) ); + break; + + case SQL_DESC_IRD: + _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) ); + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid descriptor handle" ) ); + return SQL_ERROR; + } + + // HEADER FIELDS + + // check the field type - header field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + + /***** + SQLSMALLINT + ARD: R APD: R IRD: R IPD: R + ARD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER + APD: SQL_DESC_ALLOC_AUTO/SQL_DESC_ALLOC_USER + IRD: SQL_DESC_ALLOC_AUTO + IPD: SQL_DESC_ALLOC_AUTO + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + } + + break; + + case SQL_DESC_ARRAY_SIZE: + + /********* + SQLUINTEGER + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD:[1] APD:[1] IRD: Unused IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + + /********** + SQLUSMALLINT* + ARD: R/W APD: R/W IRD: R/W IPD: R/W + ARD: Null ptr APD: Null ptr IRD: Null ptr IPD: Null ptr + **********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + } + + break; + + case SQL_DESC_BIND_OFFSET_PTR: + + /********** + SQLINTEGER* + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused + **********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_BIND_TYPE: + + /********** + SQLINTEGER + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD: SQL_BIND_BY_COLUMN + APD: SQL_BIND_BY_COLUMN IRD: Unused IPD: Unused + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_COUNT: + + /********** + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: 0 APD: 0 IRD: D IPD: 0 + **********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDField ( ( pODBCAPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDField ( ( pODBCARD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + } + + break; + + case SQL_DESC_ROWS_PROCESSED_PTR: + + /********** + SQLUINTEGER* + ARD: Unused APD: Unused IRD: R/W IPD: R/W + ARD: Unused APD: Unused IRD: Null ptr IPD: Null ptr + ***********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDField ( ( pODBCIPD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDField ( ( pODBCIRD ) pDesc, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + default: + headerfld = FALSE; + } + + // check if not an header field + if ( headerfld == TRUE ) + { return SQL_SUCCESS; } + + // check if invalid field + if ( invalidfld == TRUE ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) ); + return SQL_ERROR; + } + + // check the field type - record field + switch ( pFldID ) { + case SQL_DESC_AUTO_UNIQUE_VALUE: + + /*********** + SQLINTEGER + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + *********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_BASE_COLUMN_NAME: + + /********** + SQLCHAR * + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + **********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_BASE_TABLE_NAME: + + /******** + SQLCHAR * + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + *******/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_CASE_SENSITIVE: + + /********** + SQLINTEGER + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: D IPD: D + *******/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_CATALOG_NAME: + + /********** + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_CONCISE_TYPE: + + /********** + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_DATA_PTR: + + /*********** + SQLPOINTER + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused + ************/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + + /********** + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + + /********* + SQLINTEGER + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + **********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_DISPLAY_SIZE: + + /********* + SQLINTEGER + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + **********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_FIXED_PREC_SCALE: + + /********* + SQLSMALLINT + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: D IPD: D[1] + *********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_INDICATOR_PTR: + + /********** + SQLINTEGER * + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_LABEL: + + /********* + SQLCHAR * + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + ***********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_LENGTH: + + /******** + SQLUINTEGER + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + } + + break; + + case SQL_DESC_LITERAL_PREFIX: + + /********** + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + **********/ + + // a read-only IRD field + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_LITERAL_SUFFIX: + + /********** + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + **********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_LOCAL_TYPE_NAME: + + /*********** + SQLCHAR * + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: D IPD: D + ***********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_NAME: + + /*********** + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + *********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_NULLABLE: + + /********** + SQLSMALLINT + ARD: Unused APD: Unused IRD: R IPD: R + ARD: ND APD: ND IRD: D IPD: ND + ***********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_NUM_PREC_RADIX: + + /********* + SQLINTEGER + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_OCTET_LENGTH: + + /********** + SQLINTEGER + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_OCTET_LENGTH_PTR: + + /****** + SQLINTEGER* + ARD: R/W APD: R/W IRD: Unused IPD: Unused + ARD: Null ptr APD: Null ptr IRD: Unused IPD: Unused + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_PARAMETER_TYPE: + + /********* + SQLSMALLINT + ARD: Unused APD: Unused IRD: Unused IPD: R/W + ARD: Unused APD: Unused IRD: Unused IPD: D=SQL_PARAM_INPUT + *********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_PRECISION: + + /********* + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_ROWVER: + + /********* + SQLSMALLINT + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: ND IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_SCALE: + + /******** + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_SCHEMA_NAME: + + /********* + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_SEARCHABLE: + + /********* + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_TABLE_NAME: + + /******** + SQLCHAR* + ARD: Unused APD: Unused IRD: R IPD: Unused + ARD: Unused APD: Unused IRD: D IPD: Unused + ********/ + switch ( desctype ) { + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_TYPE: + + /********* + SQLSMALLINT + ARD: R/W APD: R/W IRD: R IPD: R/W + ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND + *********/ + switch ( desctype ) { + case SQL_DESC_APD: + return _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_ARD: + return _SQLGetARDItemField ( ( pODBCARD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + } + + break; + + case SQL_DESC_TYPE_NAME: + + /********* + SQLCHAR * + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: D IPD: D + **********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_UNNAMED: + + /******** + SQLSMALLINT + ARD: Unused APD: Unused IRD: R IPD: R/W + ARD: ND APD: ND IRD: D IPD: ND + ********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + case SQL_DESC_UNSIGNED: + + /********* + SQLSMALLINT + ARD: Unused APD: Unused IRD: R IPD: R + ARD: Unused APD: Unused IRD: D IPD: D + ********/ + switch ( desctype ) { + case SQL_DESC_IPD: + return _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ); + + case SQL_DESC_IRD: + return _SQLGetIRDItemField ( ( pODBCIRD ) pDesc, NULL, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ); + + default: + invalidfld = TRUE; + } + + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Unknown field %d", pFldID ) ); + return SQL_ERROR; + } + + // check if invalid field + if ( invalidfld == TRUE ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescField - Invalid field %d for descriptor %d", pFldID, desctype ) ); + return SQL_ERROR; + } + + return SQL_SUCCESS; +} + + +RETCODE SQL_API SQLGetDescFieldW ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize, + SQLINTEGER* pDataSizePtr ) + +{ + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLGetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, + ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); + return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, false ); +} + +RETCODE SQL_API SQLGetDescField ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize, + SQLINTEGER* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLGetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, + ( pDesc ) ? * ( ( short* ) pDesc ) : 0, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); + return _SQLGetDescField_basic ( pDesc, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, true ); +} + +// ----------------------------------------------------------------------- +// to set a single field in a desc record +// ----------------------------------------------------------------------- +RETCODE SQL_API SQLSetDescFieldW ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLSetDescFieldW called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, + ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescFieldW Not implemented" ) ); + return SQL_ERROR; +} + +RETCODE SQL_API SQLSetDescField ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLSetDescField called, Desc: %d, Type: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, + ( pDesc ) ? * ( ( short* ) pDesc ) : ( short ) pDesc, pRecNum, pFldID, pDataPtr, pDataSize ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescField Not implemented" ) ); + return SQL_ERROR; +} + + +// ----------------------------------------------------------------------- +// to get multiple fields from a desc record, at one shot +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLGetDescRec ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLCHAR* pName, + SQLSMALLINT pNameSize, + SQLSMALLINT* pNameSizePtr, + SQLSMALLINT* pTypePtr, + SQLSMALLINT* pSubTypePtr, + SQLINTEGER* pLengthPtr, + SQLSMALLINT* pPrecisionPtr, + SQLSMALLINT* pScalePtr, + SQLSMALLINT* pNullablePtr ) + +{ + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc, + pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) ); + Word desctype; + Long i; + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec - invalid params" ) ); + return SQL_ERROR; + } + + // initializations + desctype = _DESCTYPE ( pDesc ); + + switch ( desctype ) { + case SQL_DESC_APD: + pAPDItem apditem; + _SQLFreeDiag ( & ( ( ( pODBCAPD ) pDesc )->Stmt->Diag ) ); + // get item from APD + apditem = _SQLGetAPDItem ( ( pODBCAPD ) pDesc, pRecNum ); + + // check if item located + if ( apditem == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid APD item" ) ); + return SQL_ERROR; + } + + // get the fields + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); + *pNameSizePtr = ( Word ) i; + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, + NULL ); + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); + _SQLGetAPDItemField ( ( pODBCAPD ) pDesc, apditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); + break; + + case SQL_DESC_IPD: + pIPDItem ipditem; + _SQLFreeDiag ( & ( ( ( pODBCIPD ) pDesc )->Stmt->Diag ) ); + // get item from IPD + ipditem = _SQLGetIPDItem ( ( pODBCIPD ) pDesc, pRecNum ); + + // check if item located + if ( ipditem == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid IPD item" ) ); + return SQL_ERROR; + } + + // set the fields + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); + *pNameSizePtr = ( Word ) i; + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, + NULL ); + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); + _SQLGetIPDItemField ( ( pODBCIPD ) pDesc, ipditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); + break; + + case SQL_DESC_ARD: + pARDItem arditem; + _SQLFreeDiag ( & ( ( ( pODBCARD ) pDesc )->Stmt->Diag ) ); + // get item from ARD + arditem = _SQLGetARDItem ( ( pODBCARD ) pDesc, pRecNum ); + + // check if item located + if ( arditem == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetDescRec - invalid ARD item" ) ); + return SQL_ERROR; + } + + // get the fields + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NAME, pName, pNameSize, &i ); + *pNameSizePtr = ( Word ) i; + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_TYPE, pTypePtr, -1, NULL ); + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_DATETIME_INTERVAL_CODE , pSubTypePtr, -1, + NULL ); + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_OCTET_LENGTH, pLengthPtr, -1, NULL ); + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_PRECISION, pPrecisionPtr, -1, NULL ); + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_SCALE, pScalePtr, -1, NULL ); + _SQLGetARDItemField ( ( pODBCARD ) pDesc, arditem, pRecNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL ); + break; + + case SQL_DESC_IRD: + _SQLFreeDiag ( & ( ( ( pODBCIRD ) pDesc )->Stmt->Diag ) ); + + // fall thru + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetDescRec - Invalid descriptor handle" ) ); + return SQL_ERROR; + } + + return SQL_SUCCESS; +} + + +// ----------------------------------------------------------------------- +// to set multiple fields in a desc record, at one shot +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLSetDescRec ( SQLHDESC pDesc, + SQLSMALLINT pRecNum, + SQLSMALLINT pType, + SQLSMALLINT pSubType, + SQLINTEGER pLength, + SQLSMALLINT pPrecision, + SQLSMALLINT pScale, + SQLPOINTER pDataPtr, + SQLINTEGER* pDataSizePtr, + SQLINTEGER* pDataIndPtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetDescRec called Desc: %d, DescType: %d, RecNum: %d", pDesc, + pDesc ? * ( ( short* ) pDesc ) : 0, pRecNum ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetDescRec Not implemented" ) ); + return SQL_ERROR; +} + + +// ----------------------------------------------------------------------- +// to copy descriptor information from one descriptor handle to another +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLCopyDesc ( SQLHDESC pSrcDescHandle, + SQLHDESC pTgtDescHandle ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLCopyDesc called" ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLCopyDesc not implemented" ) ); + return SQL_ERROR; +} + + +/////////////////////// TO GET A DESC ITEM + + +// ----------------------------------------------------------------------- +// to get a particular ARD item +// ----------------------------------------------------------------------- + +pARDItem _SQLGetARDItem ( const pODBCARD pDesc, Word pRecNum ) { + pARDItem i; + + // loop to see if binding for that col already exists + for ( i = pDesc->BindCols; i != NULL && i->ColNum != pRecNum; i = i->Next ); + + // return the ARD item + return i; +} + + +// ----------------------------------------------------------------------- +// to get a particular IPD item +// ----------------------------------------------------------------------- + +pAPDItem _SQLGetAPDItem ( const pODBCAPD pDesc, Word pRecNum ) { + pAPDItem i; + + // loop to see if binding for that col already exists + for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next ); + + // return the ARD item + return i; +} + + +// ----------------------------------------------------------------------- +// to get a particular IRD item, mhb +// ----------------------------------------------------------------------- + +pIRDItem _SQLGetIRDItem ( const pODBCIRD pDesc, Word pRecNum ) { + // check if descriptor is valid + if ( pDesc == NULL || pDesc->RowDesc == NULL ) + { return NULL; } + + return pDesc->RowDesc->columnMetas.at ( pRecNum - 1 ); +} + + +// ----------------------------------------------------------------------- +// to get a particular IPD item +// ----------------------------------------------------------------------- + +pIPDItem _SQLGetIPDItem ( const pODBCIPD pDesc, Word pRecNum ) { + pIPDItem i; + + // loop to see if binding for that col already exists + for ( i = pDesc->BindParams; i != NULL && i->ParamNum != pRecNum; i = i->Next ); + + // return the ARD item + return i; +} + + + +/////////////////////// DEFAULTS + + +// ----------------------------------------------------------------------- +// to set default values of APD header +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetAPDFieldsDefault ( pODBCAPD pDesc, const pODBCStmt pStmt ) { + // reset all + memset ( pDesc, 0, sizeof ( ODBCAPD ) ); + // set explicit defaults + pDesc->Sign = SQL_DESC_APD; + pDesc->Stmt = pStmt; + pDesc->AllocType = SQL_DESC_ALLOC_AUTO; + pDesc->RowArraySize = 1; + pDesc->BindTypeOrSize = SQL_BIND_BY_COLUMN; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of APD item +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetAPDItemFieldsDefault ( pAPDItem pDescItem ) { + // reset all + memset ( pDescItem, 0, sizeof ( APDItem ) ); + // set explicit defaults + pDescItem->DataConciseType = SQL_C_DEFAULT; + pDescItem->DataVerboseType = SQL_C_DEFAULT; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of IPD header +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetIPDFieldsDefault ( pODBCIPD pDesc, const pODBCStmt pStmt ) { + // reset all + memset ( pDesc, 0, sizeof ( ODBCIPD ) ); + // set explicit defaults + pDesc->Sign = SQL_DESC_IPD; + pDesc->Stmt = pStmt; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of IPD item +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetIPDItemFieldsDefault ( pIPDItem pDescItem ) { + // reset all + memset ( pDescItem, 0, sizeof ( IPDItem ) ); + // set explicit defaults + pDescItem->ParamType = SQL_PARAM_INPUT; + pDescItem->DataConciseType = SQL_DEFAULT; + pDescItem->DataVerboseType = SQL_DEFAULT; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of ARD header +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetARDFieldsDefault ( pODBCARD pDesc, const pODBCStmt pStmt ) { + // reset all + memset ( pDesc, 0, sizeof ( ODBCARD ) ); + // set explicit defaults + pDesc->Sign = SQL_DESC_ARD; + pDesc->Stmt = pStmt; + pDesc->AllocType = SQL_DESC_ALLOC_AUTO; + pDesc->RowArraySize = 1; + pDesc->BindTypeOrSize = SQL_BIND_BY_COLUMN; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of ARD item +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetARDItemFieldsDefault ( pARDItem pDescItem, Word pRecNum ) { + // reset + memset ( pDescItem, 0, sizeof ( ARDItem ) ); + // set explicit defaults + pDescItem->ColNum = pRecNum; + pDescItem->DataConciseType = SQL_C_DEFAULT; + pDescItem->DataVerboseType = SQL_C_DEFAULT; + return GOOD; +} + + +// ----------------------------------------------------------------------- +// to set default values of IRD header +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetIRDFieldsDefault ( pODBCIRD pDesc, const pODBCStmt pStmt ) { + // reset all + memset ( pDesc, 0, sizeof ( ODBCIRD ) ); + // set explicit defaults + pDesc->Sign = SQL_DESC_IRD; + pDesc->Stmt = pStmt; + return GOOD; +} + +// ----------------------------------------------------------------------- +// to set default values of IRD item +// ----------------------------------------------------------------------- + +eGoodBad _SQLSetIRDItemFieldsDefault ( pIRDItem pDescItem ) { + return GOOD; +} + + +//////////////////////// GET AND SET FIELD VALUES + +/////////////////////// APD + +// ----------------------------------------------------------------------- +// to set a field value in APD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetAPDField ( pODBCAPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", + pDesc, pFldID, pDataPtr, pDataSize ) ); + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - invalid params" ) ); + return SQL_ERROR; + } + + switch ( pFldID ) { + case SQL_DESC_ARRAY_SIZE: + pDesc->RowArraySize = ( ULong ) pDataPtr; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; + break; + + case SQL_DESC_BIND_OFFSET_PTR: + pDesc->BindOffsetPtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_BIND_TYPE: + pDesc->BindTypeOrSize = ( Long ) pDataPtr; + break; + + case SQL_DESC_COUNT: + // ???? requires that all descriptors which r above the specified + // value are freed + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - SQL_DESC_COUNT not implemented" ) ); + return SQL_ERROR; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to set a field value in APD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetAPDItemField ( pODBCAPD pDesc, pAPDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLSetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, + pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); + pAPDItem item; + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been explicitly specified + if ( pDescItem == NULL ) { + // get item from APD + item = _SQLGetAPDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + // as a patch for SQL server it is temporarily ignoring the error + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetAPDItemField - invalid item" ) ); + return SQL_SUCCESS; + /////////// actual action is as follows ///////// + //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item")); + //return SQL_ERROR; + ///////////////////////////////////////////////// + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CONCISE_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATA_PTR: + item->DataPtr = ( void* ) pDataPtr; + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, + & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + item->DateTimeIntervalPrec = ( Long ) pDataPtr; + break; + + case SQL_DESC_INDICATOR_PTR: + item->SizeIndPtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + item->DataSize = ( Long ) pDataPtr; + break; + + case SQL_DESC_NUM_PREC_RADIX: + item->NumPrecRadix = ( Long ) pDataPtr; + break; + + case SQL_DESC_OCTET_LENGTH_PTR: + item->SizePtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_PRECISION: + item->DataSize = ( Word ) pDataPtr; + break; + + case SQL_DESC_SCALE: + item->Scale = ( Word ) pDataPtr; + break; + + case SQL_DESC_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetAPDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to get a field value from APD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetAPDField ( const pODBCAPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetAPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, + pDataSize, pDataSizePtr ) ); + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetAPDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + * ( ( Word* ) pDataPtr ) = pDesc->AllocType; + break; + + case SQL_DESC_ARRAY_SIZE: + * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; + break; + + case SQL_DESC_BIND_OFFSET_PTR: + * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr; + break; + + case SQL_DESC_BIND_TYPE: + * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize; + break; + + case SQL_DESC_COUNT: + * ( ( Word* ) pDataPtr ) = pDesc->DescCount; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to get a field value from an APD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetAPDItemField ( const pODBCAPD pDesc, const pAPDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetAPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", + pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); + pAPDItem item; + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from IPD + item = _SQLGetAPDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + // as a patch fro SQL server it is temporarily ignoring the error + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLGetAPDItemField - invalid item" ) ); + return SQL_SUCCESS; + /////////// actual action is as follows ///////// + //__ODBCPOPMSG(_ODBCPopMsg("_SQLGetAPDItemField - invalid item")); + //return SQL_ERROR; + ///////////////////////////////////////////////// + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CONCISE_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataConciseType; + break; + + case SQL_DESC_DATA_PTR: + * ( ( Long* ) pDataPtr ) = ( Long ) ( item->DataPtr ); + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; + break; + + case SQL_DESC_INDICATOR_PTR: + * ( ( Long** ) pDataPtr ) = item->SizeIndPtr; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + * ( ( Long* ) pDataPtr ) = item->DataSize; + break; + + case SQL_DESC_NUM_PREC_RADIX: + * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; + break; + + case SQL_DESC_OCTET_LENGTH_PTR: + * ( ( Long** ) pDataPtr ) = item->SizePtr; + break; + + case SQL_DESC_PRECISION: + * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); + break; + + case SQL_DESC_SCALE: + * ( ( Word* ) pDataPtr ) = ( Word ) ( item->Scale ); + break; + + case SQL_DESC_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataVerboseType; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetAPDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + + +/////////////////////// IPD + + +// ----------------------------------------------------------------------- +// to set a field value in IPD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetIPDField ( pODBCIPD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", + pDesc, pFldID, pDataPtr, pDataSize ) ); + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + // assumes automatic alloc by driver as appl alloc + // is not allowed as of now + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; + break; + + case SQL_DESC_COUNT: + // ???? requires that all descriptors which r above the specified + // value are freed. not implemented as of now + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - SQL_DESC_COUNT not implemented" ) ); + return SQL_ERROR; + break; + + case SQL_DESC_ROWS_PROCESSED_PTR: + pDesc->RowsProcessedPtr = ( ULong* ) pDataPtr; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to set a field value in IPD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetIPDItemField ( pODBCIPD pDesc, pIPDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLSetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, + pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); + pIPDItem item; + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from IRD + item = _SQLGetIPDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - invalid item" ) ); + return SQL_ERROR; + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CONCISE_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, + & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + item->DateTimeIntervalPrec = ( Long ) pDataPtr; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + item->DataSize = ( Long ) pDataPtr; + break; + + case SQL_DESC_NAME: + if ( pDataPtr && strlen ( ( Char* ) pDataPtr ) <= 32 ) + { strcpy ( item->ParamName, ( Char* ) pDataPtr ); } + + else + { item->ParamName[0] = 0; } + + case SQL_DESC_NUM_PREC_RADIX: + item->NumPrecRadix = ( Long ) pDataPtr; + break; + + case SQL_DESC_PARAMETER_TYPE: + item->ParamType = ( Word ) pDataPtr; + break; + + case SQL_DESC_PRECISION: + item->DataSize = ( Word ) pDataPtr; + break; + + case SQL_DESC_SCALE: + item->Scale = ( Word ) pDataPtr; + break; + + case SQL_DESC_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_UNNAMED: + // dummy, is related to SQL_DESC_NAME + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIPDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to get a field value from IPD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetIPDField ( const pODBCIPD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetIPDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, + pDataSize, pDataSizePtr ) ); + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + * ( ( Word* ) pDataPtr ) = SQL_DESC_ALLOC_AUTO; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; + break; + + case SQL_DESC_COUNT: + * ( ( Word* ) pDataPtr ) = pDesc->DescCount; + break; + + case SQL_DESC_ROWS_PROCESSED_PTR: + * ( ( ULong** ) pDataPtr ) = pDesc->RowsProcessedPtr; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + +// ----------------------------------------------------------------------- +// to get a field value from an IPD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetIPDItemField ( const pODBCIPD pDesc, const pIPDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", + pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); + pIPDItem item; + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from IPD + item = _SQLGetIPDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - invalid item" ) ); + return SQL_ERROR; + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CASE_SENSITIVE: + * ( ( Long* ) pDataPtr ) = SQL_FALSE; // whether a param is case-sensitive + break; + + case SQL_DESC_CONCISE_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataConciseType; + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; + break; + + case SQL_DESC_FIXED_PREC_SCALE: + * ( ( Word* ) pDataPtr ) = item->FixedPrecScale; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + * ( ( Long* ) pDataPtr ) = item->DataSize; + break; + + case SQL_DESC_TYPE_NAME: + case SQL_DESC_LOCAL_TYPE_NAME: + // ???? there is no param type string defined in IPD as of now + _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, "", -1 ); + break; + + case SQL_DESC_NAME: + _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, item->ParamName, -1 ); + break; + + case SQL_DESC_NULLABLE: + * ( ( Word* ) pDataPtr ) = item->Nullable; + break; + + case SQL_DESC_NUM_PREC_RADIX: + * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; + break; + + case SQL_DESC_PARAMETER_TYPE: + * ( ( Word* ) pDataPtr ) = item->ParamType; + break; + + case SQL_DESC_PRECISION: + * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); + break; + + case SQL_DESC_ROWVER: + * ( ( Word* ) pDataPtr ) = SQL_FALSE; // assumes that all cols r not auto-updating + break; + + case SQL_DESC_SCALE: + * ( ( Word* ) pDataPtr ) = item->Scale; + break; + + case SQL_DESC_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataVerboseType; + break; + + case SQL_DESC_UNNAMED: + * ( ( Word* ) pDataPtr ) = SQL_NAMED; + break; + + case SQL_DESC_UNSIGNED: + * ( ( Word* ) pDataPtr ) = SQL_FALSE; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIPDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + + + +/////////////////////// ARD + +// ----------------------------------------------------------------------- +// to set a field value in ARD header +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetARDField ( pODBCARD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", + pDesc, pFldID, pDataPtr, pDataSize ) ); + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ARRAY_SIZE: + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD RowArraySize is set to %d", ( ULong ) pDataPtr ) ); + pDesc->RowArraySize = ( ULong ) pDataPtr; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; + break; + + case SQL_DESC_BIND_OFFSET_PTR: + pDesc->BindOffsetPtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_BIND_TYPE: + pDesc->BindTypeOrSize = ( Long ) pDataPtr; + break; + + case SQL_DESC_COUNT: + // ???? requires that all descriptors which r above the specified + // value are freed + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - SQL_DESC_COUNT not implemented" ) ); + return SQL_ERROR; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + +// ----------------------------------------------------------------------- +// to set a field value in ARD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetARDItemField ( pODBCARD pDesc, pARDItem pDescItem, Word pRecNum, Word pFldID, + const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLSetARDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d", pDesc, + pDescItem, pRecNum, pFldID, pDataPtr, pDataSize ) ); + pARDItem item; + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from ARD + item = _SQLGetARDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - invalid item" ) ); + return SQL_ERROR; + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CONCISE_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_CONCISE_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATA_PTR: + item->DataPtr = ( void* ) pDataPtr; + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_DATETIME_INTERVAL_CODE, ( Word ) pDataPtr, + & ( item->DataVerboseType ), & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + item->DateTimeIntervalPrec = ( Long ) pDataPtr; + break; + + case SQL_DESC_INDICATOR_PTR: + item->SizeIndPtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + item->DataSize = ( Long ) pDataPtr; + break; + + case SQL_DESC_NUM_PREC_RADIX: + item->NumPrecRadix = ( Long ) pDataPtr; + break; + + case SQL_DESC_OCTET_LENGTH_PTR: // 1004 + item->SizePtr = ( Long* ) pDataPtr; + break; + + case SQL_DESC_PRECISION: + item->DataSize = ( Word ) pDataPtr; // bytes required for numeric type + break; + + case SQL_DESC_SCALE: + item->Scale = ( Word ) pDataPtr; + break; + + case SQL_DESC_TYPE: + _SQLSetDataType ( & ( pDesc->Stmt->Diag ), SQL_DESC_TYPE, ( Word ) pDataPtr, & ( item->DataVerboseType ), + & ( item->DataConciseType ), & ( item->DateTimeIntervalCode ) ); + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetARDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + +// ----------------------------------------------------------------------- +// to get a field value from ARD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetARDField ( const pODBCARD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetARDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, + pDataSize, pDataSizePtr ) ); + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + * ( ( Word* ) pDataPtr ) = pDesc->AllocType; + break; + + case SQL_DESC_ARRAY_SIZE: + * ( ( ULong* ) pDataPtr ) = pDesc->RowArraySize; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; + break; + + case SQL_DESC_BIND_OFFSET_PTR: + * ( ( Long** ) pDataPtr ) = pDesc->BindOffsetPtr; + break; + + case SQL_DESC_BIND_TYPE: + * ( ( Long* ) pDataPtr ) = pDesc->BindTypeOrSize; + break; + + case SQL_DESC_COUNT: + * ( ( Word* ) pDataPtr ) = pDesc->DescCount; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + +// ----------------------------------------------------------------------- +// to get a field value from an ARD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetARDItemField ( const pODBCARD pDesc, const pARDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetIPDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", + pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr ) ); + pARDItem item; + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from ARD + item = _SQLGetARDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDField - invalid item" ) ); + return SQL_ERROR; + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_CONCISE_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataConciseType; + break; + + case SQL_DESC_DATA_PTR: + * ( ( Long* ) pDataPtr ) = ( Long ) ( item->DataPtr ); + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE: + * ( ( Word* ) pDataPtr ) = item->DateTimeIntervalCode; + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION: + * ( ( Long* ) pDataPtr ) = item->DateTimeIntervalPrec; + break; + + case SQL_DESC_INDICATOR_PTR: + * ( ( Long** ) pDataPtr ) = item->SizeIndPtr; + break; + + case SQL_DESC_LENGTH: + case SQL_DESC_OCTET_LENGTH: + * ( ( Long* ) pDataPtr ) = item->DataSize; + break; + + case SQL_DESC_NUM_PREC_RADIX: + * ( ( Long* ) pDataPtr ) = item->NumPrecRadix; + break; + + case SQL_DESC_OCTET_LENGTH_PTR: + * ( ( Long** ) pDataPtr ) = item->SizePtr; + break; + + case SQL_DESC_PRECISION: + * ( ( Word* ) pDataPtr ) = ( Word ) ( item->DataSize ); + break; + + case SQL_DESC_SCALE: + * ( ( Word* ) pDataPtr ) = ( Word ) ( item->Scale ); + break; + + case SQL_DESC_TYPE: + * ( ( Word* ) pDataPtr ) = item->DataVerboseType; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetARDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + + + +/////////////////////// IRD + + +// ----------------------------------------------------------------------- +// to set a field value in IRD item +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLSetIRDField ( pODBCIRD pDesc, Word pFldID, const void* pDataPtr, Long pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLSetIRDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d", + pDesc, pFldID, pDataPtr, pDataSize ) ); + + // precaution + if ( pDesc == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIRDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ARRAY_STATUS_PTR: + pDesc->ArrayStatusPtr = ( UWord* ) pDataPtr; + break; + + case SQL_DESC_ROWS_PROCESSED_PTR: + pDesc->RowsProcessedPtr = ( ULong* ) pDataPtr; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLSetIRDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +/********** + // ----------------------------------------------------------------------- + // to set a field value in IRD item + // ----------------------------------------------------------------------- + + RETCODE SQL_API _SQLSetIRDItemField ( pODBCIRD pDesc, pIRDItem pDescItem, Word pRecNum, Word pFldID, const void* pDataPtr, Long pDataSize ) + { + __ODBCPOPMSG(_ODBCPopMsg("_SQLSetIRDItemField - unknown field (%d)", pFldID)); + + return SQL_SUCCESS; + } +**********/ + +// ----------------------------------------------------------------------- +// to get a field value from IRD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetIRDField ( const pODBCIRD pDesc, Word pFldID, void* pDataPtr, Long pDataSize, + Long* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetIRDField called, pDesc: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d", pDesc, pFldID, pDataPtr, + pDataSize, pDataSizePtr ) ); + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDField - invalid params" ) ); + return SQL_ERROR; + } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_ALLOC_TYPE: + * ( ( Word* ) pDataPtr ) = SQL_DESC_ALLOC_AUTO; + break; + + case SQL_DESC_ARRAY_STATUS_PTR: + * ( ( UWord** ) pDataPtr ) = pDesc->ArrayStatusPtr; + break; + + case SQL_DESC_COUNT: + * ( ( Word* ) pDataPtr ) = pDesc->DescCount; + break; + + case SQL_DESC_ROWS_PROCESSED_PTR: + * ( ( ULong** ) pDataPtr ) = pDesc->RowsProcessedPtr; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + return SQL_SUCCESS; +} + +static bool isApproximateNumerical ( int type ) { + //According to this article: + //Data Types in SQL Statements + //http://developer.mimer.com/documentation/Mimer_SQL_Reference_Manual/Syntax_Rules4.html + if ( type == ( int ) ODBCTypes::ODBC_Float || + type == ( int ) ODBCTypes::ODBC_Real || + type == ( int ) ODBCTypes::ODBC_Double ) { + return true; + } + + return false; +} + + +// ----------------------------------------------------------------------- +// to get a field value from an IRD item, mhb +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLGetIRDItemField ( const pODBCIRD pDesc, const pIRDItem pDescItem, Word pRecNum, + Word pFldID, void* pDataPtr, Long pDataSize, Long* pDataSizePtr, bool isANSI ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "_SQLGetIRDItemField called, pDesc: %d, pDescItem: %d, Recnum: %d, Fld: %d, DataPtr: %d, DataSize: %d, DataSizePtr: %d, isANSI: %d", + pDesc, pDescItem, pRecNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, isANSI ) ); + CStrPtr s; + pIRDItem item; + + // precaution + if ( pDesc == NULL || pDataPtr == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - invalid params" ) ); + return SQL_ERROR; + } + + // check if item has not been specified directly + if ( pDescItem == NULL ) { + // get item from IRD + item = _SQLGetIRDItem ( pDesc, pRecNum ); + + // check if item located + if ( item == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - invalid item" ) ); + return SQL_ERROR; + } + } + + else + { item = pDescItem; } + + // as per required field + switch ( pFldID ) { + case SQL_DESC_AUTO_UNIQUE_VALUE: + * ( ( Long* ) pDataPtr ) = pDescItem->isAutoIncrement; // whether a col is auto-incrementing + break; + + case SQL_DESC_LABEL://18 + s = pDescItem->label.c_str(); + + // transfer col label + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + break; + + case SQL_DESC_NAME://1011 + s = pDescItem->label.c_str(); + if (!s) s = pDescItem->name.c_str(); + + // transfer col desc + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + break; + + case SQL_DESC_BASE_COLUMN_NAME://22 + s = pDescItem->name.c_str(); + + // transfer col name + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, ( ( s ) ? s : "" ), -1 ); } + + break; + + case SQL_DESC_BASE_TABLE_NAME://23 + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, pDescItem->tableName.c_str(), -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, pDescItem->tableName.c_str(), -1 ); } + + break; + + case SQL_DESC_CASE_SENSITIVE://12 + * ( ( Long* ) pDataPtr ) = pDescItem->isCaseSensitive; // whether a col is case-sensitive + break; + + case SQL_DESC_CATALOG_NAME://17 + s = pDescItem->catelogName.c_str(); + + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, s, -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 16, s, -1 ); } + + break; + + case SQL_DESC_TYPE://1002 + case SQL_DESC_CONCISE_TYPE://2 + * ( ( Long* ) pDataPtr ) = pDescItem->columnType; + break; + + case SQL_DESC_DATETIME_INTERVAL_CODE://1007 + * ( ( Word* ) pDataPtr ) = 0; + break; + + case SQL_DESC_DATETIME_INTERVAL_PRECISION://26 + * ( ( Long* ) pDataPtr ) = 0; + break; + + case SQL_COLUMN_LENGTH://3 + case SQL_DESC_LENGTH://1003 + case SQL_DESC_DISPLAY_SIZE://6 + if ( isANSI ) + { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize; } + + else + { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize * 2; } + + break; + + case SQL_DESC_OCTET_LENGTH://1013 + if ( isANSI ) + { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize; } + + else + { * ( ( Long* ) pDataPtr ) = pDescItem->displaySize * 2; } + + break; + + case SQL_DESC_FIXED_PREC_SCALE://9 + + //SQL_TRUE if the column has a fixed precision and nonzero scale that are data source�Cspecific. + //SQL_FALSE if the column does not have a fixed precision and nonzero scale that are data source�Cspecific. + if ( isApproximateNumerical ( pDescItem->columnType ) ) { + * ( ( Long* ) pDataPtr ) = SQL_FALSE; + } + + else { + * ( ( Long* ) pDataPtr ) = SQL_TRUE; + } + + break; + + case SQL_DESC_LITERAL_PREFIX://27 + case SQL_DESC_LITERAL_SUFFIX://28 + + // assumes prefix and suffix to be single quote + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "\"", -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "\"", -1 ); } + + break; + + case SQL_DESC_TYPE_NAME://14 + case SQL_DESC_LOCAL_TYPE_NAME://29 + s = pDescItem->columnTypeName.c_str(); + + // trasnfer col type name + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + break; + + case SQL_DESC_NULLABLE://1008 + if ( pDescItem->isNullable == 1 ) { + * ( ( Word* ) pDataPtr ) = SQL_NULLABLE; + break; + } + + else if ( pDescItem->isNullable == 0 ) { + * ( ( Word* ) pDataPtr ) = SQL_NO_NULLS; + break; + } + + // fall thru + * ( ( Word* ) pDataPtr ) = SQL_NULLABLE_UNKNOWN; + break; + + case SQL_DESC_NUM_PREC_RADIX://32 + + //If the data type in the SQL_DESC_TYPE field is an approximate numeric data type, + //this SQLINTEGER field contains a value of 2 because the SQL_DESC_PRECISION field contains the number of bits. + //If the data type in the SQL_DESC_TYPE field is an exact numeric data type, + //this field contains a value of 10 because the SQL_DESC_PRECISION field contains the number of decimal digits. + //This field is set to 0 for all non-numeric data types. + if ( isApproximateNumerical ( pDescItem->columnType ) ) { + * ( ( Long* ) pDataPtr ) = 2; + } + + else { + * ( ( Long* ) pDataPtr ) = 10; + } + + break; + + case SQL_COLUMN_PRECISION: //4 + case SQL_DESC_PRECISION: //1005 + * ( ( Long* ) pDataPtr ) = pDescItem->precision; + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "precision is returned as %i ", * ( ( Word* ) pDataPtr ) ) ); + break; + + case SQL_DESC_ROWVER://35 + // assumes that all cols r not auto-updating like TIMESTAMP + * ( ( Word* ) pDataPtr ) = SQL_FALSE; + break; + + case SQL_COLUMN_SCALE: //5 + case SQL_DESC_SCALE://1006 + * ( ( Long* ) pDataPtr ) = pDescItem->scale; + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "scale is returned as %i ", * ( ( Word* ) pDataPtr ) ) ); + break; + + case SQL_DESC_SCHEMA_NAME://16 + s = pDescItem->schemaName.c_str(); + + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + break; + + case SQL_DESC_SEARCHABLE://13 + * ( ( Long* ) pDataPtr ) = SQL_PRED_SEARCHABLE; + break; + + case SQL_DESC_TABLE_NAME://15 + s = pDescItem->tableName.c_str(); + + if ( isANSI ) + { _SQLCopyCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + else + { _SQLCopyWCharData ( _DIAGSTMT ( pDesc->Stmt ), pDataPtr, pDataSize, pDataSizePtr, 32, s, -1 ); } + + break; + + case SQL_DESC_UNNAMED://1012 + * ( ( Long* ) pDataPtr ) = SQL_NAMED; + break; + + case SQL_DESC_UNSIGNED://8 + * ( ( Long* ) pDataPtr ) = !pDescItem->isSigned; + break; + + case SQL_DESC_UPDATABLE://10 + * ( ( Long* ) pDataPtr ) = SQL_ATTR_READONLY; + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLGetIRDItemField - unknown field (%d)", pFldID ) ); + return SQL_ERROR; + break; + } + + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "get item returned" ) ); + return SQL_SUCCESS; +} + + +///////////////////// FREE + +// ----------------------------------------------------------------------- +// to free/release the content of APD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFreeAPDContent ( pODBCAPD pDesc ) { + // since params have not been implemented + // it assumes that no params have been allocated + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to free/release the content of IPD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFreeIPDContent ( pODBCIPD pDesc ) { + // since params have not been implemented + // it assumes that no params have been allocated + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to free/release the content of ARD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFreeARDContent ( pODBCARD pDesc ) { + pARDItem ardcol; // application row descriptor item + + // check if there r any bound cols in ARD + if ( pDesc->BindCols ) { + // loop to free all the bound cols + while ( pDesc->BindCols ) { + // get the first ard-col + ardcol = pDesc->BindCols; + // detach it from ARD link list + _SQLDetachARDItem ( pDesc, ardcol ); + // free + delete ardcol; + } + } + + // reset the highest descriptor count + pDesc->DescCount = 0; + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to free/release the content of IRD +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFreeIRDContent ( pODBCIRD pDesc ) { + pDesc->DescCount = 0; + + if ( pDesc->RowDesc ) { + pDesc->RowDesc = NULL; + } + + return SQL_SUCCESS; +} + + +////////////////////// ATTACH/DETACH + +// ----------------------------------------------------------------------- +// to attach a new item to ARD link list +// ----------------------------------------------------------------------- + +eGoodBad _SQLAttachARDItem ( pODBCARD pDesc, pARDItem pDescItem ) { + // note + // this function also helps in maintaining highest desc number + pARDItem l; + + // precaution + if ( pDesc == NULL || pDescItem == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLAttachARDItem - invalid params" ) ); + return BAD; + } + + // check if this is the first item + if ( pDesc->BindCols == NULL ) { + // set as first and only item + pDesc->BindCols = pDescItem; + pDescItem->Prev = NULL; + pDescItem->Next = NULL; + return GOOD; + } + + // move to tail item + for ( l = pDesc->BindCols; l->Next != NULL; l = l->Next ); + + // attach to tail + l->Next = pDescItem; + pDescItem->Prev = l; + pDescItem->Next = NULL; + + // maintain highest desc number + if ( pDesc->DescCount < pDescItem->ColNum ) + { pDesc->DescCount = pDescItem->ColNum; } + + return GOOD; +} + +// ----------------------------------------------------------------------- +// to detach an existing item from ARD link-list +// ----------------------------------------------------------------------- + +eGoodBad _SQLDetachARDItem ( pODBCARD pDesc, pARDItem pDescItem ) { + // note + // this function also helps in maintaining highest desc number + + // precaution + if ( pDesc == NULL || pDescItem == NULL ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLDetachARDItem - invalid params" ) ); + return BAD; + } + + if ( pDescItem->Prev ) + { ( pDescItem->Prev )->Next = pDescItem->Next; } // attach prev to next + + else + { pDesc->BindCols = pDescItem->Next; } // set head to next if any + + if ( pDescItem->Next ) + { ( pDescItem->Next )->Prev = pDescItem->Prev; } // set next to prev if any + + // maintain highest desc number + if ( pDesc->DescCount == pDescItem->ColNum ) { + Word i; + pARDItem p; + + // loop to find the highest number and set that + for ( i = 0, p = pDesc->BindCols; p != NULL; p = p->Next ) + if ( p->ColNum > i ) + { i = p->ColNum; } + + // set the highest count to this column + pDesc->DescCount = i; + } + + return GOOD; +} + +//////////////////// UTILITY functions + +// ----------------------------------------------------------------------- +// to get converted col descriptor information +// ----------------------------------------------------------------------- + +eGoodBad GetIRDColDescInfo ( SelectedColumnMeta* pColDesc, Word* pDataType, Word* pPrecision, Word* pScale, + Long* pLength ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "GetIRDColDescInfo called" ) ); + + // precaution + if ( !pColDesc ) + { return BAD; } + + // caller safe + if ( pDataType ) { *pDataType = 0; } + + if ( pPrecision ) { *pPrecision = 0; } + + if ( pScale ) { *pScale = 0; } + + if ( pLength ) { *pLength = 0; } + + if ( pDataType ) { *pDataType = pColDesc->columnType; } + + if ( pPrecision ) { *pPrecision = pColDesc->precision; } + + if ( pScale ) { *pScale = pColDesc->scale; } + + if ( pLength ) { *pLength = pColDesc->displaySize; } + + return GOOD; +} diff --git a/odbc/Driver/KO_DIAG.CPP b/odbc/Driver/KO_DIAG.CPP index e7cf27e..a74dd9d 100644 --- a/odbc/Driver/KO_DIAG.CPP +++ b/odbc/Driver/KO_DIAG.CPP @@ -454,7 +454,8 @@ RETCODE SQL_API SQLGetDiagRecW ( SQLSMALLINT pHandleType, // msg __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The message is %s", diagrow->Msg ) ); - _SQLCopyWCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1 ); + _SQLCopyWCharData ( diag, pMsgTxtPtr, pMsgTxtSize, pMsgTxtSizePtr, 16, diagrow->Msg, -1, false ); + // debug //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"SQLGetDiagRec msg: %s", pMsgTxtPtr ? ( StrPtr )pMsgTxtPtr : "(unknown)" )); RETCODE ret = ( pMsgTxtSizePtr && ( *pMsgTxtSizePtr ) > pMsgTxtSize ) ? SQL_SUCCESS_WITH_INFO : SQL_SUCCESS; diff --git a/odbc/Driver/KO_FETCH.CPP b/odbc/Driver/KO_FETCH.CPP index 99a3ed2..d369c68 100644 --- a/odbc/Driver/KO_FETCH.CPP +++ b/odbc/Driver/KO_FETCH.CPP @@ -1,1329 +1,1330 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// ---------------------------------------------------------------------------- -// -// File: KO_FETCH.CPP -// -// Purpose: Contains function for fetching results. -// As explained in the article ODBC has a -// defined way in which the data is made available. -// -// 1. The client CAN obtain general details -// about the result like num of rows etc using -// SQLRowCount, SQLNumResultCols. -// -// 2. It obtains metadata about the result -// more specifically info about columns like -// size type etc using SQLColAttribute or -// SQLDescribeCol. -// -// 3. Then it allocates and bind the buffer -// specifying the other info like buffer size -// etc for the cols it desires to extract using -// SQLBindCol -// -// 4. Then it instructs the driver to feed these -// buffers using SQLFetch or SQLExtendedFetch. -// -// 5. This is the general way. In case the data -// involved is quite large, it can be extracted -// piecemeal using SQLGetData. SQLPutData is the -// funcion corresponding to SQLGetData to specify -// large param values say storing images etc. -// Since I have not implemented params or long -// data read write in this sample, SQLPutData resides -// in this file with SQLGetData. -// -// All fetch occur via the local function _SQLFetch. -// Internally the fetch is executed in the following -// way. -// 1. The rowdesc from server (IRD) and appl (ARD ) -// is obtained. -// 2. Main loop to fetch rowset number of rows. More -// than one row can be fetched at a time. The movement -// in resulset is done using _SQLFetchMoveNext. -// 3. For each row, loop through each ARD item to -// extract the col(s) required by the client. -// -// SQLColConvert and associated funtions _SQLCopyCharData, -// SQLCopyNumData, _SQLCopyDateTimeData r used to perform -// necessary conversion between data as recived from the -// server and data as required by the client. -// -// Exported functions: -// SQLColAttribute -// SQLDescribeCol -// SQLBindCol -// SQLNumResultCols -// SQLRowCount -// SQLFetch -// SQLExtendedFetch -// SQLFetchScroll -// SQLGetData -// SQLPutData -// SQLMoreResults -// SQLNativeSql -// -// ---------------------------------------------------------------------------- -#include "stdafx.h" - -#include "Dump.h" - -// ------------------------- local functions ----------------------------- -RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, Word pFetchOrientation, Long pFetchOffset, ULong* pRowCountPtr, - UWord* pRowStatusArray ); -RETCODE SQL_API _SQLColConvert ( pODBCStmt pStmt, void* pTgtDataPtr, Long* pTgtDataSizePtr, CStrPtr pSrcColData, - pARDItem pARDCol , bool isSigned ); -RETCODE SQL_API _SQLFetchMoveNext ( pODBCStmt pStmt ); -RETCODE SQL_API _SQLResetRowPos ( pODBCStmt pStmt ); - -SQLRowContent* GetIfExist ( std::vector& container, int index ); - -// ----------------------------------------------------------------------- -// to get specific detail//attribute about a col returned from server --- FROM IRD -// kylin specific -// ----------------------------------------------------------------------- - - -RETCODE _SQLColAttribute_basic ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLUSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr, // in bytes - SQLPOINTER pNumValuePtr ,// integer - bool isANSI - ) { //if returned data is numeric, feed this - Long n; - SQLResponse* ird; - pIRDItem col; - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - - // precaution - if ( pColNum == 0 ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "bad params" ); - return SQL_ERROR; - } - - // get the row descriptor obtained with response - ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get(); - - // check - if ( ird == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "No resultset or no col descriptors" ); - return SQL_ERROR; - } - - // find the xth element/col - col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum ); - - // check - if ( col == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "Invalid col num" ); - return SQL_ERROR; - } - - // get value from descriptor as per field type - switch ( pFldID ) { - // numeric types clubbed together - case SQL_DESC_AUTO_UNIQUE_VALUE: // is col auto-incrementing - case SQL_DESC_CASE_SENSITIVE: // is col case-insensitive - case SQL_DESC_TYPE: // verbose type - case SQL_DESC_CONCISE_TYPE: // concise type - case SQL_DESC_COUNT: // no.of highest bound column - case SQL_DESC_LENGTH: - case SQL_DESC_DISPLAY_SIZE: - case SQL_DESC_OCTET_LENGTH: - case SQL_DESC_FIXED_PREC_SCALE: - case SQL_DESC_NULLABLE: - case SQL_DESC_NUM_PREC_RADIX: - case SQL_DESC_PRECISION: - case SQL_DESC_SCALE: - case SQL_DESC_SEARCHABLE: - case SQL_DESC_UNNAMED: - case SQL_DESC_UNSIGNED: - case SQL_DESC_UPDATABLE: - // added for Excel - case SQL_COLUMN_LENGTH: - case SQL_COLUMN_PRECISION: - case SQL_COLUMN_SCALE: - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pNumValuePtr, -1, NULL , isANSI ); - break; - - // char types clubbed together - - case SQL_DESC_BASE_TABLE_NAME: // table name for column - case SQL_DESC_CATALOG_NAME: // database name - case SQL_DESC_LITERAL_PREFIX: - case SQL_DESC_LITERAL_SUFFIX: - case SQL_DESC_LOCAL_TYPE_NAME: - case SQL_DESC_TYPE_NAME: - case SQL_DESC_SCHEMA_NAME: - case SQL_DESC_TABLE_NAME: - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pDataPtr, pDataSize, - pDataSizePtr ? &n : NULL, isANSI ); - - if ( pDataSizePtr ) - { *pDataSizePtr = ( Word ) n; } - - break; - - case SQL_DESC_BASE_COLUMN_NAME: - case SQL_DESC_LABEL: - case SQL_DESC_NAME: - // //// - // as a special case the name length may be required without the actual name - ////// - StrPtr cname; - Word cnamesize; - - if ( pDataPtr ) { - cname = ( StrPtr ) pDataPtr; - cnamesize = pDataSize; - } - - else { - cname = new Char[256]; // arbitary - cnamesize = 255; - } - - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, cname, cnamesize, - pDataSizePtr ? &n : NULL, isANSI ); - - if ( pDataPtr == NULL ) - { delete[] cname; } - - if ( pDataSizePtr ) - { *pDataSizePtr = ( Word ) n; } - - break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLColAttribute unknown attr, ColNum: %d, FldID: %d\n", pColNum, pFldID ) ); - return SQL_ERROR; - } - - return SQL_SUCCESS; -} - - -#ifdef _WIN64 -RETCODE SQL_API SQLColAttributeW ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLUSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr, - SQLLEN* pNumValuePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); - RETCODE code = _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, - false ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) ); - return code; -} - -RETCODE SQL_API SQLColAttribute ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLUSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr, - SQLLEN* pNumValuePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); - return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true ); -} - -#else -RETCODE SQL_API SQLColAttributeW ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLUSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr, - SQLPOINTER pNumValuePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); - RETCODE code = _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, - false ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) ); - return code; -} - -RETCODE SQL_API SQLColAttribute ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLUSMALLINT pFldID, - SQLPOINTER pDataPtr, - SQLSMALLINT pDataSize, - SQLSMALLINT* pDataSizePtr, - SQLPOINTER pNumValuePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); - return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true ); -} -#endif - -// ---------------------------------------------------------------------- -// to get the basic set of ARD col attributes, ie details recd. from server --- FROM IRD -// SQLDescribeCol returns the result descriptor �� column name,type, column size, decimal digits, and nullability (from msdn) -// kylin specific -// ---------------------------------------------------------------------- - -SQLRETURN SQL_API _SQLDescribeCol_basic ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - void* pColNamePtr, - SQLSMALLINT pColNameSize, - SQLSMALLINT* pColNameSizePtr, - SQLSMALLINT* pDataTypePtr, - SQLULEN* pColSizePtr, - SQLSMALLINT* pDecimalDigitsPtr, - SQLSMALLINT* pNullablePtr , - bool isANSI - ) { - Long n; - SQLResponse* ird; - pIRDItem col; - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - - // precaution - if ( pColNum == 0 ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "bad params" ); - return SQL_ERROR; - } - - // get the row descriptor obtained with response - ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get(); - - // check - if ( ird == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "No resultset or no col descriptors" ); - return SQL_ERROR; - } - - // find the xth element/col - col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum ); - - // check - if ( col == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "Invalid col num" ); - return SQL_ERROR; - } - - // COL-NAME ie title - if ( pColNamePtr ) { - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_BASE_COLUMN_NAME, pColNamePtr, - pColNameSize, pColNameSizePtr ? &n : NULL, isANSI ); - - // here should return length of characters - if ( pColNameSizePtr ) { - if (isANSI) { - *pColNameSizePtr = ( Word ) n; - } - else { - *pColNameSizePtr = ( Word ) ( n / 2 ); - } - } - - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, (wchar_t*)pColNamePtr ) ); - } - - // COL-DATA TYPE - - if ( pDataTypePtr ) { - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_CONCISE_TYPE, pDataTypePtr, -1, - NULL, isANSI ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "data type: %d", *pDataTypePtr ) ); - } - - // COL-SIZE - - if ( pColSizePtr ) { - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_LENGTH, pColSizePtr, -1, NULL, - isANSI ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "column size: %d", *pColSizePtr ) ); - } - - // COL-DECIMAL - - if ( pDecimalDigitsPtr ) { - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_SCALE, pDecimalDigitsPtr, -1, NULL, - isANSI ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "decimal scale: %d", *pDecimalDigitsPtr ) ); - } - - // COL-NULLABLE - - if ( pNullablePtr ) { - _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL, - isANSI ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "nullable: %d", *pNullablePtr ) ); - } - - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDescribeCol returned" ) ); - return SQL_SUCCESS; -} - -SQLRETURN SQL_API SQLDescribeColW ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLWCHAR* pColNamePtr, - SQLSMALLINT pColNameSize, - SQLSMALLINT* pColNameSizePtr, - SQLSMALLINT* pDataTypePtr, - SQLULEN* pColSizePtr, - SQLSMALLINT* pDecimalDigitsPtr, - SQLSMALLINT* pNullablePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLDescribeColW. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d", - pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) ); - return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, - pDecimalDigitsPtr, pNullablePtr , false ); -} - -SQLRETURN SQL_API SQLDescribeCol ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLCHAR* pColNamePtr, - SQLSMALLINT pColNameSize, - SQLSMALLINT* pColNameSizePtr, - SQLSMALLINT* pDataTypePtr, - SQLULEN* pColSizePtr, - SQLSMALLINT* pDecimalDigitsPtr, - SQLSMALLINT* pNullablePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLDescribeCol. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d", - pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) ); - return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, - pDecimalDigitsPtr, pNullablePtr , true ); -} - -// ----------------------------------------------------------------------- -// to bind a column to with details from application --- TO ARD -// kylin specific, no change required -// ----------------------------------------------------------------------- - -/* - - From msdn: - - SQLRETURN SQLBindCol( - SQLHSTMT StatementHandle, - SQLUSMALLINT ColumnNumber, - SQLSMALLINT TargetType, - SQLPOINTER TargetValuePtr, - SQLLEN BufferLength, - SQLLEN * StrLen_or_Ind); - -*/ -RETCODE SQL_API SQLBindCol ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLSMALLINT pDataType, - SQLPOINTER pDataPtr, - SQLLEN pDataSize, - SQLLEN* pDataSizePtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBindCol called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d", - pColNum, pDataType, pDataPtr, pDataSize ) ); - pODBCARD ard; // application row descriptor - pARDItem ardcol; // application row descriptor item - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - // extract the appl. row descriptor from stmt - ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); - // get the specified column if already bound - ardcol = _SQLGetARDItem ( ard, pColNum ); - - // EXISTS - - if ( ardcol != NULL ) { - // check if total unbind is required - if ( pDataPtr == NULL && pDataSizePtr == NULL ) { - // detach it from ARD link list - _SQLDetachARDItem ( ard, ardcol ); - // free - delete ardcol; - } - - else { - // unbind/rebind col details - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 ); - // reset the source data type - ardcol->SrcDataType = 0; - } - - return SQL_SUCCESS; - } - - // DOES NOT EXIST - - // check for bad params - if ( pDataPtr == NULL && pDataSizePtr == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Bad params" ); - return SQL_ERROR; - } - - // check for bad params - else if ( pDataSize < 0 ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Invalid buffer length" ); - return SQL_ERROR; - } - - // CREATE - // allocate a new col-item - ardcol = new ARDItem; - // reset - _SQLSetARDItemFieldsDefault ( ardcol, pColNum ); - // set all values - bind - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 ); - _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 ); - // attach it to link list - _SQLAttachARDItem ( ard, ardcol ); - return SQL_SUCCESS; -} - - -// --------------------------------------------------------------------- -// to get the number of columns in result --- COUNTING ELEMENTS IN IRD.ROWDESC -// Kylin specific -// --------------------------------------------------------------------- - -RETCODE SQL_API SQLNumResultCols ( SQLHSTMT pStmt, SQLSMALLINT* pColCountPtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called" ) ); - SQLResponse* rowdesc; - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - // caller safe - * ( ( SQLSMALLINT* ) pColCountPtr ) = 0; - // get the row desciptor - rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); - - if ( rowdesc == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLNumResultCols", "01000", -1, "no resultset or IRD" ); - return SQL_ERROR; - } - - // count the number of columns - * ( ( SQLSMALLINT* ) pColCountPtr ) = ( SQLSMALLINT ) ( rowdesc->columnMetas.size() ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called returned: %d", - * ( ( SQLSMALLINT* ) pColCountPtr ) ) ); - return SQL_SUCCESS; -} - - -// ---------------------------------------------------------------------- -// to count the number of rows in the current result --- COUNTING ELEMENTS IN IRD -// ---------------------------------------------------------------------- - -RETCODE SQL_API SQLRowCount ( HSTMT pStmt, SQLLEN* pDataPtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount called" ) ); - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - *pDataPtr = ( ( pODBCStmt ) pStmt )->RowCount; - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount returned: %d", *pDataPtr ) ); - return SQL_SUCCESS; -} - -// ----------------------------------------------------------------------- -// to return the next row from the resultset -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLFetch ( HSTMT pStmt ) { - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - // all fetch occur thru the local function _SQLFetch - /* - RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, - Word pFetchOrientation, - Long pFetchOffset, - ULong* pRowCountPtr, - UWord* pRowStatusArray ) - */ - RETCODE ret = _SQLFetch ( ( pODBCStmt ) pStmt, SQL_FETCH_NEXT, - ( ( pODBCStmt ) pStmt )->ARD.RowArraySize > 0 ? ( ( pODBCStmt ) pStmt )->ARD.RowArraySize : 1, - ( ( pODBCStmt ) pStmt )->IRD.RowsProcessedPtr, ( ( pODBCStmt ) pStmt )->IRD.ArrayStatusPtr ); - - if ( ret == SQL_NO_DATA ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Last row of current query has been fetched" ) ); - } - - return ret; -} - -// ----------------------------------------------------------------------- -// to fetch the specified rowset of data from the result set -// Version Introduced: ODBC 1.0 Standards Compliance: Deprecated (from msdn) -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLExtendedFetch ( SQLHSTMT pStmt, - SQLUSMALLINT pFetchOrientation, - SQLINTEGER pFetchOffset, - SQLUINTEGER* pRowCountPtr, - SQLUSMALLINT* pRowStatusArray ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, - "SQLExtendedFetch called, Stmt: %d, FO: %d, Offset: %d, Rcount: %d, RowStatus: %d", pStmt, pFetchOrientation, - pFetchOffset, pRowCountPtr, pRowStatusArray ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch is not implemented " ) ); - return SQL_ERROR; - Long n; - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - // free diags - _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); - - // only fetch next supported - if ( pFetchOrientation != SQL_FETCH_NEXT ) { - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch option not supported, FetchOrientation: %d", pFetchOrientation ) ); - return SQL_ERROR; - } - - // check if number of rows explicitly specified - if ( pFetchOffset <= 0 ) - { n = ( ( pODBCStmt ) pStmt )->ARD.RowArraySize; } - - // use default rowset size as a fallback - if ( n <= 0 ) - { n = 1; } - - return _SQLFetch ( ( pODBCStmt ) pStmt, pFetchOrientation, n, pRowCountPtr, pRowStatusArray ); -} - - -// ----------------------------------------------------------------------- -// to fetch the specified rowset of data from the result set -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLFetchScroll ( SQLHSTMT pStatementHandle, - SQLSMALLINT pFetchOrientation, - SQLINTEGER pFetchOffset ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFetchScroll called" ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLFetchScroll not implemented" ) ); - return SQL_ERROR; -} - - -// ----------------------------------------------------------------------- -// to send data for a parameter or column to the driver at statement execution time -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLPutData ( SQLHSTMT pStmt, - SQLPOINTER pDataPtr, - SQLINTEGER pDataSize ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPutData called" ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLPutData not implemented" ) ); - return SQL_ERROR; -} - -// ----------------------------------------------------------------------- -// to iterate through multiple resultsets -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLMoreResults ( HSTMT pStmt ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLMoreResults called" ) ); - - pODBCStmt odbcStmt = (pODBCStmt)pStmt; - if (odbcStmt->IRD.RowDesc != NULL ) { - // ------- THIS CASE SHOULD NOT OCCUR ---------- - // check if position is currently unknown - if ( odbcStmt->CurRowsetStartRow == NULL && odbcStmt->CurRowsetStartRowPos == 0 ) { - // position to first row ( both the pointers ) - if (GetIfExist ( odbcStmt->IRD.RowDesc->results, 1 ) ) - { - return SQL_SUCCESS; - } - } - // ----------------------------------------------- - // position to next row if already position is known - else if ( odbcStmt->CurRowsetEndRow != NULL ) { - // position to next row - if (GetIfExist ( odbcStmt->IRD.RowDesc->results, odbcStmt->CurRowsetEndRowPos ) ) - { - return SQL_SUCCESS; - } - } - return SQL_NO_DATA; - } - return SQL_ERROR; -} - -// ----------------------------------------------------------------------- -// to get a driver specific version of specified sql statement -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLNativeSql ( SQLHDBC pConn, - SQLCHAR* pInStmtText, - SQLINTEGER pInStmtTextLen, - SQLCHAR* pOutStmtText, - SQLINTEGER pOutStmtTextLen, - SQLINTEGER* pOutStmtTextLenPtr ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNativeSql called" ) ); - __ODBCPOPMSG ( _ODBCPopMsg ( "SQLNativeSql not implemented" ) ); - return SQL_ERROR; -} - - - - -// ----------------------------------------------------------------------- -// to convert and transfer col data for application -// ----------------------------------------------------------------------- - -//mhb TODO, check if the sqltype defined here match from c# -RETCODE SQL_API _SQLColConvert ( pODBCStmt pStmt, - void* pTgtDataPtr, - Long* pTgtDataSizePtr, - const wchar_t* pSrcColData, - pARDItem pARDCol, - bool isSigned ) { - //check out this for SQL data type to C data type mapping - //http://msdn.microsoft.com/en-us/library/ms714556(v=vs.85).aspx - // note - // this function actually determines the conversion - // required to transfer the data - Word pSrcDataType = pARDCol->SrcDataType; - Word pTgtDataType = pARDCol->DataConciseType; - Long pTgtDataSize = pARDCol->DataSize; - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLColConvert called" ) ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The SrcDataType is %d, the TgtDataType is %d, the TgtDataSize is %d", - pSrcDataType, pTgtDataType, pTgtDataSize ) ); - - // TARGET TYPE IS LEFT TO OUR DRIVER - // check if target type is open - if ( pTgtDataType == SQL_DEFAULT ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is SQL_DEFAULT, use default type mapping." ) ); - - // determine targettype based on data-source type - // check out this http://msdn.microsoft.com/en-us/library/ms716298(v=vs.85).aspx for default type mapping - switch ( pSrcDataType ) { - case SQL_CHAR: - pTgtDataType = SQL_C_CHAR; - break; - - case SQL_VARCHAR: - pTgtDataType = SQL_C_CHAR; - break; - - case SQL_WCHAR: - pTgtDataType = SQL_C_WCHAR; - break; - - case SQL_WVARCHAR: - pTgtDataType = SQL_C_WCHAR; - break; - - case SQL_DECIMAL: - pTgtDataType = SQL_C_CHAR; - break; - - case SQL_BIT: - pTgtDataType = SQL_C_BIT; - break; - - case SQL_TINYINT: - if ( isSigned ) - { pTgtDataType = SQL_C_STINYINT; } - - else - { pTgtDataType = SQL_C_UTINYINT; } - - break; - - case SQL_SMALLINT: - if ( isSigned ) - { pTgtDataType = SQL_C_SSHORT; } - - else - { pTgtDataType = SQL_C_USHORT; } - - break; - - case SQL_INTEGER: - if ( isSigned ) - { pTgtDataType = SQL_C_SLONG; } - - else - { pTgtDataType = SQL_C_ULONG; } - - break; - - case SQL_BIGINT: - if ( isSigned ) - { pTgtDataType = SQL_C_SBIGINT; } - - else - { pTgtDataType = SQL_C_UBIGINT; } - - break; - - case SQL_FLOAT: - pTgtDataType = SQL_C_FLOAT; - break; - - case SQL_DOUBLE: - pTgtDataType = SQL_C_DOUBLE; - break; - - case SQL_TYPE_DATE: - pTgtDataType = SQL_C_CHAR; - break; - - case SQL_TYPE_TIME: - pTgtDataType = SQL_C_CHAR; - break; - - case SQL_TYPE_TIMESTAMP: - pTgtDataType = SQL_C_CHAR; - break; - - //case SQL_C_SLONG: - //case SQL_C_ULONG: // unsigned long - //case SQL_C_USHORT: - //case SQL_C_SSHORT: - //case SQL_NUMERIC: - //case SQL_REAL: - // pTgtDataType = pSrcDataType; - // break; - - default: - __ODBCPOPMSG ( _ODBCPopMsg ( "The data type %d not implemented", pSrcDataType ) ); - return SQL_ERROR; - break; - } - } - - else { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is NOT SQL_DEFAULT, it is %d", pTgtDataType ) ); - } - - // TARGET TYPE IS CHAR - // as an optimization, check if the application - // or target data type is char. since the data from - // server is already in char format. the data can - // easily be transferred without incurring any - // conversion overhead - unique_ptr pTextInAnsi ( wchar2char ( pSrcColData ) ); - - // check if char type - if ( pTgtDataType == SQL_CHAR || pTgtDataType == SQL_VARCHAR ) { - // only in case of src data being bool a conversion is required - if ( pSrcDataType == SQL_BIT ) { - // prepare a converted single char bool string - Char src[2]; - - if ( pTextInAnsi.get() == NULL ) - { src[0] = '0'; } - - else - { src[0] = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? '1' : '0'; } - - src[1] = 0; - // transfer the bool string - return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, src, -1 ); - } - - else { - // transfer the string as it is - return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pTextInAnsi.get(), - -1 ); - } - } - - if ( pTgtDataType == SQL_WCHAR || pTgtDataType == SQL_WVARCHAR ) { - return _SQLCopyWCharDataW ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pSrcColData, -1 ); - } - - // TARGET TYPE IS NOT CHAR - - // try using a numeric conversion - switch ( _SQLCopyNumData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType , - pTgtDataSizePtr ) ) { - case -1: - return SQL_ERROR; - - case 0: - return SQL_SUCCESS; - - default: - break; - } - - // try using a date/time conversion - switch ( _SQLCopyDateTimeData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType ) ) { - case -1: - return SQL_ERROR; - - case 0: - return SQL_SUCCESS; - - default: - break; - } - - // try using SQL_BIT data type ie bool - if ( pTgtDataType == SQL_BIT ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the target data type is SQL_C_BIT" ) ); - - // prepare a converted single char bool string - if ( pTextInAnsi.get() == NULL ) - { * ( ( char* ) pTgtDataPtr ) = 0; } - - else - { * ( ( char* ) pTgtDataPtr ) = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? 1 : 0; } - - return SQL_SUCCESS; - } - - // error condition - __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLColConvert - Unknown data type, Target: %d, Source: %d", pTgtDataType, - pSrcDataType ) ); - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLColConvert", "01000", -1, "Unknown data type, Target: %d, Source: %d", - pTgtDataType, pSrcDataType ); - return SQL_ERROR; -} - - -// ----------------------------------------------------------------------- -// to get the specified column data from -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFetchCol ( pODBCStmt pStmt, - pARDItem pARDCol, //ard - SQLResponse* pRowDesc,// ird - SQLRowContent* pRowData ) { //content - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetchCol called" ) ); - // note - // this function checks the binding type and positions the pointer - // for copying the data accordingly. It takes into account the - // current row position in rowset, the initial min increment specified - // by client and the size of the row or col buffer - Long i; - Long j; - Long* tgtsizeptr; // target size ptr - void* tgtdataptr; // target data ptr - const wchar_t* srcdata; // source data - SelectedColumnMeta* coldesc; - // COMPUTE DATA AND SIZE PTR - // get the row pos in current rowset - i = ( pStmt->CurRowsetEndRowPos - pStmt->CurRowsetStartRowPos ); - // compute min increment - j = ( pStmt->ARD.BindOffsetPtr ) ? * ( pStmt->ARD.BindOffsetPtr ) : 0; - - // check the binding type - if ( pStmt->ARD.BindTypeOrSize != SQL_BIND_BY_COLUMN ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize not euqal to SQL_BIND_BY_COLUMN" ) ); - // note - Long k; - // compute row-size increment - k = ( pStmt->ARD.BindTypeOrSize ); - // compute target col and size ptr - tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * k ) ); - tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * k ) ); - } - - // column-wise binding - else { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize euqal to SQL_BIND_BY_COLUMN" ) ); - // move both data and size ptr in the array - //TODO find out where the pARDCol->DataSize if set - tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * pARDCol->DataSize ) ); // use based on data type - tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * sizeof ( Long ) ) ); - } - - // PRECAUTION - - if ( tgtdataptr ) { * ( ( Char* ) tgtdataptr ) = 0; } - - if ( tgtsizeptr ) { * ( ( Long* ) tgtsizeptr ) = 0; } - - // COLLECT AND CHECK - // get col desc for specified col ( response ) - coldesc = pRowDesc->columnMetas.at ( pARDCol->ColNum - 1 ); - //if ( coldesc == NULL ) { - // _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" ); - // return SQL_SUCCESS_WITH_INFO; // no col for specified index - //} - // get the col data for specfied col ( response ) - srcdata = pRowData->contents.at ( pARDCol->ColNum - 1 ).c_str(); - - //coldata = SOAPGetChildElemX ( pRowData, pARDCol->ColNum ); - //if ( coldata == NULL ) { - - // _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" ); - // return SQL_SUCCESS_WITH_INFO; // no col for specified index - //} - - // get col value as string - //srcdata = SOAPGetElemText ( coldata ); - - // NULL DATA // note: a text of NULL indicates NULL data from server - - // check if data is NULL - if ( srcdata == NULL || _wcsicmp ( srcdata, L"NULL" ) == 0 ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "srcdata is null" ) ); - - // check if a size indicator is available - if ( tgtsizeptr == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "22002", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, - "Indicator variable required but not supplied" ); - return SQL_SUCCESS_WITH_INFO; - } - - // set to SQL_NULL_DATA - else { - // indicate null data - * ( ( Long* ) tgtsizeptr ) = SQL_NULL_DATA; - // added precaution for bad appl design - /* if ( tgtdataptr ) - memset ( tgtdataptr, 0, pARDCol->MaxSize );*/ - return SQL_SUCCESS; - } - } - - // check if info about src is also available in ARD col - if ( pARDCol->SrcDataType == 0 ) - { GetIRDColDescInfo ( coldesc, & ( pARDCol->SrcDataType ), & ( pARDCol->SrcDataPrecision ), & ( pARDCol->SrcDataScale ), & ( pARDCol->SrcDataSize ) ); } // collect source data information in form comparable to appl - - // CONVERT AND TRANSFER - //Important!!! - //Notice the specification of different types - //http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.odbc.doc/odbc72.htm - RETCODE ret = _SQLColConvert ( pStmt, tgtdataptr, tgtsizeptr, srcdata, pARDCol, coldesc->isSigned ); - //char buffer[1024]; - //hexDump((char*)tgtdataptr,4,buffer,false); - //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer)); - //hexDump((char*)tgtdataptr,4,buffer,true); - //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer)); - return ret; -} - - -// ----------------------------------------------------------------------- -// to move to the next row with relevant checks -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFetchMoveNext ( pODBCStmt pStmt ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetch MoveNext is called" ) ); - - // check if there is some response of type resultset - if (pStmt->IRD.RowDesc != NULL ) { - // ------- THIS CASE SHOULD NOT OCCUR ---------- - - // check if position is currently unknown - if ( pStmt->CurRowsetStartRow == NULL && pStmt->CurRowsetStartRowPos == 0 ) { - // position to first row ( both the pointers ) - pStmt->CurRowsetStartRowPos = 1; - pStmt->CurRowsetStartRow = GetIfExist ( pStmt->IRD.RowDesc->results, 1 ); - pStmt->CurRowsetEndRowPos = 1; - pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, 1 ); - } - - // ----------------------------------------------- - - // position to next row if already position is known - else if ( pStmt->CurRowsetEndRow != NULL ) { - // position to next row - pStmt->CurRowsetEndRowPos += 1; - pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); - } - - // finally check if there is some data found - if ( pStmt->CurRowsetEndRow == NULL ) { - // put in diag - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" ); - return SQL_NO_DATA; - } - - else - { return SQL_SUCCESS; } - } - - else { - // error situation - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchMoveNext", "01000", -1, "no resultset" ); - return SQL_ERROR; - } -} - -SQLRowContent* GetIfExist ( std::vector& container, int index ) { - index = index - 1; //sql cardinals start at 1 - - if ( index >= ( int ) container.size() ) - { return NULL; } - - else - { return container.at ( index ); } -} - -// ----------------------------------------------------------------------- -// to set the initial row positions for a fetch -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLResetRowPos ( pODBCStmt pStmt ) { - // note - // there r 2 row pointers one is the start row for the current fetch and - // the other is the end row after the current fetch - // this function brings them together and moves them to the first row - // after the cur end row - // a block of rows which is fetched in one go is ROWSET while the full - // result is called RESULTSET - - // check if there is some response of type resultset - if ( - pStmt->IRD.RowDesc != NULL ) { - // check if position is currently unknown - if ( pStmt->CurRowsetEndRow == NULL && pStmt->CurRowsetEndRowPos == 0 ) { - // position to first row ( both the pointers ) - pStmt->CurRowsetEndRowPos = 1; - pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); - } - - // already positioned somewhere - else if ( pStmt->CurRowsetEndRow != NULL ) { - // position to next row - pStmt->CurRowsetEndRowPos += 1; - pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); - } - - // calibrate the first row with end row - pStmt->CurRowsetStartRow = pStmt->CurRowsetEndRow; - pStmt->CurRowsetStartRowPos = pStmt->CurRowsetEndRowPos; - - // finally check if there is some data found - if ( pStmt->CurRowsetStartRow == NULL ) { - // put in diag - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" ); - return SQL_NO_DATA; - } - - else - { return SQL_SUCCESS; } - } - - else { - // error situation - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLResetRowPos", "01000", -1, "no resultset" ); - return SQL_ERROR; - } -} - - -// ----------------------------------------------------------------------- -// to return the next row from the resultset -// ----------------------------------------------------------------------- - -RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, - Word pFetchOrientation, - Long pFetchOffset, //ARD.RowArraySize - ULong* pRowCountPtr, //IRD.RowsProcessedPtr - UWord* pRowStatusArray ) { //ArrayStatusPtr - // note - // fetchoffset is treated as the number of rows to fetch - bool flgNoData; - Long i, n1, n2; - RETCODE s; - SQLRowContent* rowdata; - SQLResponse* rowdesc; - pODBCARD ard; - pARDItem ardcol; - - // CALLER SAFE - - // caller safe for row fetched - if ( pRowCountPtr ) - { *pRowCountPtr = 0; } - - // caller safe for each row status - if ( pRowStatusArray ) - for ( i = 0; i < pFetchOffset; i ++ ) { pRowStatusArray[i] = SQL_ROW_NOROW; } - - // RESET POSITION OR SET INITIAL POSITIONS - - // postions the row counter for fetch start - if ( ( s = _SQLResetRowPos ( ( pODBCStmt ) pStmt ) ) != SQL_SUCCESS ) - { return s; } - - // COLLECT INFO to START - // get the row desc - ird - rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); - // get the row desc - ard - ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); - - // MAIN LOOP to fetch rowset number of rows - // loop to fetch the rows - for ( i = 0, n1 = 0, n2 = 0, flgNoData = FALSE; i < pFetchOffset && flgNoData == FALSE; i ++ ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get One Row:" ) ); - - // check if first row or not - if ( i != 0 ) { - // move to next row if not first time - switch ( _SQLFetchMoveNext ( pStmt ) ) { - case SQL_NO_DATA: - flgNoData = TRUE; // can continue - continue; - - case SQL_ERROR: - return SQL_ERROR; // not continuing - - default: // case SQL_SUCCESS: - break; - } - } - - // get the current row data - rowdata = pStmt->CurRowsetEndRow; - - // LOOP to fetch cols of one row - - // loop to put data in all bound cols - for ( ardcol = ard->BindCols; ardcol != NULL; ardcol = ardcol->Next ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get one column:" ) ); - // get data using _SQLFetchCol - s = _SQLFetchCol ( pStmt, ardcol, rowdesc, rowdata ); - - // update row status - switch ( s ) { - case SQL_SUCCESS: - if ( pRowStatusArray && pRowStatusArray[i] == SQL_ROW_NOROW ) { pRowStatusArray[i] = SQL_ROW_SUCCESS_WITH_INFO; } - - break; - - case SQL_SUCCESS_WITH_INFO: - ++ n1; // rows with info - - if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_SUCCESS_WITH_INFO; } - - break; - - default: - ++ n2; // no. of rows with error - - if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_ERROR; } - } - } - - // update the number of rows fetched - if ( pRowCountPtr ) { *pRowCountPtr = i + 1; } - } - - // check if no data - if ( flgNoData == TRUE && i <= 0 ) - { return SQL_NO_DATA; } - - // check if all error - else if ( i > 0 && n2 == i ) - { return SQL_ERROR; } - - // check if any success with info - else if ( i > 0 && n1 > 0 ) - { return SQL_SUCCESS_WITH_INFO; } - - // all success - else { - return SQL_SUCCESS; - } -} - - -// ----------------------------------------------------------------------- -// to retrieve long data for a single column in the result set using multiple calls -// ----------------------------------------------------------------------- - -RETCODE SQL_API SQLGetData ( SQLHSTMT pStmt, - SQLUSMALLINT pColNum, - SQLSMALLINT pDataType, - SQLPOINTER pDataPtr, - SQLLEN pDataSize, - SQLLEN* pDataSizePtr ) { - __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); - - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetData called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d", - pColNum, pDataType, pDataPtr, pDataSize ) ); - - if ( pColNum < 1 || pColNum > (( pODBCStmt )pStmt)->IRD.DescCount ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "Dynamic SQL error-invalid descriptor index" ); - return SQL_ERROR; - } - - pODBCARD ard; - pARDItem ardcol; - SQLRowContent* rowdata; - SQLResponse* rowdesc; - SQLSMALLINT tgtPDataType; - - ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); - rowdata = ((pODBCStmt)pStmt)->CurRowsetEndRow; - rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); - - if ( rowdata == NULL ) { - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "HY010", -1, "CLI-specific condition-function sequence error" ); - return SQL_ERROR; - } - - ardcol = _SQLGetARDItem ( ard, pColNum ); - if (ardcol != NULL) { - /* It's illegal to call SQLGetdata for a "bound" Column */ - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "dynamic SQL error-invalid descriptor index" ); - return SQL_ERROR; - } - - // convert C data type to SQL data type - switch (pDataType) - { - case SQL_C_SBIGINT: - case SQL_C_SLONG: - case SQL_C_SSHORT: - case SQL_C_STINYINT: - tgtPDataType = pDataType - SQL_SIGNED_OFFSET; - break; - case SQL_C_ULONG: - case SQL_C_USHORT: - case SQL_C_UTINYINT: - case SQL_C_UBIGINT: - tgtPDataType = pDataType - SQL_UNSIGNED_OFFSET; - break; - default: - tgtPDataType = pDataType; - break; - } - - // manually bind column information to output - RETCODE ret = SQLBindCol(pStmt, pColNum, tgtPDataType, pDataPtr, pDataSize, pDataSizePtr); - if (ret != SQL_SUCCESS) { - return ret; - } - - ardcol = _SQLGetARDItem ( ard, pColNum ); - ret = _SQLFetchCol ( (pODBCStmt)pStmt, ardcol, rowdesc, rowdata ); - if (ret != SQL_SUCCESS) { - return ret; - } - _SQLDetachARDItem(ard, ardcol); - - /*unique_ptr temp2 ( wchar2char ( ( wchar_t* ) pDataPtr ) ); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Data1: %s", temp2.get())); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Size1: %d", *pDataSizePtr));*/ - - return SQL_SUCCESS; -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// ---------------------------------------------------------------------------- +// +// File: KO_FETCH.CPP +// +// Purpose: Contains function for fetching results. +// As explained in the article ODBC has a +// defined way in which the data is made available. +// +// 1. The client CAN obtain general details +// about the result like num of rows etc using +// SQLRowCount, SQLNumResultCols. +// +// 2. It obtains metadata about the result +// more specifically info about columns like +// size type etc using SQLColAttribute or +// SQLDescribeCol. +// +// 3. Then it allocates and bind the buffer +// specifying the other info like buffer size +// etc for the cols it desires to extract using +// SQLBindCol +// +// 4. Then it instructs the driver to feed these +// buffers using SQLFetch or SQLExtendedFetch. +// +// 5. This is the general way. In case the data +// involved is quite large, it can be extracted +// piecemeal using SQLGetData. SQLPutData is the +// funcion corresponding to SQLGetData to specify +// large param values say storing images etc. +// Since I have not implemented params or long +// data read write in this sample, SQLPutData resides +// in this file with SQLGetData. +// +// All fetch occur via the local function _SQLFetch. +// Internally the fetch is executed in the following +// way. +// 1. The rowdesc from server (IRD) and appl (ARD ) +// is obtained. +// 2. Main loop to fetch rowset number of rows. More +// than one row can be fetched at a time. The movement +// in resulset is done using _SQLFetchMoveNext. +// 3. For each row, loop through each ARD item to +// extract the col(s) required by the client. +// +// SQLColConvert and associated funtions _SQLCopyCharData, +// SQLCopyNumData, _SQLCopyDateTimeData r used to perform +// necessary conversion between data as recived from the +// server and data as required by the client. +// +// Exported functions: +// SQLColAttribute +// SQLDescribeCol +// SQLBindCol +// SQLNumResultCols +// SQLRowCount +// SQLFetch +// SQLExtendedFetch +// SQLFetchScroll +// SQLGetData +// SQLPutData +// SQLMoreResults +// SQLNativeSql +// +// ---------------------------------------------------------------------------- +#include "stdafx.h" + +#include "Dump.h" + +// ------------------------- local functions ----------------------------- +RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, Word pFetchOrientation, Long pFetchOffset, ULong* pRowCountPtr, + UWord* pRowStatusArray ); +RETCODE SQL_API _SQLColConvert ( pODBCStmt pStmt, void* pTgtDataPtr, Long* pTgtDataSizePtr, CStrPtr pSrcColData, + pARDItem pARDCol , bool isSigned ); +RETCODE SQL_API _SQLFetchMoveNext ( pODBCStmt pStmt ); +RETCODE SQL_API _SQLResetRowPos ( pODBCStmt pStmt ); + +SQLRowContent* GetIfExist ( std::vector& container, int index ); + +// ----------------------------------------------------------------------- +// to get specific detail//attribute about a col returned from server --- FROM IRD +// kylin specific +// ----------------------------------------------------------------------- + + +RETCODE _SQLColAttribute_basic ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLUSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr, // in bytes + SQLPOINTER pNumValuePtr ,// integer + bool isANSI + ) { //if returned data is numeric, feed this + Long n; + SQLResponse* ird; + pIRDItem col; + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + + // precaution + if ( pColNum == 0 ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "bad params" ); + return SQL_ERROR; + } + + // get the row descriptor obtained with response + ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get(); + + // check + if ( ird == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "No resultset or no col descriptors" ); + return SQL_ERROR; + } + + // find the xth element/col + col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum ); + + // check + if ( col == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLColAttribute", "01000", -1, "Invalid col num" ); + return SQL_ERROR; + } + + // get value from descriptor as per field type + switch ( pFldID ) { + // numeric types clubbed together + case SQL_DESC_AUTO_UNIQUE_VALUE: // is col auto-incrementing + case SQL_DESC_CASE_SENSITIVE: // is col case-insensitive + case SQL_DESC_TYPE: // verbose type + case SQL_DESC_CONCISE_TYPE: // concise type + case SQL_DESC_COUNT: // no.of highest bound column + case SQL_DESC_LENGTH: + case SQL_DESC_DISPLAY_SIZE: + case SQL_DESC_OCTET_LENGTH: + case SQL_DESC_FIXED_PREC_SCALE: + case SQL_DESC_NULLABLE: + case SQL_DESC_NUM_PREC_RADIX: + case SQL_DESC_PRECISION: + case SQL_DESC_SCALE: + case SQL_DESC_SEARCHABLE: + case SQL_DESC_UNNAMED: + case SQL_DESC_UNSIGNED: + case SQL_DESC_UPDATABLE: + // added for Excel + case SQL_COLUMN_LENGTH: + case SQL_COLUMN_PRECISION: + case SQL_COLUMN_SCALE: + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pNumValuePtr, -1, NULL , isANSI ); + break; + + // char types clubbed together + + case SQL_DESC_BASE_TABLE_NAME: // table name for column + case SQL_DESC_CATALOG_NAME: // database name + case SQL_DESC_LITERAL_PREFIX: + case SQL_DESC_LITERAL_SUFFIX: + case SQL_DESC_LOCAL_TYPE_NAME: + case SQL_DESC_TYPE_NAME: + case SQL_DESC_SCHEMA_NAME: + case SQL_DESC_TABLE_NAME: + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, pDataPtr, pDataSize, + pDataSizePtr ? &n : NULL, isANSI ); + + if ( pDataSizePtr ) + { *pDataSizePtr = ( Word ) n; } + + break; + + case SQL_DESC_BASE_COLUMN_NAME: + case SQL_DESC_LABEL: + case SQL_DESC_NAME: + // //// + // as a special case the name length may be required without the actual name + ////// + StrPtr cname; + Word cnamesize; + + if ( pDataPtr ) { + cname = ( StrPtr ) pDataPtr; + cnamesize = pDataSize; + } + + else { + cname = new Char[256]; // arbitary + cnamesize = 255; + } + + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, pFldID, cname, cnamesize, + pDataSizePtr ? &n : NULL, isANSI ); + + if ( pDataPtr == NULL ) + { delete[] cname; } + + if ( pDataSizePtr ) + { *pDataSizePtr = ( Word ) n; } + + break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLColAttribute unknown attr, ColNum: %d, FldID: %d\n", pColNum, pFldID ) ); + return SQL_ERROR; + } + //unique_ptr temp ( wchar2char ( ( wchar_t* ) pDataPtr ) ); + //__ODBCLOG(_ODBCLogMsg(LogLevel_INFO, "_SQLColAttribute_basic was called - Stmt:%d, ColNum:%d, FldId:%d, pDataStr:%s, pDataSize:%d, pDataSizePtr:%d(n:%d), pNumValPtr:%d", + // pStmt, pColNum, pFldID, temp.get(), pDataSize, pDataSizePtr, n, pNumValuePtr ? *(( Long* )pNumValuePtr):-1)); + return SQL_SUCCESS; +} + + +#ifdef _WIN64 +RETCODE SQL_API SQLColAttributeW ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLUSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr, + SQLLEN* pNumValuePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); + RETCODE code = _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, + false ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) ); + return code; +} + +RETCODE SQL_API SQLColAttribute ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLUSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr, + SQLLEN* pNumValuePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); + return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true ); +} + +#else +RETCODE SQL_API SQLColAttributeW ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLUSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr, + SQLPOINTER pNumValuePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); + RETCODE code = _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, + false ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the return code is %d", code ) ); + return code; +} + +RETCODE SQL_API SQLColAttribute ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLUSMALLINT pFldID, + SQLPOINTER pDataPtr, + SQLSMALLINT pDataSize, + SQLSMALLINT* pDataSizePtr, + SQLPOINTER pNumValuePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLColAttributeW called, ColNum: %d, FldID: %d", pColNum, pFldID ) ); + return _SQLColAttribute_basic ( pStmt, pColNum, pFldID, pDataPtr, pDataSize, pDataSizePtr, pNumValuePtr, true ); +} +#endif + +// ---------------------------------------------------------------------- +// to get the basic set of ARD col attributes, ie details recd. from server --- FROM IRD +// SQLDescribeCol returns the result descriptor �� column name,type, column size, decimal digits, and nullability (from msdn) +// kylin specific +// ---------------------------------------------------------------------- + +SQLRETURN SQL_API _SQLDescribeCol_basic ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + void* pColNamePtr, + SQLSMALLINT pColNameSize, + SQLSMALLINT* pColNameSizePtr, + SQLSMALLINT* pDataTypePtr, + SQLULEN* pColSizePtr, + SQLSMALLINT* pDecimalDigitsPtr, + SQLSMALLINT* pNullablePtr , + bool isANSI + ) { + Long n; + SQLResponse* ird; + pIRDItem col; + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + + // precaution + if ( pColNum == 0 ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "bad params" ); + return SQL_ERROR; + } + + // get the row descriptor obtained with response + ird = ( ( ( pODBCStmt ) pStmt )->IRD ).RowDesc.get(); + + // check + if ( ird == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "No resultset or no col descriptors" ); + return SQL_ERROR; + } + + // find the xth element/col + col = _SQLGetIRDItem ( & ( ( ( pODBCStmt ) pStmt )->IRD ), pColNum ); + + // check + if ( col == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLDescribeCol", "01000", -1, "Invalid col num" ); + return SQL_ERROR; + } + + // COL-NAME ie title + if ( pColNamePtr ) { + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_BASE_COLUMN_NAME, pColNamePtr, + pColNameSize, pColNameSizePtr ? &n : NULL, isANSI ); + + // here should return length of characters + if ( pColNameSizePtr ) { + if (isANSI) { + *pColNameSizePtr = ( Word ) n; + } + else { + *pColNameSizePtr = ( Word ) ( n / 2 ); + } + } + + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, (wchar_t*)pColNamePtr ) ); + } + + // COL-DATA TYPE + + if ( pDataTypePtr ) { + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_CONCISE_TYPE, pDataTypePtr, -1, + NULL, isANSI ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "data type: %d", *pDataTypePtr ) ); + } + + // COL-SIZE + + if ( pColSizePtr ) { + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_LENGTH, pColSizePtr, -1, NULL, + isANSI ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "column size: %d", *pColSizePtr ) ); + } + + // COL-DECIMAL + + if ( pDecimalDigitsPtr ) { + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_SCALE, pDecimalDigitsPtr, -1, NULL, + isANSI ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "decimal scale: %d", *pDecimalDigitsPtr ) ); + } + + // COL-NULLABLE + + if ( pNullablePtr ) { + _SQLGetIRDItemField ( & ( ( ( pODBCStmt ) pStmt )->IRD ), col, pColNum, SQL_DESC_NULLABLE, pNullablePtr, -1, NULL, + isANSI ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "nullable: %d", *pNullablePtr ) ); + } + + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLDescribeCol returned" ) ); + return SQL_SUCCESS; +} + +SQLRETURN SQL_API SQLDescribeColW ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLWCHAR* pColNamePtr, + SQLSMALLINT pColNameSize, + SQLSMALLINT* pColNameSizePtr, + SQLSMALLINT* pDataTypePtr, + SQLULEN* pColSizePtr, + SQLSMALLINT* pDecimalDigitsPtr, + SQLSMALLINT* pNullablePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLDescribeColW. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d", + pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) ); + return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, + pDecimalDigitsPtr, pNullablePtr , false ); +} + +SQLRETURN SQL_API SQLDescribeCol ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLCHAR* pColNamePtr, + SQLSMALLINT pColNameSize, + SQLSMALLINT* pColNameSizePtr, + SQLSMALLINT* pDataTypePtr, + SQLULEN* pColSizePtr, + SQLSMALLINT* pDecimalDigitsPtr, + SQLSMALLINT* pNullablePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLDescribeCol. Col: %d, ColNamePtr: %d, ColNameSize: %d, ColNameSizePtr: %d, DataTypePtr: %d, ColSizePtr: %d, DecDigitsPtr: %d, NullPtr: %d", + pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, pDecimalDigitsPtr, pNullablePtr ) ); + return _SQLDescribeCol_basic ( pStmt, pColNum, pColNamePtr, pColNameSize, pColNameSizePtr, pDataTypePtr, pColSizePtr, + pDecimalDigitsPtr, pNullablePtr , true ); +} + +// ----------------------------------------------------------------------- +// to bind a column to with details from application --- TO ARD +// kylin specific, no change required +// ----------------------------------------------------------------------- + +/* + + From msdn: + + SQLRETURN SQLBindCol( + SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, + SQLSMALLINT TargetType, + SQLPOINTER TargetValuePtr, + SQLLEN BufferLength, + SQLLEN * StrLen_or_Ind); + +*/ +RETCODE SQL_API SQLBindCol ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLSMALLINT pDataType, + SQLPOINTER pDataPtr, + SQLLEN pDataSize, + SQLLEN* pDataSizePtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLBindCol called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d", + pColNum, pDataType, pDataPtr, pDataSize ) ); + pODBCARD ard; // application row descriptor + pARDItem ardcol; // application row descriptor item + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + // extract the appl. row descriptor from stmt + ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); + // get the specified column if already bound + ardcol = _SQLGetARDItem ( ard, pColNum ); + + // EXISTS + + if ( ardcol != NULL ) { + // check if total unbind is required + if ( pDataPtr == NULL && pDataSizePtr == NULL ) { + // detach it from ARD link list + _SQLDetachARDItem ( ard, ardcol ); + // free + delete ardcol; + } + + else { + // unbind/rebind col details + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 ); + // reset the source data type + ardcol->SrcDataType = 0; + } + + return SQL_SUCCESS; + } + + // DOES NOT EXIST + + // check for bad params + if ( pDataPtr == NULL && pDataSizePtr == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Bad params" ); + return SQL_ERROR; + } + + // check for bad params + else if ( pDataSize < 0 ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLBindCol", "01000", -1, "Invalid buffer length" ); + return SQL_ERROR; + } + + // CREATE + // allocate a new col-item + ardcol = new ARDItem; + // reset + _SQLSetARDItemFieldsDefault ( ardcol, pColNum ); + // set all values - bind + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_DATA_PTR, pDataPtr, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_CONCISE_TYPE, ( void* ) pDataType, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_LENGTH, ( void* ) pDataSize, -1 ); + _SQLSetARDItemField ( ard, ardcol, pColNum, SQL_DESC_OCTET_LENGTH_PTR, pDataSizePtr, -1 ); + // attach it to link list + _SQLAttachARDItem ( ard, ardcol ); + return SQL_SUCCESS; +} + + +// --------------------------------------------------------------------- +// to get the number of columns in result --- COUNTING ELEMENTS IN IRD.ROWDESC +// Kylin specific +// --------------------------------------------------------------------- + +RETCODE SQL_API SQLNumResultCols ( SQLHSTMT pStmt, SQLSMALLINT* pColCountPtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called" ) ); + SQLResponse* rowdesc; + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + // caller safe + * ( ( SQLSMALLINT* ) pColCountPtr ) = 0; + // get the row desciptor + rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); + + if ( rowdesc == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLNumResultCols", "01000", -1, "no resultset or IRD" ); + return SQL_ERROR; + } + + // count the number of columns + * ( ( SQLSMALLINT* ) pColCountPtr ) = ( SQLSMALLINT ) ( rowdesc->columnMetas.size() ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNumResultCols called returned: %d", + * ( ( SQLSMALLINT* ) pColCountPtr ) ) ); + return SQL_SUCCESS; +} + + +// ---------------------------------------------------------------------- +// to count the number of rows in the current result --- COUNTING ELEMENTS IN IRD +// ---------------------------------------------------------------------- + +RETCODE SQL_API SQLRowCount ( HSTMT pStmt, SQLLEN* pDataPtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount called" ) ); + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + *pDataPtr = ( ( pODBCStmt ) pStmt )->RowCount; + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLRowCount returned: %d", *pDataPtr ) ); + return SQL_SUCCESS; +} + +// ----------------------------------------------------------------------- +// to return the next row from the resultset +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLFetch ( HSTMT pStmt ) { + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + // all fetch occur thru the local function _SQLFetch + /* + RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, + Word pFetchOrientation, + Long pFetchOffset, + ULong* pRowCountPtr, + UWord* pRowStatusArray ) + */ + RETCODE ret = _SQLFetch ( ( pODBCStmt ) pStmt, SQL_FETCH_NEXT, + ( ( pODBCStmt ) pStmt )->ARD.RowArraySize > 0 ? ( ( pODBCStmt ) pStmt )->ARD.RowArraySize : 1, + ( ( pODBCStmt ) pStmt )->IRD.RowsProcessedPtr, ( ( pODBCStmt ) pStmt )->IRD.ArrayStatusPtr ); + + if ( ret == SQL_NO_DATA ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_INFO, "Last row of current query has been fetched" ) ); + } + + return ret; +} + +// ----------------------------------------------------------------------- +// to fetch the specified rowset of data from the result set +// Version Introduced: ODBC 1.0 Standards Compliance: Deprecated (from msdn) +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLExtendedFetch ( SQLHSTMT pStmt, + SQLUSMALLINT pFetchOrientation, + SQLINTEGER pFetchOffset, + SQLUINTEGER* pRowCountPtr, + SQLUSMALLINT* pRowStatusArray ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, + "SQLExtendedFetch called, Stmt: %d, FO: %d, Offset: %d, Rcount: %d, RowStatus: %d", pStmt, pFetchOrientation, + pFetchOffset, pRowCountPtr, pRowStatusArray ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch is not implemented " ) ); + return SQL_ERROR; + Long n; + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + // free diags + _SQLFreeDiag ( _DIAGSTMT ( pStmt ) ); + + // only fetch next supported + if ( pFetchOrientation != SQL_FETCH_NEXT ) { + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLExtendedFetch option not supported, FetchOrientation: %d", pFetchOrientation ) ); + return SQL_ERROR; + } + + // check if number of rows explicitly specified + if ( pFetchOffset <= 0 ) + { n = ( ( pODBCStmt ) pStmt )->ARD.RowArraySize; } + + // use default rowset size as a fallback + if ( n <= 0 ) + { n = 1; } + + return _SQLFetch ( ( pODBCStmt ) pStmt, pFetchOrientation, n, pRowCountPtr, pRowStatusArray ); +} + + +// ----------------------------------------------------------------------- +// to fetch the specified rowset of data from the result set +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLFetchScroll ( SQLHSTMT pStatementHandle, + SQLSMALLINT pFetchOrientation, + SQLINTEGER pFetchOffset ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLFetchScroll called" ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLFetchScroll not implemented" ) ); + return SQL_ERROR; +} + + +// ----------------------------------------------------------------------- +// to send data for a parameter or column to the driver at statement execution time +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLPutData ( SQLHSTMT pStmt, + SQLPOINTER pDataPtr, + SQLINTEGER pDataSize ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLPutData called" ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLPutData not implemented" ) ); + return SQL_ERROR; +} + +// ----------------------------------------------------------------------- +// to iterate through multiple resultsets +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLMoreResults ( HSTMT pStmt ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLMoreResults called" ) ); + + pODBCStmt odbcStmt = (pODBCStmt)pStmt; + if (odbcStmt->IRD.RowDesc != NULL ) { + // ------- THIS CASE SHOULD NOT OCCUR ---------- + // check if position is currently unknown + if ( odbcStmt->CurRowsetStartRow == NULL && odbcStmt->CurRowsetStartRowPos == 0 ) { + // position to first row ( both the pointers ) + if (GetIfExist ( odbcStmt->IRD.RowDesc->results, 1 ) ) + { + return SQL_SUCCESS; + } + } + // ----------------------------------------------- + // position to next row if already position is known + else if ( odbcStmt->CurRowsetEndRow != NULL ) { + // position to next row + if (GetIfExist ( odbcStmt->IRD.RowDesc->results, odbcStmt->CurRowsetEndRowPos ) ) + { + return SQL_SUCCESS; + } + } + return SQL_NO_DATA; + } + return SQL_ERROR; +} + +// ----------------------------------------------------------------------- +// to get a driver specific version of specified sql statement +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLNativeSql ( SQLHDBC pConn, + SQLCHAR* pInStmtText, + SQLINTEGER pInStmtTextLen, + SQLCHAR* pOutStmtText, + SQLINTEGER pOutStmtTextLen, + SQLINTEGER* pOutStmtTextLenPtr ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLNativeSql called" ) ); + __ODBCPOPMSG ( _ODBCPopMsg ( "SQLNativeSql not implemented" ) ); + return SQL_ERROR; +} + + + + +// ----------------------------------------------------------------------- +// to convert and transfer col data for application +// ----------------------------------------------------------------------- + +//mhb TODO, check if the sqltype defined here match from c# +RETCODE SQL_API _SQLColConvert ( pODBCStmt pStmt, + void* pTgtDataPtr, + Long* pTgtDataSizePtr, + const wchar_t* pSrcColData, + pARDItem pARDCol, + bool isSigned ) { + //check out this for SQL data type to C data type mapping + //http://msdn.microsoft.com/en-us/library/ms714556(v=vs.85).aspx + // note + // this function actually determines the conversion + // required to transfer the data + Word pSrcDataType = pARDCol->SrcDataType; + Word pTgtDataType = pARDCol->DataConciseType; + Long pTgtDataSize = pARDCol->DataSize; + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLColConvert called" ) ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "The SrcDataType is %d, the TgtDataType is %d, the TgtDataSize is %d", + pSrcDataType, pTgtDataType, pTgtDataSize ) ); + + // TARGET TYPE IS LEFT TO OUR DRIVER + // check if target type is open + if ( pTgtDataType == SQL_DEFAULT ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is SQL_DEFAULT, use default type mapping." ) ); + + // determine targettype based on data-source type + // check out this http://msdn.microsoft.com/en-us/library/ms716298(v=vs.85).aspx for default type mapping + switch ( pSrcDataType ) { + case SQL_CHAR: + pTgtDataType = SQL_C_CHAR; + break; + + case SQL_VARCHAR: + pTgtDataType = SQL_C_CHAR; + break; + + case SQL_WCHAR: + pTgtDataType = SQL_C_WCHAR; + break; + + case SQL_WVARCHAR: + pTgtDataType = SQL_C_WCHAR; + break; + + case SQL_DECIMAL: + pTgtDataType = SQL_C_CHAR; + break; + + case SQL_BIT: + pTgtDataType = SQL_C_BIT; + break; + + case SQL_TINYINT: + if ( isSigned ) + { pTgtDataType = SQL_C_STINYINT; } + + else + { pTgtDataType = SQL_C_UTINYINT; } + + break; + + case SQL_SMALLINT: + if ( isSigned ) + { pTgtDataType = SQL_C_SSHORT; } + + else + { pTgtDataType = SQL_C_USHORT; } + + break; + + case SQL_INTEGER: + if ( isSigned ) + { pTgtDataType = SQL_C_SLONG; } + + else + { pTgtDataType = SQL_C_ULONG; } + + break; + + case SQL_BIGINT: + if ( isSigned ) + { pTgtDataType = SQL_C_SBIGINT; } + + else + { pTgtDataType = SQL_C_UBIGINT; } + + break; + + case SQL_FLOAT: + pTgtDataType = SQL_C_FLOAT; + break; + + case SQL_DOUBLE: + pTgtDataType = SQL_C_DOUBLE; + break; + + case SQL_TYPE_DATE: + pTgtDataType = SQL_C_CHAR; + break; + + case SQL_TYPE_TIME: + pTgtDataType = SQL_C_CHAR; + break; + + case SQL_TYPE_TIMESTAMP: + pTgtDataType = SQL_C_CHAR; + break; + + //case SQL_C_SLONG: + //case SQL_C_ULONG: // unsigned long + //case SQL_C_USHORT: + //case SQL_C_SSHORT: + //case SQL_NUMERIC: + //case SQL_REAL: + // pTgtDataType = pSrcDataType; + // break; + + default: + __ODBCPOPMSG ( _ODBCPopMsg ( "The data type %d not implemented", pSrcDataType ) ); + return SQL_ERROR; + break; + } + } + + else { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "pTgtDataType is NOT SQL_DEFAULT, it is %d", pTgtDataType ) ); + } + + // TARGET TYPE IS CHAR + // as an optimization, check if the application + // or target data type is char. since the data from + // server is already in char format. the data can + // easily be transferred without incurring any + // conversion overhead + unique_ptr pTextInAnsi ( wchar2char ( pSrcColData ) ); + + // check if char type + if ( pTgtDataType == SQL_CHAR || pTgtDataType == SQL_VARCHAR ) { + // only in case of src data being bool a conversion is required + if ( pSrcDataType == SQL_BIT ) { + // prepare a converted single char bool string + Char src[2]; + + if ( pTextInAnsi.get() == NULL ) + { src[0] = '0'; } + + else + { src[0] = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? '1' : '0'; } + + src[1] = 0; + // transfer the bool string + return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, src, -1 ); + } + + else { + // transfer the string as it is + return _SQLCopyCharData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pTextInAnsi.get(), + -1 ); + } + } + else if ( pTgtDataType == SQL_WCHAR || pTgtDataType == SQL_WVARCHAR ) { + return _SQLCopyWCharDataW ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pARDCol->DataSize, pTgtDataSizePtr, 32, pSrcColData, -1 ); + } + + // TARGET TYPE IS NOT CHAR + + // try using a numeric conversion + switch ( _SQLCopyNumData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType , + pTgtDataSizePtr ) ) { + case -1: + return SQL_ERROR; + + case 0: + return SQL_SUCCESS; + + default: + break; + } + + // try using a date/time conversion + switch ( _SQLCopyDateTimeData ( _DIAGSTMT ( pStmt ), pTgtDataPtr, pTgtDataType, pTextInAnsi.get(), pSrcDataType ) ) { + case -1: + return SQL_ERROR; + + case 0: + return SQL_SUCCESS; + + default: + break; + } + + // try using SQL_BIT data type ie bool + if ( pTgtDataType == SQL_BIT ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "the target data type is SQL_C_BIT" ) ); + + // prepare a converted single char bool string + if ( pTextInAnsi.get() == NULL ) + { * ( ( char* ) pTgtDataPtr ) = 0; } + + else + { * ( ( char* ) pTgtDataPtr ) = ( pTextInAnsi.get() [0] == 'T' || pTextInAnsi.get() [0] == '1' || pTextInAnsi.get() [0] == 't' ) ? 1 : 0; } + + return SQL_SUCCESS; + } + + // error condition + __ODBCPOPMSG ( _ODBCPopMsg ( "_SQLColConvert - Unknown data type, Target: %d, Source: %d", pTgtDataType, + pSrcDataType ) ); + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLColConvert", "01000", -1, "Unknown data type, Target: %d, Source: %d", + pTgtDataType, pSrcDataType ); + return SQL_ERROR; +} + + +// ----------------------------------------------------------------------- +// to get the specified column data from +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFetchCol ( pODBCStmt pStmt, + pARDItem pARDCol, //ard + SQLResponse* pRowDesc,// ird + SQLRowContent* pRowData ) { //content + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetchCol called" ) ); + // note + // this function checks the binding type and positions the pointer + // for copying the data accordingly. It takes into account the + // current row position in rowset, the initial min increment specified + // by client and the size of the row or col buffer + Long i; + Long j; + Long* tgtsizeptr; // target size ptr + void* tgtdataptr; // target data ptr + const wchar_t* srcdata; // source data + SelectedColumnMeta* coldesc; + // COMPUTE DATA AND SIZE PTR + // get the row pos in current rowset + i = ( pStmt->CurRowsetEndRowPos - pStmt->CurRowsetStartRowPos ); + // compute min increment + j = ( pStmt->ARD.BindOffsetPtr ) ? * ( pStmt->ARD.BindOffsetPtr ) : 0; + + // check the binding type + if ( pStmt->ARD.BindTypeOrSize != SQL_BIND_BY_COLUMN ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize not euqal to SQL_BIND_BY_COLUMN" ) ); + // note + Long k; + // compute row-size increment + k = ( pStmt->ARD.BindTypeOrSize ); + // compute target col and size ptr + tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * k ) ); + tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * k ) ); + } + + // column-wise binding + else { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "ARD bindtypeorsize euqal to SQL_BIND_BY_COLUMN" ) ); + // move both data and size ptr in the array + //TODO find out where the pARDCol->DataSize if set + tgtdataptr = ( void* ) ( ( ( Char* ) ( pARDCol->DataPtr ) ) + j + ( i * pARDCol->DataSize ) ); // use based on data type + tgtsizeptr = ( Long* ) ( ( ( Char* ) ( pARDCol->SizePtr ) ) + j + ( i * sizeof ( Long ) ) ); + } + + // PRECAUTION + + if ( tgtdataptr ) { * ( ( Char* ) tgtdataptr ) = 0; } + + if ( tgtsizeptr ) { * ( ( Long* ) tgtsizeptr ) = 0; } + + // COLLECT AND CHECK + // get col desc for specified col ( response ) + coldesc = pRowDesc->columnMetas.at ( pARDCol->ColNum - 1 ); + //if ( coldesc == NULL ) { + // _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" ); + // return SQL_SUCCESS_WITH_INFO; // no col for specified index + //} + // get the col data for specfied col ( response ) + srcdata = pRowData->contents.at ( pARDCol->ColNum - 1 ).c_str(); + + //coldata = SOAPGetChildElemX ( pRowData, pARDCol->ColNum ); + //if ( coldata == NULL ) { + + // _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "01000", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, "column not found in resultset for specified index" ); + // return SQL_SUCCESS_WITH_INFO; // no col for specified index + //} + + // get col value as string + //srcdata = SOAPGetElemText ( coldata ); + + // NULL DATA // note: a text of NULL indicates NULL data from server + + // check if data is NULL + if ( srcdata == NULL || _wcsicmp ( srcdata, L"NULL" ) == 0 ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "srcdata is null" ) ); + + // check if a size indicator is available + if ( tgtsizeptr == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchCol", "22002", -1, pStmt->CurRowsetEndRowPos, pARDCol->ColNum, + "Indicator variable required but not supplied" ); + return SQL_SUCCESS_WITH_INFO; + } + + // set to SQL_NULL_DATA + else { + // indicate null data + * ( ( Long* ) tgtsizeptr ) = SQL_NULL_DATA; + // added precaution for bad appl design + /* if ( tgtdataptr ) + memset ( tgtdataptr, 0, pARDCol->MaxSize );*/ + return SQL_SUCCESS; + } + } + + // check if info about src is also available in ARD col + if ( pARDCol->SrcDataType == 0 ) + { GetIRDColDescInfo ( coldesc, & ( pARDCol->SrcDataType ), & ( pARDCol->SrcDataPrecision ), & ( pARDCol->SrcDataScale ), & ( pARDCol->SrcDataSize ) ); } // collect source data information in form comparable to appl + + // CONVERT AND TRANSFER + //Important!!! + //Notice the specification of different types + //http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.odbc.doc/odbc72.htm + RETCODE ret = _SQLColConvert ( pStmt, tgtdataptr, tgtsizeptr, srcdata, pARDCol, coldesc->isSigned ); + //char buffer[1024]; + //hexDump((char*)tgtdataptr,4,buffer,false); + //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer)); + //hexDump((char*)tgtdataptr,4,buffer,true); + //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,buffer)); + return ret; +} + + +// ----------------------------------------------------------------------- +// to move to the next row with relevant checks +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFetchMoveNext ( pODBCStmt pStmt ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "_SQLFetch MoveNext is called" ) ); + + // check if there is some response of type resultset + if (pStmt->IRD.RowDesc != NULL ) { + // ------- THIS CASE SHOULD NOT OCCUR ---------- + + // check if position is currently unknown + if ( pStmt->CurRowsetStartRow == NULL && pStmt->CurRowsetStartRowPos == 0 ) { + // position to first row ( both the pointers ) + pStmt->CurRowsetStartRowPos = 1; + pStmt->CurRowsetStartRow = GetIfExist ( pStmt->IRD.RowDesc->results, 1 ); + pStmt->CurRowsetEndRowPos = 1; + pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, 1 ); + } + + // ----------------------------------------------- + + // position to next row if already position is known + else if ( pStmt->CurRowsetEndRow != NULL ) { + // position to next row + pStmt->CurRowsetEndRowPos += 1; + pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); + } + + // finally check if there is some data found + if ( pStmt->CurRowsetEndRow == NULL ) { + // put in diag + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" ); + return SQL_NO_DATA; + } + + else + { return SQL_SUCCESS; } + } + + else { + // error situation + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLFetchMoveNext", "01000", -1, "no resultset" ); + return SQL_ERROR; + } +} + +SQLRowContent* GetIfExist ( std::vector& container, int index ) { + index = index - 1; //sql cardinals start at 1 + + if ( index >= ( int ) container.size() ) + { return NULL; } + + else + { return container.at ( index ); } +} + +// ----------------------------------------------------------------------- +// to set the initial row positions for a fetch +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLResetRowPos ( pODBCStmt pStmt ) { + // note + // there r 2 row pointers one is the start row for the current fetch and + // the other is the end row after the current fetch + // this function brings them together and moves them to the first row + // after the cur end row + // a block of rows which is fetched in one go is ROWSET while the full + // result is called RESULTSET + + // check if there is some response of type resultset + if ( + pStmt->IRD.RowDesc != NULL ) { + // check if position is currently unknown + if ( pStmt->CurRowsetEndRow == NULL && pStmt->CurRowsetEndRowPos == 0 ) { + // position to first row ( both the pointers ) + pStmt->CurRowsetEndRowPos = 1; + pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); + } + + // already positioned somewhere + else if ( pStmt->CurRowsetEndRow != NULL ) { + // position to next row + pStmt->CurRowsetEndRowPos += 1; + pStmt->CurRowsetEndRow = GetIfExist ( pStmt->IRD.RowDesc->results, pStmt->CurRowsetEndRowPos ); + } + + // calibrate the first row with end row + pStmt->CurRowsetStartRow = pStmt->CurRowsetEndRow; + pStmt->CurRowsetStartRowPos = pStmt->CurRowsetEndRowPos; + + // finally check if there is some data found + if ( pStmt->CurRowsetStartRow == NULL ) { + // put in diag + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "01000", -1, "SQLFetch - no data" ); + return SQL_NO_DATA; + } + + else + { return SQL_SUCCESS; } + } + + else { + // error situation + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "_SQLResetRowPos", "01000", -1, "no resultset" ); + return SQL_ERROR; + } +} + + +// ----------------------------------------------------------------------- +// to return the next row from the resultset +// ----------------------------------------------------------------------- + +RETCODE SQL_API _SQLFetch ( pODBCStmt pStmt, + Word pFetchOrientation, + Long pFetchOffset, //ARD.RowArraySize + ULong* pRowCountPtr, //IRD.RowsProcessedPtr + UWord* pRowStatusArray ) { //ArrayStatusPtr + // note + // fetchoffset is treated as the number of rows to fetch + bool flgNoData; + Long i, n1, n2; + RETCODE s; + SQLRowContent* rowdata; + SQLResponse* rowdesc; + pODBCARD ard; + pARDItem ardcol; + + // CALLER SAFE + + // caller safe for row fetched + if ( pRowCountPtr ) + { *pRowCountPtr = 0; } + + // caller safe for each row status + if ( pRowStatusArray ) + for ( i = 0; i < pFetchOffset; i ++ ) { pRowStatusArray[i] = SQL_ROW_NOROW; } + + // RESET POSITION OR SET INITIAL POSITIONS + + // postions the row counter for fetch start + if ( ( s = _SQLResetRowPos ( ( pODBCStmt ) pStmt ) ) != SQL_SUCCESS ) + { return s; } + + // COLLECT INFO to START + // get the row desc - ird + rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); + // get the row desc - ard + ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); + + // MAIN LOOP to fetch rowset number of rows + // loop to fetch the rows + for ( i = 0, n1 = 0, n2 = 0, flgNoData = FALSE; i < pFetchOffset && flgNoData == FALSE; i ++ ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get One Row:" ) ); + + // check if first row or not + if ( i != 0 ) { + // move to next row if not first time + switch ( _SQLFetchMoveNext ( pStmt ) ) { + case SQL_NO_DATA: + flgNoData = TRUE; // can continue + continue; + + case SQL_ERROR: + return SQL_ERROR; // not continuing + + default: // case SQL_SUCCESS: + break; + } + } + + // get the current row data + rowdata = pStmt->CurRowsetEndRow; + + // LOOP to fetch cols of one row + + // loop to put data in all bound cols + for ( ardcol = ard->BindCols; ardcol != NULL; ardcol = ardcol->Next ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Get one column:" ) ); + // get data using _SQLFetchCol + s = _SQLFetchCol ( pStmt, ardcol, rowdesc, rowdata ); + + // update row status + switch ( s ) { + case SQL_SUCCESS: + if ( pRowStatusArray && pRowStatusArray[i] == SQL_ROW_NOROW ) { pRowStatusArray[i] = SQL_ROW_SUCCESS_WITH_INFO; } + + break; + + case SQL_SUCCESS_WITH_INFO: + ++ n1; // rows with info + + if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_SUCCESS_WITH_INFO; } + + break; + + default: + ++ n2; // no. of rows with error + + if ( pRowStatusArray ) { pRowStatusArray[i - 1] = SQL_ROW_ERROR; } + } + } + + // update the number of rows fetched + if ( pRowCountPtr ) { *pRowCountPtr = i + 1; } + } + + // check if no data + if ( flgNoData == TRUE && i <= 0 ) + { return SQL_NO_DATA; } + + // check if all error + else if ( i > 0 && n2 == i ) + { return SQL_ERROR; } + + // check if any success with info + else if ( i > 0 && n1 > 0 ) + { return SQL_SUCCESS_WITH_INFO; } + + // all success + else { + return SQL_SUCCESS; + } +} + + +// ----------------------------------------------------------------------- +// to retrieve long data for a single column in the result set using multiple calls +// ----------------------------------------------------------------------- + +RETCODE SQL_API SQLGetData ( SQLHSTMT pStmt, + SQLUSMALLINT pColNum, + SQLSMALLINT pDataType, + SQLPOINTER pDataPtr, + SQLLEN pDataSize, + SQLLEN* pDataSizePtr ) { + __CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR ); + + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetData called, ColNum: %d, TgtType: %d, ValuePtr: %d, Capacity: %d", + pColNum, pDataType, pDataPtr, pDataSize ) ); + + if ( pColNum < 1 || pColNum > (( pODBCStmt )pStmt)->IRD.DescCount ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "Dynamic SQL error-invalid descriptor index" ); + return SQL_ERROR; + } + + pODBCARD ard; + pARDItem ardcol; + SQLRowContent* rowdata; + SQLResponse* rowdesc; + SQLSMALLINT tgtPDataType; + + ard = & ( ( ( pODBCStmt ) pStmt )->ARD ); + rowdata = ((pODBCStmt)pStmt)->CurRowsetEndRow; + rowdesc = ( ( pODBCStmt ) pStmt )->IRD.RowDesc.get(); + + if ( rowdata == NULL ) { + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "HY010", -1, "CLI-specific condition-function sequence error" ); + return SQL_ERROR; + } + + ardcol = _SQLGetARDItem ( ard, pColNum ); + if (ardcol != NULL) { + /* It's illegal to call SQLGetdata for a "bound" Column */ + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "", "07009", -1, "dynamic SQL error-invalid descriptor index" ); + return SQL_ERROR; + } + + // convert C data type to SQL data type + switch (pDataType) + { + case SQL_C_SBIGINT: + case SQL_C_SLONG: + case SQL_C_SSHORT: + case SQL_C_STINYINT: + tgtPDataType = pDataType - SQL_SIGNED_OFFSET; + break; + case SQL_C_ULONG: + case SQL_C_USHORT: + case SQL_C_UTINYINT: + case SQL_C_UBIGINT: + tgtPDataType = pDataType - SQL_UNSIGNED_OFFSET; + break; + default: + tgtPDataType = pDataType; + break; + } + + // manually bind column information to output + RETCODE ret = SQLBindCol(pStmt, pColNum, tgtPDataType, pDataPtr, pDataSize, pDataSizePtr); + if (ret != SQL_SUCCESS) { + return ret; + } + + ardcol = _SQLGetARDItem ( ard, pColNum ); + ret = _SQLFetchCol ( (pODBCStmt)pStmt, ardcol, rowdesc, rowdata ); + if (ret != SQL_SUCCESS) { + return ret; + } + _SQLDetachARDItem(ard, ardcol); + + /*unique_ptr temp2 ( wchar2char ( ( wchar_t* ) pDataPtr ) ); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Data1: %s", temp2.get())); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "Size1: %d", *pDataSizePtr));*/ + + return SQL_SUCCESS; +} diff --git a/odbc/Driver/KO_INFO.CPP b/odbc/Driver/KO_INFO.CPP index 5a36508..a450749 100644 --- a/odbc/Driver/KO_INFO.CPP +++ b/odbc/Driver/KO_INFO.CPP @@ -1,1197 +1,1192 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// ---------------------------------------------------------------------------- -// -// 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" -#include "JsonConverter.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 ) ); - } - - //// *2 is already done in _SQLCopyWCharData() - /*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 -// ----------------------------------------------------------------------- -RETCODE SQL_API _SQLGetTypeInfoBasic ( HSTMT pStmt, SWORD pDataType ) { - __CHK_HANDLE(pStmt,SQL_HANDLE_STMT,SQL_ERROR); - - std::unique_ptr p; - try { - wstring info = U("{\"columnMetas\":[{\"isNullable\":0,\"displaySize\":10,\"label\":\"TYPE_NAME\",\"name\":\"TYPE_NAME\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"DATA_TYPE\",\"name\":\"DATA_TYPE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"COLUMN_SIZE\",\"name\":\"COLUMN_SIZE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_PREFIX?\",\"name\":\"LITERAL_PREFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_SUFFIX?\",\"name\":\"LITERAL_SUFFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"CREATE_PARAMS?\",\"name\":\"CREATE_PARAMS?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"NULLABLE\",\"name\":\"NULLABLE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"CASE_SENSITIVE?\",\"name\":\"CASE_SENSITIVE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SEARCHABLE?\",\"name\":\"SEARCHABLE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"UNSIGNED_ATTRIBUTE??\",\"name\":\"UNSIGNED_ATTRIBUTE??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"FIXED_PREC_SCALE???\",\"name\":\"FIXED_PREC_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"AUTO_UNIQUE_VALUE?\",\"name\":\"AUTO_UNIQUE_VALUE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"LOCAL_TYPE_NAME???\",\"name\":\"LOCAL_TYPE_NAME???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MINIMUM_SCALE???\",\"name\":\"MINIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MAXIMUM_SCALE???\",\"name\":\"MAXIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SQL_DATA_TYPE?? ?\",\"name\":\"SQL_DATA_TYPE?? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"SQL_DATETIME_SUB?? ??\",\"name\":\"SQL_DATETIME_SUB?? ??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"NUM_PREC_RADIX?? ? ?\",\"name\":\"NUM_PREC_RADIX?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"INTERVAL_PRECISION?? ? ?\",\"name\":\"INTERVAL_PRECISION?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false}],\"results\":[[\"char\",\"1\",\"255\",\"'\",\"'\",null,\"1\",\"0\",\"3\",null,\"0\",null,\"char\",null,null,\"1\",null,null,null]],\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0,\"partial\":false}"); - web::json::value v = web::json::value::parse ( info ); - p = SQLResponseFromJSON ( v ); - } - catch ( const exception& e ) { - std::stringstream ss; - ss << "The error message is: " << e.what(); - std::string s = ss.str(); - __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, s.c_str() ) ); - _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLGetTypeInfoW", "01000", -1, ( char* ) s.c_str() ); - return SQL_ERROR; - } - - if ( p == NULL || p->isException == true || PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) { - return SQL_ERROR; - } - return SQL_SUCCESS; -} - -RETCODE SQL_API SQLGetTypeInfo ( HSTMT pStmt, SWORD pDataType ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfo called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) ); - - return _SQLGetTypeInfoBasic(pStmt, pDataType); -} - -RETCODE SQL_API SQLGetTypeInfoW ( HSTMT pStmt, SWORD pDataType ) { - __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfoW called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) ); - - return _SQLGetTypeInfoBasic(pStmt, pDataType); -} - -// ----------------------------------------------------------------------- -// 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; -} - +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// ---------------------------------------------------------------------------- +// +// 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" +#include "JsonConverter.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 ) ); + } + + 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 +// ----------------------------------------------------------------------- +RETCODE SQL_API _SQLGetTypeInfoBasic ( HSTMT pStmt, SWORD pDataType ) { + __CHK_HANDLE(pStmt,SQL_HANDLE_STMT,SQL_ERROR); + + std::unique_ptr p; + try { + wstring info = U("{\"columnMetas\":[{\"isNullable\":0,\"displaySize\":10,\"label\":\"TYPE_NAME\",\"name\":\"TYPE_NAME\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"DATA_TYPE\",\"name\":\"DATA_TYPE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"COLUMN_SIZE\",\"name\":\"COLUMN_SIZE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_PREFIX?\",\"name\":\"LITERAL_PREFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"LITERAL_SUFFIX?\",\"name\":\"LITERAL_SUFFIX?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"CREATE_PARAMS?\",\"name\":\"CREATE_PARAMS?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"NULLABLE\",\"name\":\"NULLABLE\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"CASE_SENSITIVE?\",\"name\":\"CASE_SENSITIVE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SEARCHABLE?\",\"name\":\"SEARCHABLE?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"UNSIGNED_ATTRIBUTE??\",\"name\":\"UNSIGNED_ATTRIBUTE??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"FIXED_PREC_SCALE???\",\"name\":\"FIXED_PREC_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"AUTO_UNIQUE_VALUE?\",\"name\":\"AUTO_UNIQUE_VALUE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"LOCAL_TYPE_NAME???\",\"name\":\"LOCAL_TYPE_NAME???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":128,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR(128)\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MINIMUM_SCALE???\",\"name\":\"MINIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"MAXIMUM_SCALE???\",\"name\":\"MAXIMUM_SCALE???\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":0,\"displaySize\":5,\"label\":\"SQL_DATA_TYPE?? ?\",\"name\":\"SQL_DATA_TYPE?? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"SQL_DATETIME_SUB?? ??\",\"name\":\"SQL_DATETIME_SUB?? ??\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":10,\"label\":\"NUM_PREC_RADIX?? ? ?\",\"name\":\"NUM_PREC_RADIX?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":10,\"scale\":0,\"columnType\":4,\"columnTypeName\":\"INTEGER\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false},{\"isNullable\":1,\"displaySize\":5,\"label\":\"INTERVAL_PRECISION?? ? ?\",\"name\":\"INTERVAL_PRECISION?? ? ?\",\"schemaName\":null,\"catelogName\":null,\"tableName\":null,\"precision\":5,\"scale\":0,\"columnType\":5,\"columnTypeName\":\"SMALLINT\",\"readOnly\":true,\"writable\":false,\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true,\"autoIncrement\":false,\"definitelyWritable\":false}],\"results\":[[\"char\",\"1\",\"255\",\"'\",\"'\",null,\"1\",\"0\",\"3\",null,\"0\",null,\"char\",null,null,\"1\",null,null,null]],\"affectedRowCount\":0,\"isException\":false,\"exceptionMessage\":null,\"duration\":0,\"partial\":false}"); + web::json::value v = web::json::value::parse ( info ); + p = SQLResponseFromJSON ( v ); + } + catch ( const exception& e ) { + std::stringstream ss; + ss << "The error message is: " << e.what(); + std::string s = ss.str(); + __ODBCLOG ( _ODBCLogMsg ( LogLevel_ERROR, s.c_str() ) ); + _SQLPutDiagRow ( SQL_HANDLE_STMT, pStmt, "SQLGetTypeInfoW", "01000", -1, ( char* ) s.c_str() ); + return SQL_ERROR; + } + + if ( p == NULL || p->isException == true || PutRespToStmt ( ( pODBCStmt ) pStmt, std::move ( p ) ) != GOOD ) { + return SQL_ERROR; + } + return SQL_SUCCESS; +} + +RETCODE SQL_API SQLGetTypeInfo ( HSTMT pStmt, SWORD pDataType ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfo called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) ); + + return _SQLGetTypeInfoBasic(pStmt, pDataType); +} + +RETCODE SQL_API SQLGetTypeInfoW ( HSTMT pStmt, SWORD pDataType ) { + __ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetTypeInfoW called, Stmt: %d, DataType: %d", ( Long ) pStmt, pDataType ) ); + + return _SQLGetTypeInfoBasic(pStmt, pDataType); +} + +// ----------------------------------------------------------------------- +// 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; +} + diff --git a/odbc/Driver/KO_UTILS.CPP b/odbc/Driver/KO_UTILS.CPP index 275c93b..1450dc2 100644 --- a/odbc/Driver/KO_UTILS.CPP +++ b/odbc/Driver/KO_UTILS.CPP @@ -1,594 +1,597 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// --------------------------------------------------------------------------------- -// -// 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 or 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 && x != 10) ) { - __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 ); - - if (x > 10) - { - //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 ); - } - else - { - pTimestampStruct->hour = 0; - pTimestampStruct->minute = 0; - pTimestampStruct->second = 0; - } - - 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 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] = L'\0'; - //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"_SQLCopyWCharDataW has been called, the target string(not truncated) is :")); - //unique_ptr 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 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 -} - - - - +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// --------------------------------------------------------------------------------- +// +// 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 or 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 && x != 10) ) { + __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 ); + + if (x > 10) + { + //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 ); + } + else + { + pTimestampStruct->hour = 0; + pTimestampStruct->minute = 0; + pTimestampStruct->second = 0; + } + + 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 , bool returnByteSize) { + unique_ptr pWCS ( char2wchar ( pSrcData ) ); + return _SQLCopyWCharDataW ( pDiag, pTgtDataPtr, pDataBufSize, pSizePtr, pSizePtrSize, pWCS.get(), pSrcDataSize, returnByteSize); +} +//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, bool returnByteSize ) { + __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 + Long pPtrSizeBuf = n; + if (returnByteSize) { pPtrSizeBuf = 2 * n; } + + if ( pSizePtrSize == 16 ) + { * ( ( Word* ) pSizePtr ) = ( Word ) pPtrSizeBuf; } + + else + { * ( ( Long* ) pSizePtr ) = pPtrSizeBuf; } + + __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] = L'\0'; + //__ODBCLOG(_ODBCLogMsg(LogLevel_DEBUG,"_SQLCopyWCharDataW has been called, the target string(not truncated) is :")); + //unique_ptr 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 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 +} + + + + diff --git a/odbc/Driver/KylinODBC.H b/odbc/Driver/KylinODBC.H index 534a04e..896c9e9 100644 --- a/odbc/Driver/KylinODBC.H +++ b/odbc/Driver/KylinODBC.H @@ -642,9 +642,9 @@ eGoodBad PutRespToStmt ( pODBCStmt pStmt, std::unique_ptr - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - Template - Win32 - - - Template - x64 - - - - - - {B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5} - Driver - - - - Application - v110 - - - Application - v110 - - - DynamicLibrary - v110 - false - MultiByte - - - DynamicLibrary - v110 - false - MultiByte - - - DynamicLibrary - v110 - false - MultiByte - - - DynamicLibrary - v110 - false - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - false - $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) - $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) - - - false - $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) - $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - - - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - false - $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) - $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) - - - false - $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) - $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - - - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - - - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\Intermediate\ - - - - MultiThreaded - Default - true - true - MaxSpeed - true - Level3 - .;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - Use - - - true - NDEBUG;%(PreprocessorDefinitions) - .\Release\driver.tlb - true - Win32 - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\Release\driver.bsc - - - true - true - Console - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies) - .\driver.DEF - true - - - - - - - - - MultiThreaded - Default - true - true - MaxSpeed - true - Level3 - .;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - Use - - - true - NDEBUG;%(PreprocessorDefinitions) - .\Release\driver.tlb - true - - - 0x0409 - NDEBUG;%(PreprocessorDefinitions) - - - true - .\Release\driver.bsc - - - true - true - Console - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies) - .\driver.DEF - - - - - - - - - MultiThreadedDebug - Default - false - Disabled - true - Level3 - true - EditAndContinue - .;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - EnableFastChecks - Use - - - true - _DEBUG;%(PreprocessorDefinitions) - .\driver.tlb - true - Win32 - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\driver.bsc - - - true - true - true - Console - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - cpprest110d_2_0.lib;odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;Common.lib;%(AdditionalDependencies) - .\driver.DEF - - - - - MultiThreadedDebug - Default - false - Disabled - true - Level3 - ProgramDatabase - .;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions) - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - EnableFastChecks - Use - - - true - _DEBUG;%(PreprocessorDefinitions) - .\driver.tlb - true - - - 0x0409 - _DEBUG;%(PreprocessorDefinitions) - - - true - .\driver.bsc - - - true - true - true - Console - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110d_2_0.lib;Common.lib;%(AdditionalDependencies) - .\driver.DEF - - - - - Use - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - - - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - - - - - Use - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\ - $(Platform)\$(Configuration)\driver.pch - - - $(Platform)\$(Configuration)\driver.dll - $(Platform)\$(Configuration)\driver.lib - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + Template + Win32 + + + Template + x64 + + + + + + {B43F2DB9-B3B5-4D66-A0E0-D65D3675EAF5} + Driver + + + + Application + v110 + + + Application + v110 + + + DynamicLibrary + v110 + false + MultiByte + + + DynamicLibrary + v110 + false + MultiByte + + + DynamicLibrary + v110 + false + MultiByte + + + DynamicLibrary + v110 + false + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + false + $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) + $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) + + + false + $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) + $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + false + $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) + $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) + + + false + $(CPPREST_HOME)\Release\include;$(SolutionDir)\Common;C:\Program Files (x86)\Visual Leak Detector\include;$(IncludePath) + $(CPPREST_HOME)\Binaries\$(Platform)\$(Configuration);$(SolutionDir)\Common\$(Platform)\$(Configuration);C:\Program Files (x86)\Visual Leak Detector\lib\Win$(PlatformArchitecture);$(LibraryPath) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + + + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\Intermediate\ + + + + MultiThreaded + Default + true + true + MaxSpeed + true + Level3 + .;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + Use + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\driver.tlb + true + Win32 + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\driver.bsc + + + true + true + Console + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies) + .\driver.DEF + true + false + + + + + + + + + MultiThreaded + Default + true + true + MaxSpeed + true + Level3 + .;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;SHIPPING;%(PreprocessorDefinitions) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + Use + + + true + NDEBUG;%(PreprocessorDefinitions) + .\Release\driver.tlb + true + + + 0x0409 + NDEBUG;%(PreprocessorDefinitions) + + + true + .\Release\driver.bsc + + + true + true + Console + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + odbccp32.lib;odbc32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110_2_0.lib;Common.lib;%(AdditionalDependencies) + .\driver.DEF + + + + + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + true + EditAndContinue + .;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + EnableFastChecks + Use + + + true + _DEBUG;%(PreprocessorDefinitions) + .\driver.tlb + true + Win32 + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\driver.bsc + + + true + true + true + Console + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + cpprest110d_2_0.lib;odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;Common.lib;%(AdditionalDependencies) + .\driver.DEF + + + + + MultiThreadedDebug + Default + false + Disabled + true + Level3 + ProgramDatabase + .;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_WINDOWS;_USRDLL;driver_EXPORTS;_XML_STREAM_SOCK_CLIENT;_NO_ASYNCRTIMP;%(PreprocessorDefinitions) + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + EnableFastChecks + Use + + + true + _DEBUG;%(PreprocessorDefinitions) + .\driver.tlb + true + + + 0x0409 + _DEBUG;%(PreprocessorDefinitions) + + + true + .\driver.bsc + + + true + true + true + Console + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + odbc32.lib;odbccp32.lib;mswsock.lib;ws2_32.lib;winhttp.lib;cpprest110d_2_0.lib;Common.lib;%(AdditionalDependencies) + .\driver.DEF + + + + + Use + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + + + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + + + + + Use + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\driver.pch + + + $(Platform)\$(Configuration)\driver.dll + $(Platform)\$(Configuration)\driver.lib + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + \ No newline at end of file -- 2.3.8 (Apple Git-58)