diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 0852f33473..72ec7f4099 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,9 @@ +19991121-16:10 GMT+1 Bruno Cantero + * include/rddapi.h + source/rdd/dbcmd.c + source/rdd/dbf1.c + * Optimization of RDD, mentioned by Matteo and Victor. + 19991121-03:19 GMT+1 Victor Szel * source/compiler/harbour.c source/compiler/harbour.y diff --git a/harbour/include/rddapi.h b/harbour/include/rddapi.h index 266983cfec..dc01328de1 100644 --- a/harbour/include/rddapi.h +++ b/harbour/include/rddapi.h @@ -221,15 +221,17 @@ typedef struct USHORT uiHeaderLen; /* Size of header */ USHORT uiRecordLen; /* Size of record */ BYTE * bRecord; /* Buffer of the data */ + BOOL fValidBuffer; /* State of buffer */ BOOL fHasMemo; /* Work Area with Memo fields */ - ULONG lRecNo; /* Current record */ - ULONG lNextBlock; /* Next block for memos */ + ULONG ulRecNo; /* Current record */ + ULONG ulNextBlock; /* Next block for memos */ BOOL fExclusive; /* Share the file */ BOOL fReadOnly; /* Read only file */ BYTE bYear; /* Last update */ BYTE bMonth; BYTE bDay; BOOL fRecordChanged; /* Record changed */ + ULONG ulRecCount; /* Total records */ } DBEXTENDINFO; typedef DBEXTENDINFO * LPDBEXTENDINFO; diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index 29e05b41ca..ee6aa1cd41 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -398,14 +398,6 @@ static ERRCODE defFound( AREAP pArea, BOOL * pFound ) return SUCCESS; } -static ERRCODE defGetRec( AREAP pArea, BYTE ** pBuffer ) -{ - HB_TRACE(HB_TR_DEBUG, ("defGetRec(%p, %p)", pArea, pBuffer)); - - * pBuffer = pArea->lpExtendInfo->bRecord; - return SUCCESS; -} - static ERRCODE defNewArea( AREAP pArea ) { HB_TRACE(HB_TR_DEBUG, ("defNewArea(%p)", pArea)); @@ -565,6 +557,7 @@ static ERRCODE defSkip( AREAP pArea, LONG lToSkip ) return SUCCESS; } } + return SELF_SKIPRAW( pArea, lToSkip ); } @@ -651,7 +644,7 @@ static ERRCODE defSkipRaw( AREAP pArea, LONG lToSkip ) { HB_TRACE(HB_TR_DEBUG, ("defSkipRaw(%p, %ld)", pArea, lToSkip)); - return SELF_GOTO( pArea, pArea->lpExtendInfo->lRecNo + lToSkip ); + return SELF_GOTO( pArea, pArea->lpExtendInfo->ulRecNo + lToSkip ); } static ERRCODE defStructSize( AREAP pArea, USHORT * uiSize ) @@ -714,7 +707,7 @@ static RDDFUNCS defTable = { defBof, defFieldInfo, defFieldName, defUnSupported, - defGetRec, + ( DBENTRYP_PP ) defUnSupported, ( DBENTRYP_SI ) defUnSupported, ( DBENTRYP_SVL ) defUnSupported, defUnSupported, @@ -1455,6 +1448,7 @@ HARBOUR HB_DBCREATE( void ) { char * szDriver, * szFileName; USHORT uiSize, uiLen, uiRddID; + ULONG ulRecCount; LPRDDNODE pRddNode; LPAREANODE pAreaNode; DBOPENINFO pInfo; @@ -1719,6 +1713,8 @@ HARBOUR HB_DBCREATE( void ) hb_xfree( pCurrArea ); pCurrArea = NULL; } + SELF_RECCOUNT( ( AREAP ) pCurrArea->pArea, &ulRecCount ); + ( ( AREAP ) pCurrArea->pArea )->lpExtendInfo->ulRecCount = ulRecCount; } } @@ -2466,6 +2462,8 @@ HARBOUR HB_DBUSEAREA( void ) pCurrArea = NULL; return; } + SELF_RECCOUNT( ( AREAP ) pCurrArea->pArea, &ulLen ); + ( ( AREAP ) pCurrArea->pArea )->lpExtendInfo->ulRecCount = ulLen; } HARBOUR HB___DBZAP( void ) @@ -2756,7 +2754,10 @@ HARBOUR HB_RECCOUNT( void ) ULONG ulRecCount = 0; if( pCurrArea ) + { SELF_RECCOUNT( ( AREAP ) pCurrArea->pArea, &ulRecCount ); + ( ( AREAP ) pCurrArea->pArea )->lpExtendInfo->ulRecCount = ulRecCount; + } hb_retnl( ulRecCount ); } diff --git a/harbour/source/rdd/dbf1.c b/harbour/source/rdd/dbf1.c index 3574e50ae8..bf43257628 100644 --- a/harbour/source/rdd/dbf1.c +++ b/harbour/source/rdd/dbf1.c @@ -290,24 +290,28 @@ static BOOL hb_dbfWriteMemo( AREAP pArea, LPDBFMEMO pMemo, ULONG * lNewRecNo ) return TRUE; } -static BOOL hb_dbfUpdateRecord( AREAP pArea, ULONG lRecNo ) +static BOOL hb_dbfUpdateRecord( AREAP pArea, ULONG ulRecNo ) { - ULONG lRecCount; + ULONG ulRecCount; USHORT uiCount; LPFIELD pField; BYTE pBuffer[ 1 ]; HB_TRACE(HB_TR_DEBUG, ("hb_dbfUpdateRecord(%p, %lu)", pArea, lRecNo)); - if( SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) - return FALSE; + if( ulRecNo > pArea->lpExtendInfo->ulRecCount ) + { + if( SELF_RECCOUNT( pArea, &ulRecCount ) == FAILURE ) + return FALSE; + pArea->lpExtendInfo->ulRecCount = ulRecCount; + } - if( lRecNo > 0 && ( lRecNo <= lRecCount || pArea->lpFileInfo->fAppend ) ) + if( ulRecNo > 0 && ( ulRecNo <= ulRecCount || pArea->lpFileInfo->fAppend ) ) { hb_fsSeek( pArea->lpFileInfo->hFile, pArea->lpExtendInfo->uiHeaderLen + - ( lRecNo - 1 ) * pArea->lpExtendInfo->uiRecordLen, FS_SET ); + ( ulRecNo - 1 ) * pArea->lpExtendInfo->uiRecordLen, FS_SET ); if( pArea->lpFileInfo->fAppend ) - lRecCount = lRecNo; + pArea->lpExtendInfo->ulRecCount = ulRecNo; if( pArea->lpExtendInfo->fHasMemo ) { for( uiCount = 0; uiCount < pArea->uiFieldCount; uiCount++ ) @@ -330,10 +334,10 @@ static BOOL hb_dbfUpdateRecord( AREAP pArea, ULONG lRecNo ) return FALSE; } - if( !hb_dbfUpdateHeader( pArea, lRecCount ) ) + if( !hb_dbfUpdateHeader( pArea, pArea->lpExtendInfo->ulRecCount ) ) return FALSE; - } + return TRUE; } @@ -345,6 +349,8 @@ static void hb_dbfClearBuffer( AREAP pArea ) HB_TRACE(HB_TR_DEBUG, ("hb_dbfClearBuffer(%p)", pArea)); memset( pArea->lpExtendInfo->bRecord, ' ', pArea->lpExtendInfo->uiRecordLen ); + pArea->lpExtendInfo->bRecord[ pArea->lpExtendInfo->uiRecordLen ] = 0; + pArea->lpExtendInfo->fValidBuffer = TRUE; if( pArea->lpExtendInfo->fHasMemo ) { @@ -414,16 +420,17 @@ static void hb_dbfReadMemo( AREAP pArea, LPDBFMEMO pMemo, ULONG lMemoBlock ) } } -static ERRCODE hb_dbfReadBuffer( AREAP pArea, ULONG lRecNo ) +static void hb_dbfReadBuffer( AREAP pArea, ULONG lRecNo ) { LPFIELD pField; USHORT uiCount; HB_TRACE(HB_TR_DEBUG, ("hb_dbfReadBuffer(%p, %lu)", pArea, lRecNo)); - if( SELF_GOCOLD( pArea ) == FAILURE ) - return FAILURE; + if( pArea->lpExtendInfo->fValidBuffer ) + return; + pArea->lpExtendInfo->fValidBuffer = TRUE; if( hb_fsSeek( pArea->lpFileInfo->hFile, pArea->lpExtendInfo->uiHeaderLen + ( lRecNo - 1 ) * pArea->lpExtendInfo->uiRecordLen, FS_SET ) != pArea->lpExtendInfo->uiHeaderLen + ( lRecNo - 1 ) * pArea->lpExtendInfo->uiRecordLen || @@ -431,9 +438,7 @@ static ERRCODE hb_dbfReadBuffer( AREAP pArea, ULONG lRecNo ) pArea->lpExtendInfo->uiRecordLen ) != pArea->lpExtendInfo->uiRecordLen ) { hb_dbfClearBuffer( pArea ); - memset( pArea->lpExtendInfo->bRecord, ' ', pArea->lpExtendInfo->uiRecordLen ); - pArea->lpExtendInfo->bRecord[ pArea->lpExtendInfo->uiRecordLen ] = 0; - return FAILURE; + return; } if( pArea->lpExtendInfo->fHasMemo && pArea->lpFileInfo->pNext ) @@ -446,7 +451,6 @@ static ERRCODE hb_dbfReadBuffer( AREAP pArea, ULONG lRecNo ) pField = pField->lpfNext; } } - return SUCCESS; } static BOOL hb_dbfIsLocked( AREAP pArea, ULONG lLockPos ) @@ -642,7 +646,6 @@ static RDDFUNCS dbfSuper = { 0 }; #define dbfFieldDisplay NULL #define dbfFieldInfo NULL #define dbfFieldName NULL -#define dbfGetRec NULL #define dbfSetFieldsExtent NULL #define dbfAlias NULL #define dbfNewArea NULL @@ -687,7 +690,7 @@ static ERRCODE dbfAddField( AREAP pArea, LPDBFIELDINFO pFieldInfo ) static ERRCODE dbfAppend( AREAP pArea, BOOL bUnLockAll ) { - ULONG lRecCount, lRecNo; + ULONG ulRecCount, ulRecNo; PHB_ITEM pError; HB_TRACE(HB_TR_DEBUG, ("dbfAppend(%p, %d)", pArea, (int) bUnLockAll)); @@ -706,8 +709,9 @@ static ERRCODE dbfAppend( AREAP pArea, BOOL bUnLockAll ) return FAILURE; } - if( SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) + if( SELF_RECCOUNT( pArea, &ulRecCount ) == FAILURE ) return FAILURE; + pArea->lpExtendInfo->ulRecCount = ulRecCount; if( !pArea->lpExtendInfo->fExclusive && !pArea->lpFileInfo->fFileLocked ) { @@ -718,21 +722,20 @@ static ERRCODE dbfAppend( AREAP pArea, BOOL bUnLockAll ) return FAILURE; } - SELF_GOTO( pArea, lRecCount + 1 ); - lRecCount++; - lRecNo = lRecCount; + ulRecNo = ulRecCount + 1; + SELF_GOTO( pArea, ulRecNo ); pArea->fEof = FALSE; hb_dbfClearBuffer( pArea ); pArea->lpExtendInfo->fRecordChanged = TRUE; pArea->lpFileInfo->fAppend = TRUE; - if( !hb_dbfUpdateRecord( pArea, lRecNo ) ) + if( !hb_dbfUpdateRecord( pArea, ulRecNo ) ) { if( !pArea->lpExtendInfo->fExclusive && !pArea->lpFileInfo->fFileLocked ) hb_fsLock( pArea->lpFileInfo->hFile, LOCK_START, 1, FL_UNLOCK ); return FAILURE; } - if( !hb_dbfLockRecord( pArea, lRecNo ) ) + if( !hb_dbfLockRecord( pArea, ulRecNo ) ) { if( !pArea->lpExtendInfo->fExclusive && !pArea->lpFileInfo->fFileLocked ) hb_fsLock( pArea->lpFileInfo->hFile, LOCK_START, 1, FL_UNLOCK ); @@ -876,27 +879,33 @@ static ERRCODE dbfCreateMemFile( AREAP pArea, LPDBOPENINFO pCreateInfo ) static ERRCODE dbfDeleted( AREAP pArea, BOOL * pDeleted ) { + BYTE * pBuffer; + HB_TRACE(HB_TR_DEBUG, ("dbfDeleted(%p, %p)", pArea, pDeleted)); - * pDeleted = ( pArea->lpExtendInfo->bRecord[ 0 ] == '*' ); + SELF_GETREC( pArea, &pBuffer ); + * pDeleted = ( pBuffer[ 0 ] == '*' ); return SUCCESS; } static ERRCODE dbfDeleteRec( AREAP pArea ) { + BYTE * pBuffer; + HB_TRACE(HB_TR_DEBUG, ("dbfDeleteRec(%p)", pArea)); if( SELF_GOHOT( pArea ) == FAILURE ) return FAILURE; - if( pArea->lpExtendInfo->bRecord[ 0 ] == '*' ) + SELF_GETREC( pArea, &pBuffer ); + if( pBuffer[ 0 ] == '*' ) { pArea->lpExtendInfo->fRecordChanged = FALSE; return SUCCESS; } - pArea->lpExtendInfo->bRecord[ 0 ] = '*'; + pBuffer[ 0 ] = '*'; return SUCCESS; } @@ -914,18 +923,30 @@ static ERRCODE dbfFlush( AREAP pArea ) return FAILURE; } +static ERRCODE dbfGetRec( AREAP pArea, BYTE ** pBuffer ) +{ + HB_TRACE(HB_TR_DEBUG, ("dbfGetRec(%p, %p)", pArea, pBuffer)); + + if( !pArea->lpExtendInfo->fValidBuffer ) + hb_dbfReadBuffer( pArea, pArea->lpExtendInfo->ulRecNo ); + + * pBuffer = pArea->lpExtendInfo->bRecord; + return SUCCESS; +} + static ERRCODE dbfGetValue( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) { LPFIELD pField; - BYTE * szText, szEndChar; + BYTE * pBuffer, * szText, szEndChar; HB_TRACE(HB_TR_DEBUG, ("dbfGetValue(%p, %hu, %p)", pArea, uiIndex, pItem)); if( uiIndex > pArea->uiFieldCount ) return FAILURE; + SELF_GETREC( pArea, &pBuffer ); pField = pArea->lpFields + uiIndex - 1; - szText = pArea->lpExtendInfo->bRecord + pField->uiOffset; + szText = pBuffer + pField->uiOffset; switch( pField->uiType ) { case 'C': @@ -971,7 +992,7 @@ static ERRCODE dbfGetValue( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) static ERRCODE dbfGetValueFile( AREAP pArea, USHORT uiIndex, void * pFile ) { ULONG lRecNo, lNewRecNo; - BYTE * szText, szEndChar; + BYTE * pBuffer, * szText, szEndChar; LPFIELD pField; HB_TRACE(HB_TR_DEBUG, ("dbfGetValueFile(%p, %hu, %p)", pArea, uiIndex, pFile)); @@ -979,8 +1000,9 @@ static ERRCODE dbfGetValueFile( AREAP pArea, USHORT uiIndex, void * pFile ) if( uiIndex > pArea->uiFieldCount ) return FAILURE; + SELF_GETREC( pArea, &pBuffer ); pField = pArea->lpFields + uiIndex - 1; - szText = pArea->lpExtendInfo->bRecord + pField->uiOffset; + szText = pBuffer + pField->uiOffset; if( !( ( LPDBFMEMO ) pField->memo )->pData ) memset( szText, ' ', pField->uiLen ); else @@ -1018,14 +1040,15 @@ static ERRCODE dbfGetVarLen( AREAP pArea, USHORT uiIndex, ULONG * ulLen ) static ERRCODE dbfGoBottom( AREAP pArea ) { - ULONG lRecCount; + ULONG ulRecCount; HB_TRACE(HB_TR_DEBUG, ("dbfGoBottom(%p)", pArea)); - if( SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) + if( SELF_RECCOUNT( pArea, &ulRecCount ) == FAILURE ) return FAILURE; + pArea->lpExtendInfo->ulRecCount = ulRecCount; - SELF_GOTO( pArea, lRecCount ); + SELF_GOTO( pArea, ulRecCount ); return SELF_SKIPFILTER( pArea, -1 ); } @@ -1034,7 +1057,7 @@ static ERRCODE dbfGoCold( AREAP pArea ) HB_TRACE(HB_TR_DEBUG, ("dbfGoCold(%p)", pArea)); if( pArea->lpExtendInfo->fRecordChanged && - !hb_dbfUpdateRecord( pArea, pArea->lpExtendInfo->lRecNo ) ) + !hb_dbfUpdateRecord( pArea, pArea->lpExtendInfo->ulRecNo ) ) return FAILURE; pArea->lpExtendInfo->fRecordChanged = FALSE; @@ -1049,7 +1072,7 @@ static ERRCODE dbfGoHot( AREAP pArea ) HB_TRACE(HB_TR_DEBUG, ("dbfGoHot(%p)", pArea)); if( !pArea->lpExtendInfo->fExclusive && !pArea->lpFileInfo->fFileLocked && - !hb_dbfIsLocked( pArea, pArea->lpExtendInfo->lRecNo ) ) + !hb_dbfIsLocked( pArea, pArea->lpExtendInfo->ulRecNo ) ) { pError = hb_errNew(); hb_errPutGenCode( pError, EG_UNLOCKED ); @@ -1074,63 +1097,66 @@ static ERRCODE dbfGoHot( AREAP pArea ) return SUCCESS; } -static ERRCODE dbfGoTo( AREAP pArea, ULONG lRecNo ) +static ERRCODE dbfGoTo( AREAP pArea, ULONG ulRecNo ) { - ULONG lRecCount; + ULONG ulRecCount; - HB_TRACE(HB_TR_DEBUG, ("dbfGoTo(%p, %lu)", pArea, lRecNo)); + HB_TRACE(HB_TR_DEBUG, ("dbfGoTo(%p, %lu)", pArea, ulRecNo)); if( SELF_GOCOLD( pArea ) == FAILURE ) return FAILURE; - if( SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) - return FAILURE; + if( ulRecNo > pArea->lpExtendInfo->ulRecCount ) + { + if( SELF_RECCOUNT( pArea, &ulRecCount ) == FAILURE ) + return FAILURE; + pArea->lpExtendInfo->ulRecCount = ulRecCount; + } - if( lRecCount < 1 ) + if( ulRecCount < 1 ) { pArea->fBof = 1; pArea->fEof = 1; - lRecNo = 1; + ulRecNo = 1; } else { - if( lRecNo > lRecCount + 1 ) - lRecNo = lRecCount + 1; + if( ulRecNo > ulRecCount + 1 ) + ulRecNo = ulRecCount + 1; - if( lRecNo <= 0 ) + if( ulRecNo <= 0 ) { pArea->fBof = 1; - lRecNo = 1; + ulRecNo = 1; } else - pArea->fBof = ( lRecNo == 1 && pArea->fBof ); + pArea->fBof = ( ulRecNo == 1 && pArea->fBof ); - pArea->fEof = ( lRecNo == lRecCount + 1 ); + pArea->fEof = ( ulRecNo == ulRecCount + 1 ); } - pArea->lpExtendInfo->lRecNo = lRecNo; - if( lRecCount > 0 ) - return hb_dbfReadBuffer( pArea, lRecNo ); + pArea->lpExtendInfo->ulRecNo = ulRecNo; + if( ulRecCount > 0 ) + pArea->lpExtendInfo->fValidBuffer = FALSE; else - { hb_dbfClearBuffer( pArea ); - return SUCCESS; - } + + return SUCCESS; } static ERRCODE dbfGoToId( AREAP pArea, PHB_ITEM pItem ) { PHB_ITEM pError; - ULONG lRecNo; + ULONG ulRecNo; HB_TRACE(HB_TR_DEBUG, ("dbfGoToId(%p, %p)", pArea, pItem)); if( pItem->type & IT_NUMERIC ) { - lRecNo = hb_itemGetNL( pItem ); - if( lRecNo == 0 ) - lRecNo = pArea->lpExtendInfo->lRecNo; - return SELF_GOTO( pArea, lRecNo ); + ulRecNo = hb_itemGetNL( pItem ); + if( ulRecNo == 0 ) + ulRecNo = pArea->lpExtendInfo->ulRecNo; + return SELF_GOTO( pArea, ulRecNo ); } else { @@ -1208,7 +1234,7 @@ static ERRCODE dbfLock( AREAP pArea, LPDBLOCKINFO pLockInfo ) hb_dbfUnLockAllRecords( pArea ); /* Get current record */ - pLockInfo->itmRecID = pArea->lpExtendInfo->lRecNo; + pLockInfo->itmRecID = pArea->lpExtendInfo->ulRecNo; } if( SELF_RAWLOCK( pArea, pLockInfo->uiMethod, pLockInfo->itmRecID ) == SUCCESS ) pLockInfo->fResult = TRUE; @@ -1342,17 +1368,17 @@ static ERRCODE dbfOpenMemFile( AREAP pArea, LPDBOPENINFO pOpenInfo ) hb_xfree( pMemoHeader ); return FAILURE; } - pArea->lpExtendInfo->lNextBlock = pMemoHeader->lNextBlock; + pArea->lpExtendInfo->ulNextBlock = pMemoHeader->lNextBlock; hb_xfree( pMemoHeader ); return SUCCESS; } static ERRCODE dbfPack( AREAP pArea ) { - ULONG lRecCount, lRecIn, lRecOut; + ULONG ulRecCount, ulRecIn, ulRecOut; BOOL bDeleted; PHB_ITEM pError; - BYTE pBuffer[ 1 ]; + BYTE * pBuffer, pEOF[ 1 ]; HB_TRACE(HB_TR_DEBUG, ("dbfPack(%p)", pArea)); @@ -1368,36 +1394,37 @@ static ERRCODE dbfPack( AREAP pArea ) } if( SELF_GOCOLD( pArea ) == FAILURE || pArea->lpExtendInfo->fReadOnly || - SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) + SELF_RECCOUNT( pArea, &ulRecCount ) == FAILURE ) return FAILURE; + pArea->lpExtendInfo->ulRecCount = ulRecCount; - lRecOut = 0; - lRecIn = 1; - while ( lRecIn <= lRecCount ) + ulRecOut = 0; + ulRecIn = 1; + while ( ulRecIn <= ulRecCount ) { - SELF_GOTO( pArea, lRecIn ); + SELF_GOTO( pArea, ulRecIn ); SELF_DELETED( pArea, &bDeleted ); if( !bDeleted ) { - lRecOut++; - if( lRecIn != lRecOut ) /* Copy record */ + ulRecOut++; + if( ulRecIn != ulRecOut ) /* Copy record */ { + SELF_GETREC( pArea, &pBuffer ); hb_fsSeek( pArea->lpFileInfo->hFile, pArea->lpExtendInfo->uiHeaderLen + - ( lRecOut - 1 ) * pArea->lpExtendInfo->uiRecordLen, FS_SET ); - hb_fsWrite( pArea->lpFileInfo->hFile, pArea->lpExtendInfo->bRecord, - pArea->lpExtendInfo->uiRecordLen ); + ( ulRecOut - 1 ) * pArea->lpExtendInfo->uiRecordLen, FS_SET ); + hb_fsWrite( pArea->lpFileInfo->hFile, pBuffer, pArea->lpExtendInfo->uiRecordLen ); } } - lRecIn++; + ulRecIn++; } - hb_dbfUpdateHeader( pArea, lRecOut ); + hb_dbfUpdateHeader( pArea, ulRecOut ); /* Write EOF */ - pBuffer[ 0 ] = 0x1A; + pEOF[ 0 ] = 0x1A; hb_fsSeek( pArea->lpFileInfo->hFile, pArea->lpExtendInfo->uiHeaderLen + - lRecOut * pArea->lpExtendInfo->uiRecordLen, FS_SET ); - hb_fsWrite( pArea->lpFileInfo->hFile, pBuffer, 1 ); + ulRecOut * pArea->lpExtendInfo->uiRecordLen, FS_SET ); + hb_fsWrite( pArea->lpFileInfo->hFile, pEOF, 1 ); /* Truncate the file */ hb_fsWrite( pArea->lpFileInfo->hFile, NULL, 0 ); @@ -1413,6 +1440,8 @@ static ERRCODE dbfPutRec( AREAP pArea, BYTE * pBuffer ) return FAILURE; memcpy( pArea->lpExtendInfo->bRecord, pBuffer, pArea->lpExtendInfo->uiRecordLen ); + pArea->lpExtendInfo->fValidBuffer = TRUE; + return SUCCESS; } @@ -1420,7 +1449,7 @@ static ERRCODE dbfPutValue( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) { LPFIELD pField; USHORT uiCount; - BYTE * szText, szEndChar; + BYTE * pBuffer, * szText, szEndChar; BOOL bError; long lDay, lMonth, lYear; PHB_ITEM pError; @@ -1433,8 +1462,9 @@ static ERRCODE dbfPutValue( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) if( SELF_GOHOT( pArea ) == FAILURE ) return FAILURE; + SELF_GETREC( pArea, &pBuffer ); pField = pArea->lpFields + uiIndex - 1; - szText = pArea->lpExtendInfo->bRecord + pField->uiOffset; + szText = pBuffer + pField->uiOffset; bError = TRUE; switch( pField->uiType ) { @@ -1546,7 +1576,7 @@ static ERRCODE dbfPutValue( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) static ERRCODE dbfPutValueFile( AREAP pArea, USHORT uiIndex, void * pFile ) { LPFIELD pField; - BYTE * szText, szEndChar; + BYTE * pBuffer, * szText, szEndChar; ULONG lMemoBlock; HB_TRACE(HB_TR_DEBUG, ("dbfPutValueFile(%p, %hu, %p)", pArea, uiIndex, pFile)); @@ -1554,8 +1584,9 @@ static ERRCODE dbfPutValueFile( AREAP pArea, USHORT uiIndex, void * pFile ) if( uiIndex > pArea->uiFieldCount ) return FAILURE; + SELF_GETREC( pArea, &pBuffer ); pField = pArea->lpFields + uiIndex - 1;; - szText = pArea->lpExtendInfo->bRecord + pField->uiOffset; + szText = pBuffer + pField->uiOffset; szEndChar = * ( szText + pField->uiLen ); * ( szText + pField->uiLen ) = 0; lMemoBlock = atol( ( char * ) szText ) * MEMO_BLOCK; @@ -1685,18 +1716,21 @@ static ERRCODE dbfReadDBHeader( AREAP pArea ) static ERRCODE dbfRecAll( AREAP pArea ) { + BYTE * pBuffer; + HB_TRACE(HB_TR_DEBUG, ("dbfRecAll(%p)", pArea)); if( SELF_GOHOT( pArea ) == FAILURE ) return FAILURE; - if( pArea->lpExtendInfo->bRecord[ 0 ] != '*' ) + SELF_GETREC( pArea, &pBuffer ); + if( pBuffer[ 0 ] != '*' ) { pArea->lpExtendInfo->fRecordChanged = FALSE; return SUCCESS; } + pBuffer[ 0 ] = ' '; - pArea->lpExtendInfo->bRecord[ 0 ] = ' '; return SUCCESS; } @@ -1716,21 +1750,23 @@ static ERRCODE dbfRecCount( AREAP pArea, ULONG * pRecCount ) static ERRCODE dbfRecInfo( AREAP pArea, PHB_ITEM pRecNo, USHORT uiType, PHB_ITEM pItem ) { - ULONG lRecNo; + BYTE * pBuffer; + ULONG ulRecNo; HB_TRACE(HB_TR_DEBUG, ("dbfRecInfo(%p, %p, %hu, %p)", pArea, pRecNo, uiType, pItem)); - lRecNo = pArea->lpExtendInfo->lRecNo; + ulRecNo = pArea->lpExtendInfo->ulRecNo; if( SELF_GOTOID( pArea, pRecNo ) == SUCCESS ) { switch( uiType ) { case DBRI_DELETED: - hb_itemPutL( pItem, ( pArea->lpExtendInfo->bRecord[ 0 ] == '*' ) ); + SELF_GETREC( pArea, &pBuffer ); + hb_itemPutL( pItem, ( pBuffer[ 0 ] == '*' ) ); break; case DBRI_LOCKED: - hb_itemPutL( pItem, hb_dbfIsLocked( pArea, pArea->lpExtendInfo->lRecNo ) ); + hb_itemPutL( pItem, hb_dbfIsLocked( pArea, pArea->lpExtendInfo->ulRecNo ) ); break; case DBRI_RECNO: @@ -1746,7 +1782,8 @@ static ERRCODE dbfRecInfo( AREAP pArea, PHB_ITEM pRecNo, USHORT uiType, PHB_ITEM break; } } - SELF_GOTO( pArea, lRecNo ); + SELF_GOTO( pArea, ulRecNo ); + return SUCCESS; } @@ -1754,7 +1791,7 @@ static ERRCODE dbfRecNo( AREAP pArea, PHB_ITEM pRecNo ) { HB_TRACE(HB_TR_DEBUG, ("dbfRecNo(%p, %p)", pArea, pRecNo)); - hb_itemPutNL( pRecNo, pArea->lpExtendInfo->lRecNo ); + hb_itemPutNL( pRecNo, pArea->lpExtendInfo->ulRecNo ); return SUCCESS; } @@ -1913,6 +1950,7 @@ static ERRCODE dbfZap( AREAP pArea ) /* Test if can write into file */ SELF_RECCOUNT( pArea, &ulRecCount ); + pArea->lpExtendInfo->ulRecCount = ulRecCount; if( !hb_dbfUpdateHeader( pArea, ulRecCount ) ) return FAILURE;