From 4defe7ee52d3c6f96dac037029e3bc61a4f3d313 Mon Sep 17 00:00:00 2001 From: Horacio Dario Roldan Kasimatis Date: Tue, 13 Aug 2002 02:28:35 +0000 Subject: [PATCH] 2002-08-12 23:25 UTC-0300 Horacio Roldan * source/rdd/dbfcdx/dbfcdx1.c ! fixed seek bug when having an empty scope ! Memo Limit is > 64K now up to 2GB (2^31 or max(long)) ! fixed bug in ordNumber() --- harbour/source/rdd/dbfcdx/dbfcdx1.c | 106 ++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index b61b564adc..62ec143ad7 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -374,6 +374,7 @@ static void hb_cdxGetMemo( CDXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) ULONG ulBlock, ulSize; BYTE * pBuffer; MEMOBLOCK mbBlock; + long lSize; HB_TRACE(HB_TR_DEBUG, ("hb_cdxGetMemo(%p, %hu, %p)", pArea, uiIndex, pItem)); @@ -388,8 +389,9 @@ static void hb_cdxGetMemo( CDXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) ulSize = 0; else ulSize = hb_cdxSwapBytes( mbBlock.ulSize ); - - if( ulSize > 0 && ulSize < 0xFFFF ) + lSize = (long) ulSize; + /* if( ulSize > 0 && ulSize < 0xFFFFFF ) */ + if ( lSize > 0 ) { pBuffer = ( BYTE * ) hb_xgrab( ulSize + 1 ); hb_fsReadLarge( pArea->hMemoFile, pBuffer, ulSize ); @@ -414,7 +416,15 @@ static void hb_cdxAddFreeBlocks( CDXAREAP pArea, ULONG ulBlock, USHORT uiBlocks LPMEMOFREEBLOCK pFreeBlock; HB_TRACE(HB_TR_DEBUG, ("hb_cdxAddFreeBlocks(%p, %lu, %hu)", pArea, ulBlock, uiBlocks)); - + HB_SYMBOL_UNUSED( pArea ); + HB_SYMBOL_UNUSED( ulBlock ); + HB_SYMBOL_UNUSED( uiBlocks ); + return; + /* + * Def'ed out temporarily this version doesn't seem correct for shared access or compatible with VFP. + * Do the dumb thing, no free block list (as VFP) + */ +#if 0 bFound = FALSE; for( iCount = pArea->pMemoRoot->uiListLen - 1; iCount >= 0; iCount-- ) { @@ -486,6 +496,7 @@ static void hb_cdxAddFreeBlocks( CDXAREAP pArea, ULONG ulBlock, USHORT uiBlocks pArea->pMemoRoot->uiListLen = HB_MIN( MAXFREEBLOCKS, pArea->pMemoRoot->uiListLen + 1 ); pArea->pMemoRoot->fChanged = TRUE; } +#endif } /* @@ -498,7 +509,15 @@ static BOOL hb_cdxCompleteFromFreeBlocks( CDXAREAP pArea, ULONG ulBlock, USHORT MEMOBLOCK mbBlock; HB_TRACE(HB_TR_DEBUG, ("hb_cdxCompleteFromFreeBlocks(%p, %lu, %hu)", pArea, ulBlock, uiBlocks)); - + HB_SYMBOL_UNUSED( pArea ); + HB_SYMBOL_UNUSED( ulBlock ); + HB_SYMBOL_UNUSED( uiBlocks ); + return FALSE; + /* + * Def'ed out temporarily this version doesn't seem correct for shared access or compatible with VFP. + * Do the dumb thing, no free block list (as VFP) + */ +#if 0 for( uiCount = 0; uiCount < pArea->pMemoRoot->uiListLen; uiCount++ ) { pFreeBlock = ( LPMEMOFREEBLOCK ) ( pArea->pMemoRoot->pFreeList + uiCount * SIZEOFMEMOFREEBLOCK ); @@ -531,23 +550,30 @@ static BOOL hb_cdxCompleteFromFreeBlocks( CDXAREAP pArea, ULONG ulBlock, USHORT } } return FALSE; +#endif } /* * Get free memo blocks from list or return a new block. */ -static void hb_cdxGetFreeBlocks( CDXAREAP pArea, USHORT uiBlocks, ULONG * ulBlock ) +/* static void hb_cdxGetFreeBlocks( CDXAREAP pArea, USHORT uiBlocks, ULONG * ulBlock ) */ +static void hb_cdxGetFreeBlocks( CDXAREAP pArea, ULONG ulBlocks, ULONG * ulBlock ) { USHORT uiCount; LPMEMOFREEBLOCK pFreeBlock; MEMOBLOCK mbBlock; - HB_TRACE(HB_TR_DEBUG, ("hb_cdxGetFreeBlocks(%p, %hu, %p)", pArea, uiBlocks, ulBlock)); + HB_TRACE(HB_TR_DEBUG, ("hb_cdxGetFreeBlocks(%p, %hu, %p)", pArea, ulBlocks, ulBlock)); + /* + * Def'ed out temporarily this version doesn't seem correct for shared access or compatible with VFP. + * Do the dumb thing, no free block list (as VFP) + */ +#if 0 for( uiCount = 0; uiCount < pArea->pMemoRoot->uiListLen; uiCount++ ) { pFreeBlock = ( LPMEMOFREEBLOCK ) ( pArea->pMemoRoot->pFreeList + uiCount * SIZEOFMEMOFREEBLOCK ); - if( uiBlocks <= pFreeBlock->uiBlocks ) + if( ulBlocks <= pFreeBlock->uiBlocks ) { * ulBlock = pFreeBlock->ulBlock; @@ -572,10 +598,10 @@ static void hb_cdxGetFreeBlocks( CDXAREAP pArea, USHORT uiBlocks, ULONG * ulBloc return; } } - +#endif /* Not found a free block */ * ulBlock = pArea->pMemoRoot->ulNextBlock; - pArea->pMemoRoot->ulNextBlock += uiBlocks; + pArea->pMemoRoot->ulNextBlock += ulBlocks; pArea->pMemoRoot->fChanged = TRUE; } @@ -585,48 +611,56 @@ static void hb_cdxGetFreeBlocks( CDXAREAP pArea, USHORT uiBlocks, ULONG * ulBloc static void hb_cdxWriteMemo( CDXAREAP pArea, ULONG ulBlock, PHB_ITEM pItem, ULONG ulLen, ULONG * ulStoredBlock, USHORT uiType ) { - USHORT uiBloksRequired, uiBlocksUsed; + /* USHORT uiBloksRequired, uiBlocksUsed; */ + ULONG ulBlocksRequired, ulBlocksUsed; MEMOBLOCK mbBlock; BOOL bWriteBlocks; HB_TRACE(HB_TR_DEBUG, ("hb_cdxWriteMemo(%p, %lu, %p, %lu, %p, %hu)", pArea, ulBlock, pItem, ulLen, ulStoredBlock, uiType)); - + /* uiBloksRequired = ( USHORT ) (( ulLen + sizeof( MEMOBLOCK ) + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize); + */ + ulBlocksRequired = (( ulLen + sizeof( MEMOBLOCK ) + pArea->uiMemoBlockSize - 1 ) / + pArea->uiMemoBlockSize); if( ulBlock > 0 ) { hb_fsSeek( pArea->hMemoFile, ulBlock * pArea->uiMemoBlockSize, FS_SET ); hb_fsRead( pArea->hMemoFile, ( BYTE * ) &mbBlock, sizeof( MEMOBLOCK ) ); + /* uiBlocksUsed = ( USHORT ) (( hb_cdxSwapBytes( mbBlock.ulSize ) + sizeof( MEMOBLOCK ) + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize); + */ + ulBlocksUsed = (( hb_cdxSwapBytes( mbBlock.ulSize ) + sizeof( MEMOBLOCK ) + + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize); } bWriteBlocks = FALSE; /* Use same space */ - if( ulBlock > 0 && uiBlocksUsed >= uiBloksRequired ) + if( ulBlock > 0 && ulBlocksUsed >= ulBlocksRequired ) { * ulStoredBlock = ulBlock; bWriteBlocks = TRUE; /* Free space */ - if( uiBlocksUsed > uiBloksRequired ) - hb_cdxAddFreeBlocks( pArea, ulBlock + uiBloksRequired, uiBlocksUsed - uiBloksRequired ); + if( ulBlocksUsed > ulBlocksRequired ) + hb_cdxAddFreeBlocks( pArea, ulBlock + ulBlocksRequired, ulBlocksUsed - ulBlocksRequired ); } else /* Need more space */ { if( ulBlock > 0 ) { - if( hb_cdxCompleteFromFreeBlocks( pArea, ulBlock + uiBlocksUsed, - uiBloksRequired - uiBlocksUsed ) ) + if( hb_cdxCompleteFromFreeBlocks( pArea, ulBlock + ulBlocksUsed, + ulBlocksRequired - ulBlocksUsed ) ) bWriteBlocks = TRUE; else /* Free all blocks */ - hb_cdxAddFreeBlocks( pArea, ulBlock, uiBlocksUsed ); + hb_cdxAddFreeBlocks( pArea, ulBlock, ulBlocksUsed ); } if( !bWriteBlocks ) { - hb_cdxGetFreeBlocks( pArea, uiBloksRequired, ulStoredBlock ); + hb_cdxGetFreeBlocks( pArea, ulBlocksRequired, ulStoredBlock ); bWriteBlocks = TRUE; } } @@ -647,7 +681,8 @@ static void hb_cdxWriteMemo( CDXAREAP pArea, ULONG ulBlock, PHB_ITEM pItem, ULON */ static BOOL hb_cdxPutMemo( CDXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) { - USHORT uiBlocksUsed; + /* USHORT uiBlocksUsed; */ + ULONG ulBlocksUsed; ULONG ulLen, ulBlock; MEMOBLOCK mbBlock; @@ -664,9 +699,14 @@ static BOOL hb_cdxPutMemo( CDXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) { hb_fsSeek( pArea->hMemoFile, ulBlock * pArea->uiMemoBlockSize, FS_SET ); hb_fsRead( pArea->hMemoFile, ( BYTE * ) &mbBlock, sizeof( MEMOBLOCK ) ); + /* uiBlocksUsed = ( USHORT ) (( hb_cdxSwapBytes( mbBlock.ulSize ) + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize); hb_cdxAddFreeBlocks( pArea, ulBlock, uiBlocksUsed ); + */ + ulBlocksUsed = (( hb_cdxSwapBytes( mbBlock.ulSize ) + + pArea->uiMemoBlockSize - 1 ) / pArea->uiMemoBlockSize); + hb_cdxAddFreeBlocks( pArea, ulBlock, ulBlocksUsed ); } ulBlock = 0; } @@ -4102,9 +4142,9 @@ ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL bSoftSeek, PHB_ITEM pKey, BOOL bFindLas pArea->fFound = FALSE; if( !bSoftSeek ) { - //retvalue = SELF_GOTO( ( AREAP ) pArea, 0 ); - SELF_GOBOTTOM( ( AREAP ) pArea ); - retvalue = SELF_SKIP( ( AREAP ) pArea, 1 ); + //SELF_GOBOTTOM( ( AREAP ) pArea ); + //retvalue = SELF_SKIP( ( AREAP ) pArea, 1 ); + retvalue = hb_cdxGoEof( pArea ); } } } @@ -4130,10 +4170,9 @@ ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL bSoftSeek, PHB_ITEM pKey, BOOL bFindLas } else { - SELF_GOBOTTOM( ( AREAP ) pArea ); - /* return SELF_SKIP( ( AREAP ) pArea, 1 ); */ - retvalue = SELF_SKIP( ( AREAP ) pArea, 1 ); - /*pArea->fEof = pTag->TagEOF = TRUE; */ + /* SELF_GOBOTTOM( ( AREAP ) pArea ); + retvalue = SELF_SKIP( ( AREAP ) pArea, 1 ); */ + retvalue = hb_cdxGoEof( pArea ); } } if( !hb_cdxTopScope( pTag, pTag->CurKeyInfo ) || @@ -5640,11 +5679,18 @@ ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInf break; case DBOI_NUMBER: - if( pArea->lpIndexes ) - /* hb_itemPutNI( pOrderInfo->itmResult, pArea->lpIndexes->uiTag ); */ - hb_itemPutNI( pOrderInfo->itmResult, pArea->uiTag ); + if( ! pOrderInfo->itmOrder ) + { + if( pArea->lpIndexes ) + /* hb_itemPutNI( pOrderInfo->itmResult, pArea->lpIndexes->uiTag ); */ + hb_itemPutNI( pOrderInfo->itmResult, pArea->uiTag ); + else + hb_itemPutNI( pOrderInfo->itmResult, 0 ); + } else - hb_itemPutNI( pOrderInfo->itmResult, 0 ); + { + hb_itemPutNI( pOrderInfo->itmResult, hb_cdxFindTag( pArea, pOrderInfo ) ); + } break; case DBOI_BAGNAME :