diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 44f57c3cdf..f8660e5fc1 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,21 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2003-07-17 23:00 UTC-0300 Antonio Carlos Pantaglione + * source/rtl/transfrm.c + ! Removed some old commented lines + + * contrib/rdd_ads/adsfunc.c + ! Update transaction functions + ! Add AdsCacheRecords function + + * source/rdd/dbcmd.c + ! Modified error handling to allow retry if alias is not exist during + DBSelectArea() for Clipper compatibility. (Reported by Giovi Verrua) + * source/vm/hvm.c + ! More Clipper compatible to handle FOR-NEXT loops. + Changes by Andi Jahja, borrow from xharbour + 2003-07-17 17:43 UTC-0400 Alejandro de Garate * doc/en/memo.txt + Added MEMOREAD(), MEMOWRIT() documentation diff --git a/harbour/contrib/rdd_ads/adsfunc.c b/harbour/contrib/rdd_ads/adsfunc.c index 24e54e8bcb..e2e56ce29c 100644 --- a/harbour/contrib/rdd_ads/adsfunc.c +++ b/harbour/contrib/rdd_ads/adsfunc.c @@ -1228,7 +1228,6 @@ HB_FUNC( ADSREGCALLBACK ) } - HB_FUNC( ADSCLRCALLBACK ) { if ( itmCobCallBack ) @@ -1283,36 +1282,6 @@ HB_FUNC( ADSGETCONNECTIONHANDLE ) hb_retni( adsConnectHandle ); } -HB_FUNC( ADSBEGINTRANSACTION ) -{ - hb_retnl( AdsBeginTransaction( (hb_pcount()>1)? (ADSHANDLE)hb_parnl(1) : adsConnectHandle ) ); -} - -HB_FUNC( ADSCOMMITTRANSACTION ) -{ - hb_retnl( AdsCommitTransaction( (hb_pcount()>1)? (ADSHANDLE)hb_parnl(1) : adsConnectHandle ) ); -} - -HB_FUNC( ADSROLLBACKTRANSACTION ) -{ - hb_retnl( AdsRollbackTransaction( (hb_pcount()>1)? (ADSHANDLE)hb_parnl(1) : adsConnectHandle ) ); -} - -HB_FUNC( ADSFAILEDTRANSACTIONRECOVERY ) -{ - hb_retnl( AdsFailedTransactionRecovery( (ISCHAR(1))? ( unsigned char * ) hb_parc(1) : NULL ) ); -} - -HB_FUNC( ADSINTRANSACTION ) -{ - UNSIGNED16 pbInTrans; - - if( AdsInTransaction( (hb_pcount()>1)? (ADSHANDLE)hb_parnl(1) : adsConnectHandle,&pbInTrans ) ) - hb_retl( (int) pbInTrans ); - else - hb_retl( 0 ); -} - HB_FUNC( ADSGETLASTERROR ) { /* nLastErr := AdsGetLastError( [ @cLastErr ] ) */ @@ -1373,6 +1342,82 @@ HB_FUNC( ADSUSEDICTIONARY ) #endif +HB_FUNC( ADSBEGINTRANSACTION ) +{ + ADSHANDLE hConnect = ISNUM( 1 ) ? hb_parnl( 1 ) : 0; + + if ( AdsBeginTransaction( hConnect ) == AE_SUCCESS ) + hb_retl( TRUE ); + else + hb_retl( FALSE ); + +} + +HB_FUNC( ADSCOMMITTRANSACTION ) +{ + ADSHANDLE hConnect = ISNUM( 1 ) ? hb_parnl( 1 ) : 0; + + if ( AdsCommitTransaction( hConnect ) == AE_SUCCESS ) + hb_retl( TRUE ); + else + hb_retl( FALSE ); + +} + +HB_FUNC( ADSFAILEDTRANSACTIONRECOVERY ) +{ + UNSIGNED8 *pucServer = ( UNSIGNED8 *) ( ISCHAR( 1 ) ? hb_parc( 1 ) : NULL); + + if ( AdsFailedTransactionRecovery( pucServer ) == AE_SUCCESS ) + hb_retl( TRUE ); + else + hb_retl( FALSE ); +} + +HB_FUNC( ADSINTRANSACTION ) +{ + ADSHANDLE hConnect = ISNUM( 1 ) ? hb_parnl( 1 ) : 0; + UNSIGNED16 pbInTrans ; + + if ( AdsInTransaction( hConnect, &pbInTrans) == AE_SUCCESS ) + hb_retl( pbInTrans ); + else + hb_retl( FALSE ); +} + + +HB_FUNC( ADSROLLBACK ) +{ + ADSHANDLE hConnect = ISNUM( 1 ) ? hb_parnl( 1 ) : 0; + + if ( AdsRollbackTransaction( hConnect ) == AE_SUCCESS ) + hb_retl( TRUE ); + else + hb_retl( FALSE ); +} + +/* + set the number of records to read ahead, for the current work area + Call : ADSCACHERECORDS(nRecords) + Returns : True if successful +*/ +HB_FUNC( ADSCACHERECORDS ) +{ + UNSIGNED32 ulRetVal ; + ADSAREAP pArea; + + ulRetVal=FALSE; + + pArea = (ADSAREAP) hb_rddGetCurrentWorkAreaPointer(); + if( pArea ) + ulRetVal = AdsCacheRecords( pArea->hTable, hb_parni(1) ); + + if( !pArea || ulRetVal != AE_SUCCESS ) + hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "ADSCACHERECORDS" ); + + hb_retl( ulRetVal ); +} + HB_FUNC( ADSVERSION ) { int iVersionType = ISNUM(1) ? hb_parni(1) : 0; diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index 8f08a7201c..faaaada32d 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -1760,7 +1760,28 @@ HB_FUNC( DBSELECTAREA ) { if( ( uiNewArea = hb_rddSelect( szAlias ) ) == 0 ) { - hb_errRT_BASE( EG_NOALIAS, EDBCMD_NOALIAS, NULL, szAlias, 0 ); + USHORT uiAction = E_RETRY; + HB_ITEM_PTR pError; + + pError = hb_errRT_New( ES_ERROR, NULL, EG_NOALIAS, EDBCMD_NOALIAS, + NULL, szAlias, 0, EF_CANRETRY ); + + while( uiAction == E_RETRY ) + { + uiAction = hb_errLaunch( pError ); + + if( uiAction == E_RETRY ) + { + if( ( uiNewArea = hb_rddSelect( szAlias ) ) == 0 ) + { + uiNewArea = hb_rddSelect( szAlias ); + uiAction = E_DEFAULT; + } + } + } + + hb_errRelease( pError ); + // hb_errRT_BASE( EG_NOALIAS, EDBCMD_NOALIAS, NULL, szAlias, 0 ); return; } } @@ -3491,7 +3512,7 @@ HB_FUNC( DBEXISTS ) if ( !pRDDNode ) { - hb_errRT_DBCMD( EG_ARG, EDBCMD_EVAL_BADPARAMETER, NULL, "DBDROP" ); + hb_errRT_DBCMD( EG_ARG, EDBCMD_EVAL_BADPARAMETER, NULL, "DBEXISTS" ); return; } diff --git a/harbour/source/rtl/transfrm.c b/harbour/source/rtl/transfrm.c index edf5c03c65..28623c63a2 100644 --- a/harbour/source/rtl/transfrm.c +++ b/harbour/source/rtl/transfrm.c @@ -422,7 +422,6 @@ HB_FUNC( TRANSFORM ) } /* TODO: maybe replace this 16 with something else */ -//Toninho@fwi szResult = ( char * ) hb_xgrab( ulPicLen + 16 ); /* Grab enough */ szResult = ( char * ) hb_xgrab( ulPicLen + (ULONG) iOrigWidth + (ULONG) iOrigDec + 16 ); /* Grab enough */ *szResult = '\0'; @@ -472,7 +471,6 @@ HB_FUNC( TRANSFORM ) } pNumber = hb_itemPutNDLen( NULL, dPush, -1, iDec ); -//Toninho@fwi pWidth = hb_itemPutNI( NULL, iWidth + ( !ulPicLen && iDec > 0 ? iDec + 1 : 0 ) ); pWidth = hb_itemPutNI( NULL, iWidth + ( ( ulPicLen || iDec == 0 ) ? 0 : ( iDec + 1 ) ) ); pDec = hb_itemPutNI( NULL, iDec ); @@ -514,7 +512,6 @@ HB_FUNC( TRANSFORM ) if( uiPicFlags & PF_EXCHANG ) /* Exchange . and , */ { -//Toninho@fwi szResult[ i ] = '.'; szResult[ i ] = ','; iCount++; } @@ -555,7 +552,6 @@ HB_FUNC( TRANSFORM ) if( i && szResult[ i - 1 ] == '*' ) szResult[ i ] = '*'; else -//Toninho@fwi szResult[ i ] = '0'; szResult[ i ] = ' '; } } @@ -826,7 +822,6 @@ HB_FUNC( TRANSFORM ) hb_xfree( szStr ); } else -//Toninho@fwi hb_retc( NULL ); hb_retc( "" ); } else if( HB_IS_DATE( pValue ) ) diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 17a9d7396f..6c3b60410a 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -2589,6 +2589,10 @@ static void hb_vmForTest( void ) /* Test to check the end point of the FO double dEnd; double dCurrent; + BOOL lEnd; + BOOL lCurrent; + BOOL lLogicalPassed = FALSE; + HB_TRACE(HB_TR_DEBUG, ("hb_vmForTest()")); while( ! HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) ) @@ -2609,7 +2613,7 @@ static void hb_vmForTest( void ) /* Test to check the end point of the FO dStep = hb_vmPopNumber(); - while( ! HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) ) + while( ( ! HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) ) && ( ! HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) ) ) { PHB_ITEM pItem1 = hb_stackItemFromTop( -1 ); PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1073, NULL, "<", 1, pItem1 ); @@ -2625,9 +2629,15 @@ static void hb_vmForTest( void ) /* Test to check the end point of the FO return; } - dEnd = hb_vmPopNumber(); + if ( hb_stackItemFromTop( -1 )->type == HB_IT_LOGICAL ) + { + lEnd = hb_vmPopLogical(); + lLogicalPassed = TRUE; + } + else + dEnd = hb_vmPopNumber(); - while( ! HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) ) + while( ( ! HB_IS_NUMERIC( hb_stackItemFromTop( -1 ) ) ) && ( ! HB_IS_LOGICAL( hb_stackItemFromTop( -1 ) ) ) ) { PHB_ITEM pItem1 = hb_stackItemFromTop( -1 ); PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1073, NULL, "<", 1, pItem1 ); @@ -2643,12 +2653,38 @@ static void hb_vmForTest( void ) /* Test to check the end point of the FO return; } - dCurrent = hb_vmPopNumber(); + if ( hb_stackItemFromTop( -1 )->type == HB_IT_LOGICAL ) + { + lCurrent = hb_vmPopLogical(); + } + else + { + lLogicalPassed = FALSE; + dCurrent = hb_vmPopNumber(); + } - if( dStep >= 0 ) /* Positive loop. Use LESS */ - hb_vmPushLogical( dCurrent <= dEnd ); - else if( dStep < 0 ) /* Negative loop. Use GREATER */ - hb_vmPushLogical( dCurrent >= dEnd ); + if( lLogicalPassed ) + { + if( dStep >= 0 ) /* Positive loop. Use LESS */ + { + hb_vmPushLogical( lCurrent <= lEnd ); + } + else if( dStep < 0 ) /* Negative loop. Use GREATER */ + { + hb_vmPushLogical( lCurrent >= lEnd ); + } + } + else + { + if( dStep >= 0 ) /* Positive loop. Use LESS */ + { + hb_vmPushLogical( dCurrent <= dEnd ); + } + else if( dStep < 0 ) /* Negative loop. Use GREATER */ + { + hb_vmPushLogical( dCurrent >= dEnd ); + } + } } /* ------------------------------- */ @@ -3082,10 +3118,18 @@ static ERRCODE hb_vmSelectWorkarea( PHB_ITEM pAlias ) case HB_IT_LONG: /* Alias was evaluated from an expression, (nWorkArea)->field */ - hb_rddSelectWorkAreaNumber( pAlias->item.asLong.value ); + hb_rddSelectWorkAreaNumber( ( int ) pAlias->item.asLong.value ); pAlias->type = HB_IT_NIL; break; + /* + These types were added for Clipper compatibility + */ + case HB_IT_NIL: + case HB_IT_BLOCK: + case HB_IT_LOGICAL: + case HB_IT_ARRAY: + case HB_IT_DOUBLE: /* Alias was evaluated from an expression, (nWorkArea)->field */ @@ -4165,12 +4209,22 @@ static void hb_vmPushAliasedField( PHB_SYMB pSym ) pAlias = hb_stackItemFromTop( -1 ); iCurrArea = hb_rddGetCurrentWorkAreaNumber(); - /* NOTE: hb_vmSelecWorkarea clears passed item - */ - if( hb_vmSelectWorkarea( pAlias ) == SUCCESS ) - hb_rddGetFieldValue( pAlias, pSym ); + /* + This was added for Clipper compatibility + */ + if( ( pAlias->type == HB_IT_ARRAY ) || ( pAlias->type == HB_IT_LOGICAL ) || ( pAlias->type == HB_IT_NIL ) || ( pAlias->type == HB_IT_BLOCK ) ) + { + hb_errRT_BASE_Subst( EG_ARG, 1065, NULL, "&", 1, pAlias ); + } + else + { + /* NOTE: hb_vmSelecWorkarea clears passed item + */ + if( hb_vmSelectWorkarea( pAlias ) == SUCCESS ) + hb_rddGetFieldValue( pAlias, pSym ); - hb_rddSelectWorkAreaNumber( iCurrArea ); + hb_rddSelectWorkAreaNumber( iCurrArea ); + } } /* It pops the last item from the stack to use it to select a workarea