2002-04-30 20:49 UTC-0300 Horacio Roldan <harbour_ar@yahoo.com.ar>

* 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.
This commit is contained in:
Horacio Dario Roldan Kasimatis
2002-05-01 00:10:49 +00:00
parent 7d2a1cc757
commit 11fc9043ea
3 changed files with 57 additions and 2 deletions

View File

@@ -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;

View File

@@ -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 );

View File

@@ -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 );