From f8215eacfd930a0eca65a0b97921977083367290 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Mon, 22 Nov 2010 01:40:16 +0000 Subject: [PATCH] 2010-11-22 02:39 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbodbc/odbc.c ! Fixed remaining wrappers to not make decisions based on result returned by C level ODBC function, and always pass everything back as is. % Applied minor optimization as a result of above. ! Deprecated SQLEXECUTESCALAR() fixed to initialize buffer and length before calling C level ODBC function. ! Fixed one double assignment typo from prev commit. --- harbour/ChangeLog | 12 +++- harbour/contrib/hbodbc/odbc.c | 119 +++++++++++++++------------------- 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index bf62c82ed2..d86b9fa67b 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,16 @@ The license applies to all entries newer than 2009-04-28. */ +2010-11-22 02:39 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbodbc/odbc.c + ! Fixed remaining wrappers to not make decisions based on + result returned by C level ODBC function, and always + pass everything back as is. + % Applied minor optimization as a result of above. + ! Deprecated SQLEXECUTESCALAR() fixed to initialize buffer + and length before calling C level ODBC function. + ! Fixed one double assignment typo from prev commit. + 2010-11-21 21:17 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbsqlit3/hdbcsqlt.prg * contrib/hbpgsql/hdbcpg.prg @@ -122,7 +132,7 @@ (it's not wrapper's job to check success value and act anything depending on it). ; TOFIX: There are some more wrappers which do that: SQLDESCRIBECOL(), - SQLCOLATTRIBUTES(), SQLGETCONNECTATTR(), SQLGETSTMTATTR(). + SQLCOLATTRIBUTES(), SQLGETCONNECTATTR(), SQLGETSTMTATTR(). [DONE] % SQLROWCOUNT(), SQLGETINFO(), SQLNUMRESULTCOLS(), SQLCOLATTRIBUTE(): Minor optimization. ! SQLGETINFO(), SQLNUMRESULTCOLS(), SQLGETSTMTATTR(), SQLSETCONNECTATTR(), SQLGETCONNECTATTR(), SQLDESCRIBECOL(): Setting initial value to parameter retrieved by reference. diff --git a/harbour/contrib/hbodbc/odbc.c b/harbour/contrib/hbodbc/odbc.c index 08a8d4ca08..6aeae35c43 100644 --- a/harbour/contrib/hbodbc/odbc.c +++ b/harbour/contrib/hbodbc/odbc.c @@ -243,7 +243,6 @@ HB_FUNC( SQLGETDATA ) /* hStmt, nField, nType, nLen, @cBuffer --> nRetCode */ if( lLen <= 0 ) lLen = 64; lInitBuff = lLen; - lBuffLen = 0; bBuffer = hb_xgrab( ( HB_SIZE ) lLen + 1 ); result = ! SQL_NO_DATA; @@ -314,7 +313,6 @@ HB_FUNC( SQLDESCRIBECOL ) /* hStmt, nCol, @cName, nLen, @nBufferLen, @nDataType, SQLSMALLINT wDecimals = ( SQLUSMALLINT ) hb_parni( 8 ); SQLSMALLINT wNullable = ( SQLUSMALLINT ) hb_parni( 9 ); SQLTCHAR * buffer; - SQLRETURN result; if( lLen <= 0 ) lLen = 64; @@ -322,28 +320,24 @@ HB_FUNC( SQLDESCRIBECOL ) /* hStmt, nCol, @cName, nLen, @nBufferLen, @nDataType, buffer = ( SQLTCHAR * ) hb_xgrab( lLen * sizeof( SQLTCHAR ) ); buffer[ 0 ] = '\0'; - result = SQLDescribeCol( ( SQLHSTMT ) hb_parptr( 1 ), - ( SQLUSMALLINT ) hb_parni( 2 ), - ( SQLTCHAR * ) buffer, - ( SQLSMALLINT ) lLen, - ( SQLSMALLINT * ) &wBufLen, - ( SQLSMALLINT * ) &wDataType, - ( SQLULEN * ) &wColSize, - ( SQLSMALLINT * ) &wDecimals, - ( SQLSMALLINT * ) &wNullable ); + hb_retni( SQLDescribeCol( ( SQLHSTMT ) hb_parptr( 1 ), + ( SQLUSMALLINT ) hb_parni( 2 ), + ( SQLTCHAR * ) buffer, + ( SQLSMALLINT ) lLen, + ( SQLSMALLINT * ) &wBufLen, + ( SQLSMALLINT * ) &wDataType, + ( SQLULEN * ) &wColSize, + ( SQLSMALLINT * ) &wDecimals, + ( SQLSMALLINT * ) &wNullable ) ); - if( result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO ) - { - O_HB_STORSTRLEN( ( O_HB_CHAR * ) buffer, ( HB_SIZE ) wBufLen, 3 ); - hb_storni( ( int ) wBufLen, 5 ); - hb_storni( ( int ) wDataType, 6 ); - hb_stornint( wColSize, 7 ); - hb_storni( ( int ) wDecimals, 8 ); - hb_storni( ( int ) wNullable, 9 ); - } + O_HB_STORSTRLEN( ( O_HB_CHAR * ) buffer, ( HB_SIZE ) wBufLen, 3 ); + hb_storni( ( int ) wBufLen, 5 ); + hb_storni( ( int ) wDataType, 6 ); + hb_stornint( wColSize, 7 ); + hb_storni( ( int ) wDecimals, 8 ); + hb_storni( ( int ) wNullable, 9 ); hb_xfree( buffer ); - hb_retni( result ); } HB_FUNC( SQLCOLATTRIBUTE ) /* hStmt, nCol, nField, @cName, nLen, @nBufferLen, @nAttribute --> nRetCode */ @@ -355,8 +349,7 @@ HB_FUNC( SQLCOLATTRIBUTE ) /* hStmt, nCol, nField, @cName, nLen, @nBufferLen, @n #else SQLINTEGER wNumPtr = ( SQLINTEGER ) hb_parnl( 7 ); #endif - void * bBuffer; - SQLRETURN result; + void * bBuffer; if( lLen == 0 ) lLen = 64; @@ -364,32 +357,28 @@ HB_FUNC( SQLCOLATTRIBUTE ) /* hStmt, nCol, nField, @cName, nLen, @nBufferLen, @n bBuffer = hb_xgrab( lLen ); #if ODBCVER >= 0x0300 - result = SQLColAttribute( ( SQLHSTMT ) hb_parptr( 1 ), - ( SQLUSMALLINT ) hb_parni( 2 ), - ( SQLUSMALLINT ) hb_parni( 3 ), - ( SQLPOINTER ) bBuffer, - lLen, - ( SQLSMALLINT * ) &wBufLen, - ( SQLLEN * ) &wNumPtr ); -#else - result = SQLColAttributes( ( SQLHSTMT ) hb_parptr( 1 ), + hb_retni( SQLColAttribute( ( SQLHSTMT ) hb_parptr( 1 ), ( SQLUSMALLINT ) hb_parni( 2 ), ( SQLUSMALLINT ) hb_parni( 3 ), ( SQLPOINTER ) bBuffer, lLen, ( SQLSMALLINT * ) &wBufLen, - ( SQLINTEGER * ) &wNumPtr ); + ( SQLLEN * ) &wNumPtr ) ); +#else + hb_retni( SQLColAttributes( ( SQLHSTMT ) hb_parptr( 1 ), + ( SQLUSMALLINT ) hb_parni( 2 ), + ( SQLUSMALLINT ) hb_parni( 3 ), + ( SQLPOINTER ) bBuffer, + lLen, + ( SQLSMALLINT * ) &wBufLen, + ( SQLINTEGER * ) &wNumPtr ) ); #endif - if( result == SQL_SUCCESS || result == SQL_SUCCESS_WITH_INFO ) - { - hb_storclen( ( char * ) bBuffer, ( HB_SIZE ) wBufLen, 4 ); - hb_storni( ( int ) wBufLen, 6 ); - hb_stornint( wNumPtr, 7 ); - } + hb_storclen( ( char * ) bBuffer, ( HB_SIZE ) wBufLen, 4 ); + hb_storni( ( int ) wBufLen, 6 ); + hb_stornint( wNumPtr, 7 ); hb_xfree( bBuffer ); - hb_retni( result ); } HB_FUNC( SQLFETCHSCROLL ) @@ -512,22 +501,19 @@ HB_FUNC( SQLGETCONNECTATTR ) /* hDbc, nOption, @cOption */ SQLPOINTER buffer[ 512 ]; SQLINTEGER len = 0; buffer[ 0 ] = '\0'; - SQLRETURN result = SQLGetConnectAttr( ( SQLHDBC ) hb_parptr( 1 ), - ( SQLINTEGER ) hb_parnl( 2 ), - ( SQLPOINTER ) buffer, - ( SQLINTEGER ) sizeof( buffer ), - ( SQLINTEGER * ) &len ); - hb_storclen( result == SQL_SUCCESS ? ( char * ) buffer : NULL, len, 3 ); - hb_retni( result ); + hb_retni( SQLGetConnectAttr( ( SQLHDBC ) hb_parptr( 1 ), + ( SQLINTEGER ) hb_parnl( 2 ), + ( SQLPOINTER ) buffer, + ( SQLINTEGER ) sizeof( buffer ), + ( SQLINTEGER * ) &len ) ); + hb_storclen( ( char * ) buffer, len, 3 ); #else char bBuffer[ 512 ]; buffer[ 0 ] = '\0'; - SQLRETURN result = SQLGetConnectOption( ( SQLHDBC ) hb_parptr( 1 ), - ( SQLSMALLINT ) hb_parni( 2 ), - ( SQLPOINTER ) bBuffer ); - - hb_storclen( result == SQL_SUCCESS ? ( char * ) bBuffer : NULL, sizeof( bBuffer ), 3 ); - hb_retni( result ); + hb_retni( SQLGetConnectOption( ( SQLHDBC ) hb_parptr( 1 ), + ( SQLSMALLINT ) hb_parni( 2 ), + ( SQLPOINTER ) bBuffer ) ); + hb_storc( ( char * ) bBuffer, 3 ); #endif } @@ -537,23 +523,19 @@ HB_FUNC( SQLGETSTMTATTR ) /* hStmt, nOption, @cOption */ SQLPOINTER buffer[ 512 ]; SQLINTEGER len = 0; buffer[ 0 ] = '\0'; - SQLRETURN result = SQLGetStmtAttr( ( SQLHSTMT ) hb_parptr( 1 ), - ( SQLINTEGER ) hb_parnl( 2 ), - ( SQLPOINTER ) buffer, - ( SQLINTEGER ) sizeof( buffer ), - ( SQLINTEGER * ) &len ); - - hb_storclen( result == SQL_SUCCESS ? ( char * ) buffer : NULL, len, 3 ); - hb_retni( result ); + hb_retni( SQLGetStmtAttr( ( SQLHSTMT ) hb_parptr( 1 ), + ( SQLINTEGER ) hb_parnl( 2 ), + ( SQLPOINTER ) buffer, + ( SQLINTEGER ) sizeof( buffer ), + ( SQLINTEGER * ) &len ) ); + hb_storclen( ( char * ) buffer, len, 3 ); #else char bBuffer[ 512 ]; buffer[ 0 ] = '\0'; - SQLRETURN result = SQLGetStmtOption( ( SQLHSTMT ) hb_parptr( 1 ), - ( SQLSMALLINT ) hb_parni( 2 ), - ( SQLPOINTER ) bBuffer ); - - hb_storclen( result == SQL_SUCCESS ? ( char * ) bBuffer : NULL, sizeof( bBuffer ), 3 ); - hb_retni( result ); + hb_retni( SQLGetStmtOption( ( SQLHSTMT ) hb_parptr( 1 ), + ( SQLSMALLINT ) hb_parni( 2 ), + ( SQLPOINTER ) bBuffer ) ); + hb_storc( ( char * ) bBuffer, 3 ); #endif } @@ -602,7 +584,8 @@ HB_FUNC( SQLEXECUTESCALAR ) if( result != SQL_NO_DATA ) { char bBuffer[ 256 ]; - SQLLEN lLen; + SQLLEN lLen = 0; + bBuffer[ 0 ] = '\0'; result = SQLGetData( ( SQLHSTMT ) hStmt, ( SQLUSMALLINT ) 1, ( SQLSMALLINT ) SQL_C_CHAR,