From 11fc9043ea5626810286155b08614ba7b47a5c86 Mon Sep 17 00:00:00 2001 From: Horacio Dario Roldan Kasimatis Date: Wed, 1 May 2002 00:10:49 +0000 Subject: [PATCH] 2002-04-30 20:49 UTC-0300 Horacio Roldan * source/rdd/dbfcdx/dbfcdx1.c * source/rdd/dbfcdx/dbfcdx2.h ! fixed sharing flags in index creation ! fixed tag order after index creation + added function hb_cdxReorderTagList + added dummies handlers for DBOI_KEYADD, DBOI_KEYDELETE. --- harbour/include/hbrddcdx.h | 1 + harbour/source/rdd/dbfcdx/dbfcdx1.c | 57 ++++++++++++++++++++++++++++- harbour/source/rdd/dbfcdx/dbfcdx2.h | 1 + 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/harbour/include/hbrddcdx.h b/harbour/include/hbrddcdx.h index 1cd737a18d..8ac6f8310c 100644 --- a/harbour/include/hbrddcdx.h +++ b/harbour/include/hbrddcdx.h @@ -188,6 +188,7 @@ typedef struct _CDXINDEX struct _CDXINDEX * pNext; /* The next index in the list */ /* USHORT uiTag; */ /* current tag focus */ BOOL fShared; /* Shared file */ + BOOL fReadonly; /* Read only file */ int lockWrite; int lockRead; int changesWritten; diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index e4609cab98..9fcb195346 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -2631,7 +2631,7 @@ static void hb_cdxIndexPageWrite( LPCDXINDEX pIndex, LONG lPos, void * pBuffer, USHORT uiSize ) { /* testing properly rights */ - if ( pIndex->pArea->fReadonly ) + if ( pIndex->fReadonly ) hb_errInternal( 9101, "hb_cdxIndexPageWrite on readonly database.", "", "" ); /* if ( pIndex->fShared && !pIndex->lockWrite ) */ @@ -3503,6 +3503,39 @@ static USHORT hb_cdxFindTag( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) return uiTag; } +static LPCDXTAG hb_cdxReorderTagList ( LPCDXTAG TagList ) +{ + LPCDXTAG pTag1, pTag2, pTagTmp; + + pTag1 = TagList; + while( pTag1->pNext ) + { + if( pTag1->TagBlock < pTag1->pNext->TagBlock ) + pTag1 = pTag1->pNext; + else + { + if( TagList->TagBlock > pTag1->pNext->TagBlock ) + { + pTagTmp = TagList; + TagList = pTag1->pNext; + pTag1->pNext = pTag1->pNext->pNext; + TagList->pNext = pTagTmp; + } + else + { + pTag2 = TagList; + while( pTag2->pNext && (pTag2->pNext->TagBlock < pTag1->pNext->TagBlock) ) + pTag2 = pTag2->pNext; + + pTagTmp = pTag2->pNext; + pTag2->pNext = pTag1->pNext; + pTag1->pNext = pTag1->pNext->pNext; + pTag2->pNext->pNext = pTagTmp; + } + } + } + return TagList; +} @@ -4747,7 +4780,9 @@ ERRCODE hb_cdxOrderListAdd( CDXAREAP pAreaCdx, LPDBORDERINFO pOrderInfo ) /* load the tags*/ pIndex->pCompound = hb_cdxTagNew( pIndex, szFileName, 0 ); pIndex->pCompound->OptFlags = 0xE0; - pIndex->fShared = pAreaCdx->fShared; + pIndex->fShared = pAreaCdx->fShared; + pIndex->fReadonly = pAreaCdx->fReadonly; + hb_cdxIndexResetAvailPage( pIndex ); hb_cdxIndexLockRead( pIndex, NULL ); @@ -5148,6 +5183,8 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pAreaCdx, LPDBORDERCREATEINFO pOrderInfo ) { pIndex->hFile = hb_spCreate( ( BYTE * ) szFileName, FC_NORMAL ); bNewFile = TRUE; + pIndex->fShared = pAreaCdx->fShared; + pIndex->fReadonly = FALSE; } else { @@ -5155,6 +5192,8 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pAreaCdx, LPDBORDERCREATEINFO pOrderInfo ) ( pAreaCdx->fShared ? FO_DENYNONE : FO_EXCLUSIVE ) ); bNewFile = FALSE; + pIndex->fShared = pAreaCdx->fShared; + pIndex->fReadonly = FALSE; } if( pIndex->hFile == FS_ERROR ) @@ -5179,6 +5218,8 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pAreaCdx, LPDBORDERCREATEINFO pOrderInfo ) hb_fsSeek( pIndex->hFile, 0, FS_SET ); } + hb_cdxIndexLockWrite( pIndex, NULL ); + if( bNewFile ) { pIndex->NextAvail = 0; @@ -5210,6 +5251,9 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pAreaCdx, LPDBORDERCREATEINFO pOrderInfo ) } hb_cdxTagKeyRead( pIndex->pCompound, NEXT_RECORD ); } + if ( pIndex->TagList != NULL ) { + pIndex->TagList = hb_cdxReorderTagList(pIndex->TagList); + } } /* Update DBF header */ @@ -5242,6 +5286,8 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pAreaCdx, LPDBORDERCREATEINFO pOrderInfo ) hb_xfree( szTagName ); + hb_cdxIndexUnLockWrite( pIndex, NULL ); + /* Clear pArea->lpdbOrdCondInfo */ SELF_ORDSETCOND( ( AREAP ) pArea, NULL ); @@ -5451,6 +5497,13 @@ ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInf } break; + case DBOI_KEYADD : + hb_itemPutL( pOrderInfo->itmResult, 0 ); + break; + case DBOI_KEYDELETE : + hb_itemPutL( pOrderInfo->itmResult, 0 ); + break; + default: return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); diff --git a/harbour/source/rdd/dbfcdx/dbfcdx2.h b/harbour/source/rdd/dbfcdx/dbfcdx2.h index 857221e048..282d8ac02f 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx2.h +++ b/harbour/source/rdd/dbfcdx/dbfcdx2.h @@ -139,6 +139,7 @@ static LPCDXTAG hb_cdxGetActiveTag( CDXAREAP pArea ); static USHORT hb_cdxFindTag( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ); static LPCDXTAG hb_cdxGetTagByNumber(CDXAREAP pArea, USHORT uiTag ); static PHB_ITEM hb_cdxKeyGetItem( LPKEYINFO pKey, PHB_ITEM pItem, USHORT uiType ); +static LPCDXTAG hb_cdxReorderTagList ( LPCDXTAG TagList ); static USHORT hb_cdxIndexCheckVersion( LPCDXINDEX pIndex ); static USHORT hb_cdxIndexUnLockRead( LPCDXINDEX pIndex, LPCDXTAG pTag );