diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.h b/harbour/source/rdd/dbfcdx/dbfcdx1.h index 5c494639b2..3df04eb1f5 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.h +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.h @@ -176,12 +176,14 @@ typedef CDXKEYINFO * LPCDXKEYINFO; struct _CDXTAG; /* forward declaration */ -typedef struct HB_PAGEINFO_STRU +typedef struct HB_CDXPAGEINFO_STRU { LONG Page; LONG Left; LONG Right; BOOL Changed; + BOOL keyAdded; + BYTE bUsed; BOOL NewRoot; BOOL LastEntry; BOOL Reload; @@ -195,16 +197,19 @@ typedef struct HB_PAGEINFO_STRU BYTE TCBits; BYTE DCMask; BYTE TCMask; - USHORT Space; + /* USHORT Space; */ + SHORT FreeSpace; LPCDXKEYINFO pKeys; USHORT uiKeys; SHORT CurKey; - struct HB_PAGEINFO_STRU * Owner; - struct HB_PAGEINFO_STRU * Child; + struct HB_CDXPAGEINFO_STRU * Owner; + struct HB_CDXPAGEINFO_STRU * Child; struct _CDXTAG * TagParent; -} HB_PAGEINFO; + struct HB_CDXPAGEINFO_STRU * pPoolPrev; + struct HB_CDXPAGEINFO_STRU * pPoolNext; +} HB_CDXPAGEINFO; -typedef HB_PAGEINFO * LPPAGEINFO; +typedef HB_CDXPAGEINFO * LPCDXPAGEINFO; /*SORT stuff*/ diff --git a/harbour/source/rdd/dbfcdx/dbfcdx2.h b/harbour/source/rdd/dbfcdx/dbfcdx2.h index 15f081e87d..d11f9227fa 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx2.h +++ b/harbour/source/rdd/dbfcdx/dbfcdx2.h @@ -67,40 +67,40 @@ static void hb_cdxTagTagStore( LPCDXTAG pTag ); static void hb_cdxTagTagOpen( LPCDXTAG pTag, BYTE bCode ); static void hb_cdxTagTagClose( LPCDXTAG pTag ); static LONG hb_cdxTagNewRoot( LPCDXTAG pTag ); -static void hb_cdxTagPageLoad( LPCDXTAG pTag, LPPAGEINFO pPage, short noKeys ); +static void hb_cdxTagPageLoad( LPCDXTAG pTag, LPCDXPAGEINFO pPage, short noKeys ); static void hb_cdxTagKeyRead( LPCDXTAG pTag, BYTE bTypRead ); static void hb_cdxTagKeyAdd( LPCDXTAG pTag, LPCDXKEYINFO pKey ); -static void hb_cdxTagPageStore( LPCDXTAG pTag, LPPAGEINFO PIK ); -static void hb_cdxTagExtNodeWrite( LPCDXTAG pTag, LONG PN, LPCDXDATA pData, LPPAGEINFO PIK ); -static USHORT hb_cdxTagFillExternalNode( LPCDXTAG pTag, LPCDXDATA pData, LPPAGEINFO PIK, +static void hb_cdxTagPageStore( LPCDXTAG pTag, LPCDXPAGEINFO PIK ); +static void hb_cdxTagExtNodeWrite( LPCDXTAG pTag, LONG PN, LPCDXDATA pData, LPCDXPAGEINFO PIK ); +static USHORT hb_cdxTagFillExternalNode( LPCDXTAG pTag, LPCDXDATA pData, LPCDXPAGEINFO PIK, USHORT kcnt, USHORT ck, LPCDXKEYINFO * p ); -static void hb_cdxTagExtNodeBuild( LPCDXTAG pTag, LPCDXDATA pData, LPPAGEINFO pPage, short noKeys ); +static void hb_cdxTagExtNodeBuild( LPCDXTAG pTag, LPCDXDATA pData, LPCDXPAGEINFO pPage, short noKeys ); static void hb_cdxTagTagLoad( LPCDXTAG pTag ); -static void hb_cdxTagSetRoot( LPCDXTAG pTag, LPPAGEINFO PIK ); -static void hb_cdxTagIntNodeWrite( LPCDXTAG pTag, LONG PN, LPCDXDATA pData, LPPAGEINFO PIK ); -static USHORT hb_cdxTagFillInternalNode( LPCDXTAG pTag, LPCDXDATA pData, LPPAGEINFO PIK, +static void hb_cdxTagSetRoot( LPCDXTAG pTag, LPCDXPAGEINFO PIK ); +static void hb_cdxTagIntNodeWrite( LPCDXTAG pTag, LONG PN, LPCDXDATA pData, LPCDXPAGEINFO PIK ); +static USHORT hb_cdxTagFillInternalNode( LPCDXTAG pTag, LPCDXDATA pData, LPCDXPAGEINFO PIK, USHORT kcnt, USHORT ck, LPCDXKEYINFO * p ); -static void hb_cdxTagIntNodeBuild( LPCDXTAG pTag, LPCDXDATA pData, LPPAGEINFO pPage ); +static void hb_cdxTagIntNodeBuild( LPCDXTAG pTag, LPCDXDATA pData, LPCDXPAGEINFO pPage ); static LONG hb_cdxTagKeyFind( LPCDXTAG pTag, LPCDXKEYINFO pKey ); -static LPPAGEINFO hb_cdxPageNew( LPCDXTAG PIT, LPPAGEINFO PIK, LONG FilePosn ); -static void hb_cdxPageFree( LPPAGEINFO pPage ); -static BOOL hb_cdxPageReadTopKey( LPPAGEINFO pPage ); -static BOOL hb_cdxPageReadBottomKey( LPPAGEINFO pPage ); -static int hb_cdxPageSeekKey( LPPAGEINFO pPage, LONG lBlock, LPCDXKEYINFO pKey, BOOL bExact ); -static void hb_cdxPageInsertKey( LPPAGEINFO pPage, LPCDXKEYINFO pKey, BOOL bAddAfter ); -static void hb_cdxPagePageStore( LPPAGEINFO pPage ); -static BOOL hb_cdxPageReadNextKey( LPPAGEINFO pPage ); -static BOOL hb_cdxPageReadPrevKey( LPPAGEINFO pPage ); -static LPCDXKEYINFO hb_cdxPageGetKey( LPPAGEINFO pPage, USHORT uiKey ); -static void hb_cdxPagePageLoad( LPPAGEINFO pPage ); -static int hb_cdxPageRetrieveKey( LPPAGEINFO pPage, LPCDXKEYINFO *pKey ); -static void hb_cdxPageAddNodeKey( LPPAGEINFO pPage, LPCDXKEYINFO pKey ); -static int hb_cdxPageSeekNodeTag( LPPAGEINFO pPage, LONG Tag ); -static BOOL hb_cdxPageGetChild( LPPAGEINFO pPage, LONG Tag ); -static void hb_cdxPageDeleteKey( LPPAGEINFO pPage ); -static void hb_cdxPageReplaceNodeKey( LPPAGEINFO pPage, LPCDXKEYINFO pKey ); -static void hb_cdxPageDeleteNodeKey( LPPAGEINFO pPage ); +static LPCDXPAGEINFO hb_cdxPageNew( LPCDXTAG PIT, LPCDXPAGEINFO PIK, LONG FilePosn ); +static void hb_cdxPageFree( LPCDXPAGEINFO pPage ); +static BOOL hb_cdxPageReadTopKey( LPCDXPAGEINFO pPage ); +static BOOL hb_cdxPageReadBottomKey( LPCDXPAGEINFO pPage ); +static int hb_cdxPageSeekKey( LPCDXPAGEINFO pPage, LONG lBlock, LPCDXKEYINFO pKey, BOOL bExact ); +static void hb_cdxPageInsertKey( LPCDXPAGEINFO pPage, LPCDXKEYINFO pKey, BOOL bAddAfter ); +static void hb_cdxPagePageStore( LPCDXPAGEINFO pPage ); +static BOOL hb_cdxPageReadNextKey( LPCDXPAGEINFO pPage ); +static BOOL hb_cdxPageReadPrevKey( LPCDXPAGEINFO pPage ); +static LPCDXKEYINFO hb_cdxPageGetKey( LPCDXPAGEINFO pPage, USHORT uiKey ); +static void hb_cdxPagePageLoad( LPCDXPAGEINFO pPage ); +static int hb_cdxPageRetrieveKey( LPCDXPAGEINFO pPage, LPCDXKEYINFO *pKey ); +static void hb_cdxPageAddNodeKey( LPCDXPAGEINFO pPage, LPCDXKEYINFO pKey ); +static int hb_cdxPageSeekNodeTag( LPCDXPAGEINFO pPage, LONG Tag ); +static BOOL hb_cdxPageGetChild( LPCDXPAGEINFO pPage, LONG Tag ); +static void hb_cdxPageDeleteKey( LPCDXPAGEINFO pPage ); +static void hb_cdxPageReplaceNodeKey( LPCDXPAGEINFO pPage, LPCDXKEYINFO pKey ); +static void hb_cdxPageDeleteNodeKey( LPCDXPAGEINFO pPage ); static LPCDXINDEX hb_cdxIndexNew( AREAP pArea ); static void hb_cdxIndexFree( LPCDXINDEX pIndex ); @@ -164,3 +164,31 @@ static LPCDXINDEX hb_cdxFindBag( CDXAREAP pArea, char * szBagName ); static LPCDXKEYINFO hb_cdxEvalKey( CDXAREAP pArea, LPCDXTAG pTag ); static BOOL hb_cdxEvalCond ( CDXAREAP pArea, PHB_ITEM pCondItem, BOOL checkenv ); + +static BYTE hb_cdxPageKeyLeafInsert( LPCDXPAGEINFO pPage, LPCDXKEYINFO pKey, BOOL bAddAfter ); +static BYTE hb_cdxPageKeyInsert( LPCDXPAGEINFO pPage, LPCDXKEYINFO pKey, BOOL bAddAfter ); +static void hb_cdxPageCalcLeafSpace( LPCDXPAGEINFO pPage ); +static SHORT hb_cdxPageCalcLeafKeySpace( LPCDXPAGEINFO pPage, + LPCDXKEYINFO pKeyPrev, LPCDXKEYINFO pKey, LPCDXKEYINFO pKeyNext ); +static BYTE hb_cdxPageKeyLeafBalance( LPCDXPAGEINFO pPage ); +static BYTE hb_cdxPageKeyIntBalance( LPCDXPAGEINFO pPage ); +static BYTE hb_cdxPageRootSplit( LPCDXPAGEINFO pPage ); + +static BYTE hb_cdxPageKeyDelete( LPCDXPAGEINFO pPage ); +static BYTE hb_cdxPageKeyLeafDelete( LPCDXPAGEINFO pPage ); + +static void hb_cdxPagePoolFree( LPCDXINDEX pIndex, int nPagesLeft ); +static void hb_cdxPagePoolFreeTag( LPCDXTAG pTag, int nPagesLeft ); +static void hb_cdxPagePoolFlush( LPCDXINDEX pIndex ); +static void hb_cdxPagePoolFlushTag( LPCDXTAG pTag ); +static void hb_cdxPagePoolCheck( LPCDXTAG pTag ); +static void hb_cdxPageRealFree( LPCDXPAGEINFO pPage ); + +static void hb_cdxKeyListFree( LPCDXKEYINFO pKeyList ); +static LPCDXKEYINFO hb_cdxKeyListGetKey ( LPCDXKEYINFO pKeyList, USHORT uiKey ); +static LPCDXKEYINFO hb_cdxKeyListGetLast ( LPCDXKEYINFO pKeyList ); + +#define FAST_GOCOLD(A) ( ((CDXAREAP) (A))->fRecordChanged ? ( SELF_GOCOLD( (A) ) ) : SUCCESS ) + +static void hb_cdxDoGPF ( void ); +static void hb_cdxPageLeafCheckKeys( LPCDXPAGEINFO pPage );