diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 342dffcb05..1543171db8 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,11 @@ The license applies to all entries newer than 2009-04-28. */ +2012-11-16 13:35 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) + * harbour/contrib/sddfb/sddfb.c + ! added missing query execution :), multiple field type/value decoding + changes, etc. + 2012-11-16 11:35 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * harbour/contrib/hbodbc/odbc.c * unlock sub-handle pointer items - it can be safely done diff --git a/harbour/contrib/sddfb/sddfb.c b/harbour/contrib/sddfb/sddfb.c index 5dc8039ef6..4ee118202b 100644 --- a/harbour/contrib/sddfb/sddfb.c +++ b/harbour/contrib/sddfb/sddfb.c @@ -110,21 +110,19 @@ static void hb_firebirddd_init( void * cargo ) HB_FUNC_TRANSLATE( SDDFB, SQLBASE ) HB_INIT_SYMBOLS_BEGIN( firebirddd__InitSymbols ) -{ - "SDDFB", { HB_FS_PUBLIC | HB_FS_LOCAL }, { HB_FUNCNAME( SDDFB ) }, NULL -}, +{ "SDDFB", {HB_FS_PUBLIC|HB_FS_LOCAL}, {HB_FUNCNAME( SDDFB )}, NULL }, HB_INIT_SYMBOLS_END( firebirddd__InitSymbols ) HB_CALL_ON_STARTUP_BEGIN( _hb_firebirddd_init_ ) -hb_vmAtInit( hb_firebirddd_init, NULL ); + hb_vmAtInit( hb_firebirddd_init, NULL ); HB_CALL_ON_STARTUP_END( _hb_firebirddd_init_ ) #if defined( HB_PRAGMA_STARTUP ) #pragma startup firebirddd__InitSymbols #pragma startup _hb_firebirddd_init_ #elif defined( HB_DATASEG_STARTUP ) - #define HB_DATASEG_BODY HB_DATASEG_FUNC( firebirddd__InitSymbols ) \ - HB_DATASEG_FUNC( _hb_firebirddd_init_ ) + #define HB_DATASEG_BODY HB_DATASEG_FUNC( firebirddd__InitSymbols ) \ + HB_DATASEG_FUNC( _hb_firebirddd_init_ ) #include "hbiniseg.h" #endif @@ -254,13 +252,23 @@ static HB_ERRCODE fbOpen( SQLBASEAREAP pArea ) hb_xfree( pSqlda ); return HB_FAILURE; } + + if( isc_dsql_execute( status, &hTrans, &hStmt, 1, NULL) ) + { + hb_errRT_FireBirdDD( EG_OPEN, ESQLDD_EXECUTE, "Execute statement failed", pArea->szQuery, ( HB_ERRCODE ) isc_sqlcode( status ) ); + isc_dsql_free_statement( status, &hStmt, DSQL_drop ); + isc_rollback_transaction( status, &hTrans ); + hb_xfree( pSqlda ); + return HB_FAILURE; + } + if( pSqlda->sqld > pSqlda->sqln ) { - uiFields = pSqlda->sqld; - hb_xfree( pSqlda ); - pSqlda = ( XSQLDA * ) hb_xgrab( XSQLDA_LENGTH( uiFields ) ); - pSqlda->sqln = uiFields; - pSqlda->version = 1; + uiFields = pSqlda->sqld; + hb_xfree( pSqlda ); + pSqlda = ( XSQLDA * ) hb_xgrab( XSQLDA_LENGTH( uiFields ) ); + pSqlda->sqln = uiFields; + pSqlda->version = 1; if( isc_dsql_describe( status, &hStmt, SQL_DIALECT_V5, pSqlda ) ) { @@ -298,111 +306,117 @@ static HB_ERRCODE fbOpen( SQLBASEAREAP pArea ) switch( iType ) { case SQL_TEXT: + { + char * pStr; + pFieldInfo.uiType = HB_FT_STRING; - pFieldInfo.uiLen = pVar->sqllen; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( char ) * pVar->sqllen + 2 ); + pFieldInfo.uiLen = pVar->sqllen; + pVar->sqldata = ( char* ) hb_xgrab( sizeof( char ) * pVar->sqllen + 2 ); + + pStr = ( char * ) memset( hb_xgrab( pFieldInfo.uiLen ), ' ', pFieldInfo.uiLen ); + pItem = hb_itemPutCL( NULL, pStr, pFieldInfo.uiLen ); + hb_xfree( pStr ); break; + } + case SQL_VARYING: - pFieldInfo.uiType = HB_FT_STRING; - pFieldInfo.uiLen = pVar->sqllen; + { + char * pStr; + + pFieldInfo.uiType = HB_FT_VARLENGTH; + pFieldInfo.uiLen = pVar->sqllen; /* pVar->sqltype = SQL_TEXT; Coercing */ - pVar->sqldata = ( char * ) hb_xgrab( sizeof( char ) * pVar->sqllen + 2 ); + pVar->sqldata = ( char* ) hb_xgrab( sizeof( char ) * pVar->sqllen + 2 ); + + pStr = ( char * ) memset( hb_xgrab( pFieldInfo.uiLen ), ' ', pFieldInfo.uiLen ); + pItem = hb_itemPutCL( NULL, pStr, pFieldInfo.uiLen ); + hb_xfree( pStr ); break; + } case SQL_SHORT: - pFieldInfo.uiType = HB_FT_INTEGER; - pFieldInfo.uiLen = 6; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( short ) ); + if( pVar->sqlscale < 0 ) + { + pFieldInfo.uiType = HB_FT_LONG; + pFieldInfo.uiLen = 7; + pFieldInfo.uiDec = - pVar->sqlscale; + + pItem = hb_itemPutNDLen( NULL, 0.0, 6 - pFieldInfo.uiDec, ( int ) pFieldInfo.uiDec ); + } + else + { + pFieldInfo.uiType = HB_FT_INTEGER; + pFieldInfo.uiLen = 2; + + pItem = hb_itemPutNILen( NULL, 0, 6 ); + } + pVar->sqldata = ( char* ) hb_xgrab( sizeof( short ) ); break; case SQL_LONG: - pFieldInfo.uiType = HB_FT_LONG; - pFieldInfo.uiLen = 10; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( long ) ); + if( pVar->sqlscale < 0 ) + { + pFieldInfo.uiType = HB_FT_LONG; + pFieldInfo.uiLen = 12; + pFieldInfo.uiDec = - pVar->sqlscale; + + pItem = hb_itemPutNDLen( NULL, 0.0, 11 - pFieldInfo.uiDec, ( int ) pFieldInfo.uiDec ); + } + else + { + pFieldInfo.uiType = HB_FT_INTEGER; + pFieldInfo.uiLen = 4; + + pItem = hb_itemPutNLLen( NULL, 0, 11 ); + } + pVar->sqldata = ( char* ) hb_xgrab( sizeof( long ) ); break; case SQL_FLOAT: - pFieldInfo.uiType = HB_FT_FLOAT; - pFieldInfo.uiLen = 16; - pFieldInfo.uiDec = -pVar->sqlscale; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( float ) ); + pFieldInfo.uiType = HB_FT_DOUBLE; + pFieldInfo.uiLen = 8; + pFieldInfo.uiDec = - pVar->sqlscale; + pVar->sqldata = ( char* ) hb_xgrab( sizeof( float ) ); + + pItem = hb_itemPutNDLen( NULL, * ( float * ) pVar->sqldata, 20 - pFieldInfo.uiDec, pFieldInfo.uiDec ); break; case SQL_DOUBLE: pFieldInfo.uiType = HB_FT_DOUBLE; - pFieldInfo.uiLen = 16; - pFieldInfo.uiDec = -pVar->sqlscale; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( double ) ); + pFieldInfo.uiLen = 8; + pFieldInfo.uiDec = - pVar->sqlscale; + pVar->sqldata = ( char* ) hb_xgrab( sizeof( double ) ); + + pItem = hb_itemPutNDLen( NULL, * ( float * ) pVar->sqldata, 20 - pFieldInfo.uiDec, pFieldInfo.uiDec ); + break; + + case SQL_TIMESTAMP: + pFieldInfo.uiType = HB_FT_TIMESTAMP; + pFieldInfo.uiLen = 8; + pVar->sqldata = ( char* ) hb_xgrab( sizeof( ISC_TIMESTAMP ) ); + + pItem = hb_itemPutTDT( NULL, 0, 0 ); break; default: /* other fields as binary string */ pFieldInfo.uiType = HB_FT_STRING; - pFieldInfo.uiLen = pVar->sqllen; - pVar->sqldata = ( char * ) hb_xgrab( sizeof( char ) * pVar->sqllen ); + pFieldInfo.uiLen = pVar->sqllen; + pVar->sqldata = ( char* ) hb_xgrab( sizeof( char ) * pVar->sqllen ); + + pItem = hb_itemNew( NULL ); + bError = HB_TRUE; break; } if( pVar->sqltype & 1 ) pVar->sqlind = ( short * ) hb_xgrab( sizeof( short ) ); + hb_arraySetForward( pItemEof, uiCount + 1, pItem ); + hb_itemRelease( pItem ); + if( ! bError ) - { - switch( pFieldInfo.uiType ) - { - case HB_FT_STRING: - { - char * pStr; - - pStr = ( char * ) hb_xgrab( pFieldInfo.uiLen + 1 ); - memset( pStr, ' ', pFieldInfo.uiLen ); - pStr[ pFieldInfo.uiLen ] = '\0'; - - pItem = hb_itemPutCL( NULL, pStr, pFieldInfo.uiLen ); - hb_xfree( pStr ); - break; - } - - case HB_FT_MEMO: - pItem = hb_itemPutC( NULL, NULL ); - break; - - case HB_FT_INTEGER: - pItem = hb_itemPutNI( NULL, 0 ); - break; - - case HB_FT_LONG: - pItem = hb_itemPutNL( NULL, 0 ); - break; - - case HB_FT_FLOAT: - pItem = hb_itemPutNL( NULL, 0 ); - break; - - case HB_FT_DOUBLE: - pItem = hb_itemPutND( NULL, 0.0 ); - break; - - case HB_FT_DATE: - pItem = hb_itemPutDS( NULL, NULL ); - break; - - default: - pItem = hb_itemNew( NULL ); - bError = HB_TRUE; - break; - } - - hb_arraySetForward( pItemEof, uiCount + 1, pItem ); - hb_itemRelease( pItem ); - -/* if( pFieldInfo.uiType == HB_IT_DOUBLE || pFieldInfo.uiType == HB_IT_INTEGER ) - pFieldInfo.uiType = HB_IT_LONG; - */ - - if( ! bError ) - bError = ( SELF_ADDFIELD( ( AREAP ) pArea, &pFieldInfo ) == HB_FAILURE ); - } + bError = ( SELF_ADDFIELD( ( AREAP ) pArea, &pFieldInfo ) == HB_FAILURE ); hb_xfree( szOurName ); @@ -472,39 +486,54 @@ static HB_ERRCODE fbGoTo( SQLBASEAREAP pArea, HB_ULONG ulRecNo ) if( lErr == 0 ) { pArray = hb_itemArrayNew( pArea->area.uiFieldCount ); - for( ui = 1; ui <= pArea->area.uiFieldCount; ui++ ) + for( ui = 0; ui < pArea->area.uiFieldCount; ui++ ) { - pVar = ( XSQLVAR * ) pSDDData->pSqlda; - pVar += ( ui - 1 ); + LPFIELD pField; + pVar = pSDDData->pSqlda->sqlvar + ui; - if( ( pVar->sqltype & 1 ) && ( *pVar->sqlind < 0 ) ) + if( ( pVar->sqltype & 1 ) && ( * pVar->sqlind < 0 ) ) continue; /* NIL value */ - iType = pVar->sqltype; - switch( iType ) + pField = pArea->area.lpFields + ui; + iType = pVar->sqltype & ~1; + switch ( iType ) { case SQL_TEXT: pItem = hb_itemPutCL( NULL, pVar->sqldata, pVar->sqllen ); break; case SQL_VARYING: - pItem = hb_itemPutCL( NULL, pVar->sqldata + 2, *( short * ) pVar->sqldata ); + pItem = hb_itemPutCL( NULL, pVar->sqldata + 2, * ( short * ) pVar->sqldata ); break; case SQL_SHORT: - pItem = hb_itemPutNI( NULL, *( short * ) pVar->sqldata ); + if( pField->uiDec == 0 ) + pItem = hb_itemPutNILen( NULL, * ( short * ) pVar->sqldata, 6 ); + else + pItem = hb_itemPutNDLen( NULL, hb_numDecConv( * ( short * ) pVar->sqldata, ( int ) pField->uiDec ), + 6 - pField->uiDec, ( int ) pField->uiDec ); break; case SQL_LONG: - pItem = hb_itemPutNL( NULL, *( long * ) pVar->sqldata ); + pItem = hb_itemPutNL( NULL, * ( long * ) pVar->sqldata ); + if( pField->uiDec == 0 ) + pItem = hb_itemPutNLLen( NULL, * ( short * ) pVar->sqldata, 11 ); + else + pItem = hb_itemPutNDLen( NULL, hb_numDecConv( * ( long * ) pVar->sqldata, ( int ) pField->uiDec ), + 11 - pField->uiDec, ( int ) pField->uiDec ); break; case SQL_FLOAT: - pItem = hb_itemPutND( NULL, *( float * ) pVar->sqldata ); + pItem = hb_itemPutNDLen( NULL, * ( float * ) pVar->sqldata, 20 - pField->uiDec, pField->uiDec ); break; case SQL_DOUBLE: - pItem = hb_itemPutND( NULL, *( double * ) pVar->sqldata ); + pItem = hb_itemPutNDLen( NULL, * ( double * ) pVar->sqldata, 20 - pField->uiDec, pField->uiDec ); + break; + + case SQL_TIMESTAMP: + pItem = hb_itemPutTDT( NULL, (( ISC_TIMESTAMP * ) pVar->sqldata )->timestamp_date + 2400001, + (( ISC_TIMESTAMP * ) pVar->sqldata )->timestamp_time / 10 ); break; default: