blob: d9768d29fc77bf45b7ff5eb18b9ed4516fb06acd [file] [log] [blame]
/*
* 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_ATTR.CPP
//
// Notes: Contains the attribute/option set/get functions
// for environment, connection and statement
// also contains some other functions like setting of
// cursor name etc.
//
// Exported functions:
// SQLSetEnvAttr
// SQLGetEnvAttr
// SQLSetConnectAttr
// SQLGetConnectAttr
// SQLSetStmtAttr
// SQLGetStmtAttr
// SQLGetCursorName
// SQLSetCursorName
// ----------------------------------------------------------------------------
#include "stdafx.h"
// -----------------------------------------------------------------------
// to set environment specific attributes
// -----------------------------------------------------------------------
RETCODE SQL_API SQLSetEnvAttr ( SQLHENV pEnv, SQLINTEGER pAttr, SQLPOINTER pDataPtr, SQLINTEGER pDataSize )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetEnvAttr called" ) );
__CHK_HANDLE ( pEnv, SQL_HANDLE_ENV, SQL_ERROR );
_SQLFreeDiag ( _DIAGENV ( pEnv ) );
switch ( pAttr )
{
case SQL_ATTR_ODBC_VERSION :
( ( pODBCEnv ) pEnv ) -> AttrODBCVersion = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CONNECTION_POOLING :
( ( pODBCEnv ) pEnv ) -> AttrConnPooling = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CP_MATCH :
( ( pODBCEnv ) pEnv ) -> AttrCPMatch = ( ULong ) pDataPtr;
break;
case SQL_ATTR_OUTPUT_NTS :
( ( pODBCEnv ) pEnv ) -> AttrOutputNTS = ( ULong ) pDataPtr;
break;
default :
return SQL_ERROR; // unknown attribute
}
return SQL_SUCCESS;
}
// -----------------------------------------------------------------------
// to get current value of specified env attribute
// -----------------------------------------------------------------------
RETCODE SQL_API SQLGetEnvAttr ( SQLHENV pEnv,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize,
SQLINTEGER* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetEnvAttr called" ) );
__CHK_HANDLE ( pEnv, SQL_HANDLE_ENV, SQL_ERROR );
_SQLFreeDiag ( _DIAGENV ( pEnv ) );
switch ( pAttr )
{
case SQL_ATTR_ODBC_VERSION :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv ) -> AttrODBCVersion;
break;
case SQL_ATTR_CONNECTION_POOLING :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv ) -> AttrConnPooling;
break;
case SQL_ATTR_CP_MATCH :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv ) -> AttrCPMatch;
break;
case SQL_ATTR_OUTPUT_NTS :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCEnv ) pEnv ) -> AttrOutputNTS;
break;
default :
return SQL_ERROR; // unknown attribute
}
return SQL_SUCCESS;
}
// --------------------------------------------------------------------
// to set attributes specific to a connection
// --------------------------------------------------------------------
RETCODE SQL_API SQLSetConnectAttrW ( SQLHDBC hdbc,
SQLINTEGER fAttribute,
SQLPOINTER rgbValue,
SQLINTEGER cbValue )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", fAttribute,
rgbValue, cbValue ) );
RETCODE code = SQLSetConnectAttr ( hdbc, fAttribute, rgbValue, cbValue );
return code;
}
RETCODE SQL_API SQLSetConnectAttr ( SQLHDBC pConn, SQLINTEGER pAttr, SQLPOINTER pDataPtr, SQLINTEGER pDataSize )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
_SQLFreeDiag ( _DIAGCONN ( pConn ) );
switch ( pAttr )
{
case SQL_ATTR_ANSI_APP :
return SQL_ERROR;
case SQL_ATTR_ACCESS_MODE :
( ( pODBCConn ) pConn ) -> AccessMode = ( ULong ) pDataPtr;
break;
case SQL_ATTR_ASYNC_ENABLE :
( ( pODBCConn ) pConn ) -> AsyncEnable = ( ULong ) pDataPtr;
break;
//case SQL_ATTR_AUTO_IPD: read-only
case SQL_ATTR_AUTOCOMMIT :
( ( pODBCConn ) pConn ) -> AutoCommit = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CONNECTION_DEAD :
// (( pODBCConn )pConn)->AutoCommit = ( ULong )pDataPtr;
break;
case SQL_ATTR_CONNECTION_TIMEOUT :
//(( pODBCConn )pConn)->TimeOut = *(( ULong* )pDataPtr );
break;
case SQL_ATTR_CURRENT_CATALOG : // current database
// assumes that current database is what it should be
// return _SQLCopyCharData ( _DIAGCONN(pConn), (( pODBCConn )pConn)->CurrDB, 32, NULL, 16, pDataPtr, pDataSize );
break;
case SQL_ATTR_LOGIN_TIMEOUT :
// (( pODBCConn )pConn)->LoginTimeOut = *(( ULong* )pDataPtr );
break;
case SQL_ATTR_METADATA_ID :
( ( pODBCConn ) pConn ) -> MetaDataID = ( ULong ) pDataPtr;
break;
case SQL_ATTR_ODBC_CURSORS :
( ( pODBCConn ) pConn ) -> ODBCCursors = ( ULong ) pDataPtr;
break;
case SQL_ATTR_PACKET_SIZE :
// not a typical option
return SQL_ERROR;
case SQL_ATTR_QUIET_MODE :
( ( pODBCConn ) pConn ) -> Window = ( ULong ) pDataPtr;
break;
case SQL_ATTR_TRACE :
// only for driver manager
break;
case SQL_ATTR_TRACEFILE :
// only for driver manager
break;
case SQL_ATTR_TRANSLATE_LIB :
// translation still not implemented
break;
case SQL_ATTR_TRANSLATE_OPTION :
// translation still not implemented
break;
case SQL_ATTR_TXN_ISOLATION :
( ( pODBCConn ) pConn ) -> TxnIsolation = ( ULong ) pDataPtr;
break;
case SQL_ATTR_MAX_ROWS :
( ( pODBCConn ) pConn ) -> MaxRows = ( ULong ) pDataPtr;
break;
case SQL_ATTR_QUERY_TIMEOUT :
( ( pODBCConn ) pConn ) -> QueryTimeout = ( ULong ) pDataPtr;
break;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetConnectAttr is not recognized, Attr: %d, DataPtr: %d, DataSize: %d", pAttr,
pDataPtr, pDataSize ) );
return SQL_SUCCESS;
}
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d is done!", pAttr,
pDataPtr, pDataSize ) );
return SQL_SUCCESS;
}
// -----------------------------------------------------------------------
// to get current value of specified conn attribute
// -----------------------------------------------------------------------
RETCODE SQL_API SQLGetConnectAttrW ( SQLHDBC pConn,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize,
SQLINTEGER* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
_SQLFreeDiag ( _DIAGCONN ( pConn ) );
switch ( pAttr )
{
case SQL_ATTR_ACCESS_MODE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AccessMode;
break;
case SQL_ATTR_ASYNC_ENABLE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AsyncEnable;
break;
case SQL_ATTR_AUTO_IPD :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AutoIPD;
break;
case SQL_ATTR_AUTOCOMMIT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AutoCommit;
break;
case SQL_ATTR_CONNECTION_DEAD :
* ( ( ULong* ) pDataPtr ) = SQL_CD_TRUE ;
break;
case SQL_ATTR_CONNECTION_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> TimeOut;
break;
case SQL_ATTR_CURRENT_CATALOG : // current database
return _SQLCopyWCharData ( _DIAGCONN ( pConn ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
case SQL_ATTR_LOGIN_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> LoginTimeOut;
break;
case SQL_ATTR_METADATA_ID :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> MetaDataID;
break;
case SQL_ATTR_ODBC_CURSORS :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> ODBCCursors;
break;
case SQL_ATTR_PACKET_SIZE :
return SQL_ERROR; // not a typical option
case SQL_ATTR_QUIET_MODE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> Window;
break;
case SQL_ATTR_TRACE :
// basically for driver manager
break;
case SQL_ATTR_TRACEFILE :
// basically for driver manager
break;
case SQL_ATTR_TRANSLATE_LIB :
// not implemented
break;
case SQL_ATTR_TRANSLATE_OPTION :
// not implemented
break;
case SQL_ATTR_TXN_ISOLATION :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> TxnIsolation;
break;
case SQL_ATTR_MAX_ROWS :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> MaxRows;
break;
case SQL_ATTR_QUERY_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> QueryTimeout;
break;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetConnectAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr, pDataSize ) );
return SQL_SUCCESS;
}
return SQL_SUCCESS;
}
RETCODE SQL_API SQLGetConnectAttr ( SQLHDBC pConn,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize,
SQLINTEGER* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetConnectAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pConn, SQL_HANDLE_DBC, SQL_ERROR );
_SQLFreeDiag ( _DIAGCONN ( pConn ) );
switch ( pAttr )
{
case SQL_ATTR_ACCESS_MODE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AccessMode;
break;
case SQL_ATTR_ASYNC_ENABLE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AsyncEnable;
break;
case SQL_ATTR_AUTO_IPD :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AutoIPD;
break;
case SQL_ATTR_AUTOCOMMIT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> AutoCommit;
break;
case SQL_ATTR_CONNECTION_DEAD :
* ( ( ULong* ) pDataPtr ) = SQL_CD_TRUE ;
break;
case SQL_ATTR_CONNECTION_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> TimeOut;
break;
case SQL_ATTR_CURRENT_CATALOG : // current database
return _SQLCopyCharData ( _DIAGCONN ( pConn ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
case SQL_ATTR_LOGIN_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> LoginTimeOut;
break;
case SQL_ATTR_METADATA_ID :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> MetaDataID;
break;
case SQL_ATTR_ODBC_CURSORS :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> ODBCCursors;
break;
case SQL_ATTR_PACKET_SIZE :
return SQL_ERROR; // not a typical option
case SQL_ATTR_QUIET_MODE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> Window;
break;
case SQL_ATTR_TRACE :
// basically for driver manager
break;
case SQL_ATTR_TRACEFILE :
// basically for driver manager
break;
case SQL_ATTR_TRANSLATE_LIB :
// not implemented
break;
case SQL_ATTR_TRANSLATE_OPTION :
// not implemented
break;
case SQL_ATTR_TXN_ISOLATION :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> TxnIsolation;
break;
case SQL_ATTR_MAX_ROWS :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> MaxRows;
break;
case SQL_ATTR_QUERY_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCConn ) pConn ) -> QueryTimeout;
break;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetConnectAttr not recognized, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
return SQL_SUCCESS;
}
return SQL_SUCCESS;
}
// --------------------------------------------------------------------
// to set attributes specific to a statement
// --------------------------------------------------------------------
RETCODE SQL_API SQLSetStmtAttrW ( SQLHSTMT pStmt,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetStmtAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
_SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
switch ( pAttr )
{
case 1226 : /* MS SQL Server Extension */
case 1227 :
case 1228 :
break;
case SQL_ATTR_APP_PARAM_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_PARAM_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_APP_ROW_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_ROW_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_ASYNC_ENABLE :
( ( pODBCStmt ) pStmt ) -> AsyncEnable = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CONCURRENCY :
( ( pODBCStmt ) pStmt ) -> Concurrency = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_SCROLLABLE :
( ( pODBCStmt ) pStmt ) -> CursorScroll = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_SENSITIVITY :
( ( pODBCStmt ) pStmt ) -> CursorSensitivity = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_TYPE :
( ( pODBCStmt ) pStmt ) -> CursorType = ( ULong ) pDataPtr;
break;
case SQL_ATTR_ENABLE_AUTO_IPD :
( ( pODBCStmt ) pStmt ) -> AutoIPD = ( ULong ) pDataPtr;
break;
case SQL_ATTR_FETCH_BOOKMARK_PTR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_IMP_PARAM_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_PARAM_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_IMP_ROW_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_ROW_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_KEYSET_SIZE :
( ( pODBCStmt ) pStmt ) -> KeysetSize = ( ULong ) pDataPtr;
break;
case SQL_ATTR_MAX_LENGTH :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_MAX_ROWS :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_METADATA_ID :
( ( pODBCStmt ) pStmt ) -> MetaDataID = ( ULong ) pDataPtr;
break;
case SQL_ATTR_NOSCAN :
( ( pODBCStmt ) pStmt ) -> NoScan = ( ULong ) pDataPtr;
break;
case SQL_ATTR_PARAM_BIND_TYPE :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_BIND_OFFSET_PTR :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_OPERATION_PTR :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_STATUS_PTR :
_SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt ) -> IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAMS_PROCESSED_PTR :
// ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
_SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt ) -> IPD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAMSET_SIZE :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
break;
case SQL_ATTR_QUERY_TIMEOUT :
if ( pDataPtr != NULL )
{
( ( pODBCStmt ) pStmt ) -> QryTimeout = ( ( ULong ) pDataPtr );
}
break;
case SQL_ATTR_RETRIEVE_DATA :
( ( pODBCStmt ) pStmt ) -> RetrieveData = ( ULong ) pDataPtr;
break;
case SQL_ROWSET_SIZE :
case SQL_ATTR_ROW_ARRAY_SIZE :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_BIND_OFFSET_PTR :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_BIND_TYPE :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_OPERATION_PTR :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_STATUS_PTR :
_SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROWS_FETCHED_PTR :
_SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_SIMULATE_CURSOR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
return SQL_ERROR;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetStmtAttrW : Stmt attr - unknown %d", pAttr ) );
return SQL_ERROR;
}
return SQL_SUCCESS;
}
RETCODE SQL_API SQLSetStmtAttr ( SQLHSTMT pStmt,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLSetStmtAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
_SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
switch ( pAttr )
{
case SQL_ATTR_APP_PARAM_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_PARAM_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_APP_ROW_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_APP_ROW_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_ASYNC_ENABLE :
( ( pODBCStmt ) pStmt ) -> AsyncEnable = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CONCURRENCY :
( ( pODBCStmt ) pStmt ) -> Concurrency = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_SCROLLABLE :
( ( pODBCStmt ) pStmt ) -> CursorScroll = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_SENSITIVITY :
( ( pODBCStmt ) pStmt ) -> CursorSensitivity = ( ULong ) pDataPtr;
break;
case SQL_ATTR_CURSOR_TYPE :
( ( pODBCStmt ) pStmt ) -> CursorType = ( ULong ) pDataPtr;
break;
case SQL_ATTR_ENABLE_AUTO_IPD :
( ( pODBCStmt ) pStmt ) -> AutoIPD = ( ULong ) pDataPtr;
break;
case SQL_ATTR_FETCH_BOOKMARK_PTR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_IMP_PARAM_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_PARAM_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_IMP_ROW_DESC :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_IMP_ROW_DESC - Cannot set descriptor" ) );
return SQL_ERROR;
case SQL_ATTR_KEYSET_SIZE :
( ( pODBCStmt ) pStmt ) -> KeysetSize = ( ULong ) pDataPtr;
break;
case SQL_ATTR_MAX_LENGTH :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_MAX_ROWS :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_METADATA_ID :
( ( pODBCStmt ) pStmt ) -> MetaDataID = ( ULong ) pDataPtr;
break;
case SQL_ATTR_NOSCAN :
( ( pODBCStmt ) pStmt ) -> NoScan = ( ULong ) pDataPtr;
break;
case SQL_ATTR_PARAM_BIND_TYPE :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_BIND_OFFSET_PTR :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_OPERATION_PTR :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAM_STATUS_PTR :
_SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt ) -> IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAMS_PROCESSED_PTR :
// ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
_SQLSetIPDField ( & ( ( ( pODBCStmt ) pStmt ) -> IPD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_PARAMSET_SIZE :
_SQLSetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
break;
case SQL_ATTR_QUERY_TIMEOUT :
if ( pDataPtr != NULL )
{
( ( pODBCStmt ) pStmt ) -> QryTimeout = * ( ( ULong* ) pDataPtr );
}
break;
case SQL_ATTR_RETRIEVE_DATA :
( ( pODBCStmt ) pStmt ) -> RetrieveData = ( ULong ) pDataPtr;
break;
case SQL_ROWSET_SIZE :
case SQL_ATTR_ROW_ARRAY_SIZE :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_BIND_OFFSET_PTR :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_BIND_TYPE :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_OPERATION_PTR :
_SQLSetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROW_STATUS_PTR :
_SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_ROWS_FETCHED_PTR :
_SQLSetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize );
break;
case SQL_ATTR_SIMULATE_CURSOR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
return SQL_ERROR;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLSetStmtAttr: Stmt attr - unknown %d", pAttr ) );
return SQL_ERROR;
}
return SQL_SUCCESS;
}
RETCODE SQL_API SQLGetStmtAttrW ( SQLHSTMT pStmt,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize,
SQLINTEGER* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetStmtAttrW, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
return SQLGetStmtAttr ( pStmt, pAttr, pDataPtr, pDataSize, pDataSizePtr );
}
// --------------------------------------------------------------------
// to get attributes specific to a statement
// --------------------------------------------------------------------
RETCODE SQL_API SQLGetStmtAttr ( SQLHSTMT pStmt,
SQLINTEGER pAttr,
SQLPOINTER pDataPtr,
SQLINTEGER pDataSize,
SQLINTEGER* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetStmtAttr, Attr: %d, DataPtr: %d, DataSize: %d", pAttr, pDataPtr,
pDataSize ) );
__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
_SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
switch ( pAttr )
{
case SQL_ATTR_APP_PARAM_DESC :
* ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt ) -> APD );
break;
case SQL_ATTR_APP_ROW_DESC :
* ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt ) -> ARD );
break;
case SQL_ATTR_ASYNC_ENABLE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> AsyncEnable;
break;
case SQL_ATTR_CONCURRENCY :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> Concurrency;
break;
case SQL_ATTR_CURSOR_SCROLLABLE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> CursorScroll;
break;
case SQL_ATTR_CURSOR_SENSITIVITY :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> CursorSensitivity;
break;
case SQL_ATTR_CURSOR_TYPE :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> CursorType;
break;
case SQL_ATTR_ENABLE_AUTO_IPD :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> AutoIPD;
break;
case SQL_ATTR_FETCH_BOOKMARK_PTR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_FETCH_BOOKMARK_PTR - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_IMP_PARAM_DESC :
* ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt ) -> IPD );
break;
case SQL_ATTR_IMP_ROW_DESC :
* ( ( Long* ) pDataPtr ) = ( Long ) & ( ( ( pODBCStmt ) pStmt ) -> IRD );
break;
case SQL_ATTR_KEYSET_SIZE :
* ( ( Long* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> KeysetSize;
break;
case SQL_ATTR_MAX_LENGTH :
* ( ( ULong* ) pDataPtr ) = 0;
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_LENGTH - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_MAX_ROWS :
* ( ( ULong* ) pDataPtr ) = 0;
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_MAX_ROWS - option not implemented" ) );
return SQL_ERROR;
case SQL_ATTR_METADATA_ID :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> MetaDataID;
break;
case SQL_ATTR_NOSCAN :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> NoScan;
break;
case SQL_ATTR_PARAM_BIND_TYPE :
_SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_PARAM_BIND_OFFSET_PTR :
_SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_PARAM_OPERATION_PTR :
_SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_PARAM_STATUS_PTR :
_SQLGetIPDField ( & ( ( ( pODBCStmt ) pStmt ) -> IPD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_PARAMS_PROCESSED_PTR :
// ???? note there is an error in MSDN on SQLSetDescField which says ARD/APD instead of IRD/IPD for this option
_SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize,
pDataSizePtr );
break;
case SQL_ATTR_PARAMSET_SIZE :
_SQLGetAPDField ( & ( ( ( pODBCStmt ) pStmt ) -> APD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_QUERY_TIMEOUT :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> QryTimeout;
break;
case SQL_ATTR_RETRIEVE_DATA :
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> RetrieveData;
break;
case SQL_ROWSET_SIZE :
case SQL_ATTR_ROW_ARRAY_SIZE :
_SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_SIZE, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_ROW_BIND_OFFSET_PTR :
_SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_OFFSET_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_ROW_BIND_TYPE :
_SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_BIND_TYPE, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_ROW_NUMBER :
// ??? in case of rowset being > 1, start row is being returned
* ( ( ULong* ) pDataPtr ) = ( ( pODBCStmt ) pStmt ) -> CurRowsetStartRowPos;
break;
case SQL_ATTR_ROW_OPERATION_PTR :
_SQLGetARDField ( & ( ( ( pODBCStmt ) pStmt ) -> ARD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_ROW_STATUS_PTR :
_SQLGetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ARRAY_STATUS_PTR, pDataPtr, pDataSize, pDataSizePtr );
break;
case SQL_ATTR_ROWS_FETCHED_PTR :
_SQLGetIRDField ( & ( ( ( pODBCStmt ) pStmt ) -> IRD ), SQL_DESC_ROWS_PROCESSED_PTR, pDataPtr, pDataSize,
pDataSizePtr );
break;
case SQL_ATTR_SIMULATE_CURSOR :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQL_ATTR_SIMULATE_CURSOR - option not implemented" ) );
return SQL_ERROR;
default :
__ODBCPOPMSG ( _ODBCPopMsg ( "SQLGetStmtAttr: Stmt attr - unknown %d", pAttr ) );
return SQL_ERROR;
}
return SQL_SUCCESS;
}
// --------------------------------------------------------------------
// to get the name of the current cursor
// --------------------------------------------------------------------
RETCODE SQL_API SQLGetCursorName ( SQLHSTMT pStmt,
SQLCHAR* pDataPtr,
SQLSMALLINT pDataSize,
SQLSMALLINT* pDataSizePtr )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetCursorName called" ) );
__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
_SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
_SQLCopyCharData ( _DIAGSTMT ( pStmt ), pDataPtr, pDataSize, pDataSizePtr, 32, "default", -1 );
return SQL_SUCCESS;
}
// --------------------------------------------------------------------
// to set the name of the current cursor
// --------------------------------------------------------------------
RETCODE SQL_API SQLSetCursorName ( SQLHSTMT pStmt,
SQLCHAR* pDataPtr,
SQLSMALLINT pDataSize )
{
__ODBCLOG ( _ODBCLogMsg ( LogLevel_DEBUG, "SQLGetCursorName called" ) );
__CHK_HANDLE ( pStmt, SQL_HANDLE_STMT, SQL_ERROR );
_SQLFreeDiag ( _DIAGSTMT ( pStmt ) );
return SQL_SUCCESS;
}