2001-02-08 20:57 GMT+3 Alexander Kresin <alex@belacy.belgorod.su>

This commit is contained in:
Alexander S.Kresin
2001-02-08 18:00:03 +00:00
parent 442c484d3b
commit f2d00a1112
2 changed files with 101 additions and 6 deletions

View File

@@ -1,3 +1,9 @@
2001-02-08 20:57 GMT+3 Alexander Kresin <alex@belacy.belgorod.su>
* harbour/source/rdd/dbfntx/dbfntx1.c
+ ntxPutValue()
+ hb_ntxPageKeyDel()
Updating of opened indexes implemented ( not good yet, but works ).
2001-02-08 17:30 GMT+1 Ignacio Ortiz <ignacioortiz@fivetech.com>
* harbour/source/debug/dbgtmenu.prg
+ Minor fix

View File

@@ -116,6 +116,8 @@ static void hb_ntxPageSave( LPPAGEINFO pPage );
/* Save page */
static LPPAGEINFO hb_ntxPageLoad( ULONG ulOffset );
/* Load page from disk */
static ERRCODE hb_ntxPageKeyDel( LPPAGEINFO pPage, SHORT pos );
/* Delete key from page */
static ERRCODE hb_ntxPageKeyAdd( LPPAGEINFO pPage, PHB_ITEM pKey, int level);
/* Add key to page */
static ERRCODE hb_ntxPageKeyInsert( LPPAGEINFO pPage, PHB_ITEM pKey, int pos );
@@ -477,7 +479,7 @@ static BOOL hb_ntxPageReadNextKey( LPTAGINFO pTag )
pPage->CurKey = hb_ntxPageFindCurrentKey( pPage,pTag->CurKeyInfo->Xtra );
if( pPage->CurKey )
{
if( pPage->CurKey < pPage->uiKeys ||
if( pPage->CurKey < pPage->uiKeys ||
( pPage->CurKey == pPage->uiKeys && ( pPage->pKeys+pPage->CurKey )->Tag ) )
{
while( ( pPage->pKeys+pPage->CurKey )->Tag )
@@ -1058,8 +1060,17 @@ static LPPAGEINFO hb_ntxPageNew(LPTAGINFO pParentTag )
pParentTag->RootPage = pPage;
}
pPage->CurKey = -1;
pParentTag->TagBlock = pParentTag->TagBlock + 1024;
pPage->Page = pParentTag->TagBlock;
if( pParentTag->Owner->NextAvail > 0 )
{
pPage->Page = pParentTag->Owner->NextAvail;
pParentTag->Owner->NextAvail = 0;
hb_ntxHeaderSave( pParentTag->Owner );
}
else
{
pParentTag->TagBlock = pParentTag->TagBlock + 1024;
pPage->Page = pParentTag->TagBlock;
}
pPage->lBusy = TRUE;
pParentTag->uiPages ++;
pPage->pKeys = ( LPKEYINFO ) hb_xgrab( sizeof( KEYINFO ) * ( pParentTag->MaxKeys + 1 ) );
@@ -1102,7 +1113,6 @@ static ERRCODE hb_ntxPageAddPageKeyAdd( LPPAGEINFO pPage, PHB_ITEM pKey, int lev
{
nBegin--;
nCount++;
}
nEnd = pos;
while( ( nCount < nMaxCount ) && ( nEnd < pPage->uiKeys - 1 ) && ( pPage->pKeys[ nEnd + 1 ].Tag == 0 ) )
@@ -1145,6 +1155,21 @@ static ERRCODE hb_ntxPageKeyInsert( LPPAGEINFO pPage, PHB_ITEM pKey, int pos )
return SUCCESS;
}
static ERRCODE hb_ntxPageKeyDel( LPPAGEINFO pPage, SHORT pos )
{
hb_itemRelease( pPage->pKeys[pos].pItem );
memmove( pPage->pKeys + pos , pPage->pKeys + pos + 1,
( pPage->uiKeys - pos + 1) * sizeof( KEYINFO ) );
pPage->uiKeys--;
pPage->Changed = TRUE;
if( !pPage->uiKeys )
{
pPage->TagParent->Owner->NextAvail = pPage->Page;
hb_ntxHeaderSave( pPage->TagParent->Owner );
}
return SUCCESS;
}
static ERRCODE hb_ntxPageKeyAdd( LPPAGEINFO pPage, PHB_ITEM pKey, int level)
{
int i,cmp;
@@ -1405,7 +1430,7 @@ static LPNTXINDEX hb_ntxIndexNew( NTXAREAP pArea )
pIndex->DiskFile = FS_ERROR;
pIndex->Owner = pArea;
pIndex->NextAvail = -1;
pIndex->NextAvail = 0;
pIndex->TagRoot = 1;
return pIndex;
}
@@ -1446,6 +1471,10 @@ static ERRCODE hb_ntxHeaderLoad( LPNTXINDEX pIndex , char *ITN)
NTXHEADER Header;
LPTAGINFO pTag;
PHB_ITEM pExpr, pKeyExp;
ULONG ulPos;
ulPos = hb_fsSeek( pIndex->DiskFile, 0, SEEK_END );
pTag->TagBlock = ulPos/1024;
hb_fsSeek( pIndex->DiskFile , 0 , 0 );
if( hb_fsRead( pIndex->DiskFile,(BYTE*)&Header,sizeof(NTXHEADER)) != sizeof(NTXHEADER) )
@@ -1694,6 +1723,66 @@ static ERRCODE ntxSkipRaw( NTXAREAP pArea, LONG lToSkip )
return SUCCESS;
}
static ERRCODE ntxPutValue( NTXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
{
LPNTXINDEX lpIndex, lpIndexTmp;
LPKEYINFO pKey, pKeyOld;
LPTAGINFO pTag;
LPPAGEINFO pPage;
PHB_ITEM pItemNew;
HB_TRACE(HB_TR_DEBUG, ("ntxPutValue(%p, %hu, %p)", pArea, uiIndex, pItem));
pItemNew = hb_itemNew( pItem );
hb_itemClear( pItem );
lpIndex = pArea->lpNtxIndex;
lpIndexTmp = pArea->lpCurIndex;
while( lpIndex )
{
pTag = lpIndex->CompoundTag;
hb_ntxGetCurrentKey( pTag, pTag->CurKeyInfo );
lpIndex = lpIndex->pNext;
}
/* printf( "\n\rntxPutValue - 1: |%s|",pItemNew->item.asString.value ); */
SUPER_PUTVALUE( ( AREAP ) pArea, uiIndex, pItemNew);
hb_itemRelease( pItemNew );
pKey = hb_ntxKeyNew();
pKeyOld = hb_ntxKeyNew();
lpIndex = pArea->lpNtxIndex;
while( lpIndex )
{
pTag = lpIndex->CompoundTag;
hb_ntxGetCurrentKey( pTag, pKey );
if( hb_ntxItemCompare( pKey->pItem, pTag->CurKeyInfo->pItem, TRUE ) )
{
pArea->lpCurIndex = lpIndex;
hb_itemCopy( pKeyOld->pItem, pTag->CurKeyInfo->pItem );
pKeyOld->Xtra = pTag->CurKeyInfo->Xtra;
pKeyOld->Tag = NTX_IGNORE_REC_NUM;
if( hb_ntxTagFindCurrentKey( hb_ntxPageLoad( 0 ), pKeyOld->Tag, pKeyOld, FALSE, NULL, NULL, NULL, NULL ) )
{
printf( "\n\rntxPutValue: Cannot find current key:" );
lpIndex = lpIndex->pNext;
continue;
}
pPage = hb_ntxPageLoad( pTag->CurKeyInfo->Tag );
pPage->CurKey = hb_ntxPageFindCurrentKey( pPage,pTag->CurKeyInfo->Xtra ) - 1;
hb_ntxPageKeyDel( pPage, pPage->CurKey );
hb_ntxTagKeyAdd( pTag, pKey->pItem );
}
lpIndex = lpIndex->pNext;
}
hb_ntxKeyFree( pKeyOld );
hb_ntxKeyFree( pKey );
pArea->lpCurIndex = lpIndexTmp;
return SUCCESS;
}
/*
* Retrieve the size of the WorkArea structure.
*/
@@ -2119,7 +2208,7 @@ static RDDFUNCS ntxTable = { ntxBof,
ntxGoCold,
ntxGoHot,
ntxPutRec,
ntxPutValue,
( DBENTRYP_SI ) ntxPutValue,
ntxRecall,
ntxRecCount,
ntxRecInfo,