From 12b80748e210730cae3a3277c73e1865a114bb8d Mon Sep 17 00:00:00 2001 From: Ryszard Glab Date: Fri, 27 Oct 2000 08:29:20 +0000 Subject: [PATCH] ChangeLog 2000-10-27 10:40 UTC+0100 --- harbour/ChangeLog | 10 + harbour/include/hbrddcdx.h | 26 +-- harbour/source/rdd/dbfcdx/dbfcdx1.c | 310 +++------------------------- 3 files changed, 56 insertions(+), 290 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 80cc0b4573..e8c14a2d76 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,13 @@ +2000-10-27 10:40 UTC+0100 Ryszard Glab + + *include/hbrddcdx.h + *some comments added + + *source/rdd/dbfcdx/dbfcdx1.c + * result of macro evaluation (hb_macroRun()) has to be popped + from the stack + * added some comments + 2000-10-26 22:10 GMT -3 Luiz Rafael Culik *Changelog renamed to ChangeLog.009 and started an new one diff --git a/harbour/include/hbrddcdx.h b/harbour/include/hbrddcdx.h index 2af2830c41..57098b389a 100644 --- a/harbour/include/hbrddcdx.h +++ b/harbour/include/hbrddcdx.h @@ -131,28 +131,28 @@ typedef MEMOROOT * LPMEMOROOT; typedef struct _CDXTAG { - char * szName; /* Name of tag */ - PHB_ITEM pKeyItem; - PHB_ITEM pForItem; - char * KeyExpr; - char * ForExpr; - USHORT uiType; - USHORT uiLen; - struct _CDXINDEX * pIndex; + char * szName; /* Name of tag */ + PHB_ITEM pKeyItem; /* item with a macro pcode for a tag key expression */ + PHB_ITEM pForItem; /* item with a macro pcode for a tag for expression */ + char * KeyExpr; /* a tag key expression as text */ + char * ForExpr; /* a tag for expression as text */ + USHORT uiType; /* a type of key expression value */ + USHORT uiLen; /* length of the key expression value */ + struct _CDXINDEX * pIndex; /* a parent index info */ // review this ... struct _CDXTAG * pNext; - BOOL AscendKey; - BOOL UniqueKey; + BOOL AscendKey; /* ascending/descending order flag */ + BOOL UniqueKey; /* unique order flag */ BOOL TagChanged; BOOL TagBOF; BOOL TagEOF; //BYTE KeyType; BYTE OptFlags; - LONG TagBlock; - LONG RootBlock; + LONG TagBlock; /* a page offset where a tag header is stored */ + LONG RootBlock; /* a page offset with the root of keys tree */ //USHORT KeyLength; USHORT MaxKeys; - LPKEYINFO CurKeyInfo; + LPKEYINFO CurKeyInfo; /* current value of key expression */ LPPAGEINFO RootPage; } CDXTAG; typedef CDXTAG * LPCDXTAG; diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index 67b7ec6f36..7beac97c84 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -619,46 +619,6 @@ static BOOL hb_cdxPutMemo( CDXAREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) return TRUE; } -/* #if 0 is used to suppress 'nested comments' warnings in GCC */ -#if 0 -static void hb_cdxCreateCompoundTag( LPCDXINDEX pIndex ) -{ - CDXTAGHEADER cdxTagHeader; - CDXLEAFHEADER cdxLeafHeader; - - pIndex->pCompound = ( LPCDXTAG ) hb_xgrab( sizeof( CDXTAG ) ); - pIndex->pCompound->szName = NULL; - pIndex->pCompound->uiType = HB_IT_STRING; - pIndex->pCompound->uiLen = CDX_MAXTAGNAMELEN; - pIndex->pCompound->pKeyItem = pIndex->pCompound->pForItem = NULL; - pIndex->pCompound->pIndex = pIndex; - - /* Write header */ - memset( &cdxTagHeader, 0, sizeof( CDXTAGHEADER ) ); - cdxTagHeader.lRoot = CDX_PAGELEN * 2; - cdxTagHeader.uiKeySize = CDX_MAXTAGNAMELEN; - cdxTagHeader.iExprLen = cdxTagHeader.iFilterLen = cdxTagHeader.iFilterPos = 1; - cdxTagHeader.bType = 0xE0; - hb_fsWrite( pIndex->hFile, ( BYTE * ) &cdxTagHeader, CDX_PAGELEN ); - - /* Append the empty keypool */ - memset( &cdxTagHeader, 0, sizeof( CDXTAGHEADER ) ); - hb_fsWrite( pIndex->hFile, ( BYTE * ) &cdxTagHeader, CDX_PAGELEN ); -printf("\n%hu %hu\n",sizeof(LONG),sizeof(CDXLEAFHEADER)); - /* Append the empty root node */ -// memset( &cdxLeafHeader, 0, sizeof( CDXLEAFHEADER ) ); -// cdxLeafHeader.uiNodeType = CDX_ROOTTYPE | CDX_LEAFTYPE; -// cdxLeafHeader.lLeftNode = cdxLeafHeader.lRightNode = -1; -// cdxLeafHeader.uiFreeSpace = CDX_LEAFFREESPACE; -// cdxLeafHeader.ulRecNumMask = 0xFFFF; -// cdxLeafHeader.bDupByteMask = cdxLeafHeader.bTrailByteMask = 0xF; -// cdxLeafHeader.bRecNumLen = 16; -// cdxLeafHeader.bDupCntLen = cdxLeafHeader.bTrailCntLen = 4; -// cdxLeafHeader.bInfo = 3; -// hb_fsWrite( pIndex->hFile, ( BYTE * ) &cdxLeafHeader, CDX_PAGELEN ); -} -#endif - /* * -- DBFCDX METHODS -- */ @@ -890,240 +850,6 @@ ERRCODE hb_cdxOrderListClear( CDXAREAP pArea ) } */ -/* - * Create new order. - */ - -/* #if 0 is used to suppress 'nested comments' warnings in GCC */ -#if 0 -ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo ) -{ - USHORT uiType, uiLen; - char * szFileName, * szTagName; - PHB_ITEM pKeyExp, pForExp, pResult, pError; - HB_MACRO_PTR pExpMacro, pForMacro; - PHB_FNAME pFileName; - DBORDERINFO dbOrderInfo; - LPCDXINDEX pIndex; - LPCDXTAG pTag; - BOOL bNewFile; - - HB_TRACE(HB_TR_DEBUG, ("hb_cdxOrderCreate(%p, %p)", pArea, pOrderInfo)); - - if( SELF_GOCOLD( ( AREAP ) pArea ) == FAILURE ) - return FAILURE; - - /* If we have a codeblock for the expression, use it */ - if( pOrderInfo->itmCobExpr ) - pKeyExp = hb_itemNew( pOrderInfo->itmCobExpr ); - else /* Otherwise, try compiling the key expression string */ - { - if( SELF_COMPILE( ( AREAP ) pArea, ( BYTE * ) pOrderInfo->abExpr->item.asString.value ) == FAILURE ) - return FAILURE; - pKeyExp = hb_itemNew( pArea->valResult ); - } - - /* Get a blank record before testing expression */ - SUPER_GOTO( ( AREAP ) pArea, 0 ); - if( hb_itemType( pKeyExp ) == HB_IT_BLOCK ) - { - if( SELF_EVALBLOCK( ( AREAP ) pArea, pKeyExp ) == FAILURE ) - { - hb_itemRelease( pKeyExp ); - return FAILURE; - } - pResult = hb_itemNew( pArea->valResult ); - pExpMacro = NULL; - } - else - { - pExpMacro = ( HB_MACRO_PTR ) hb_itemGetPtr( pKeyExp ); - hb_macroRun( pExpMacro ); - pResult = hb_itemNew( &hb_stack.Return ); - } - uiType = hb_itemType( pResult ); - uiLen = 0; - switch( uiType ) - { - case HB_IT_INTEGER: - case HB_IT_LONG: - case HB_IT_DOUBLE: - case HB_IT_DATE: - uiLen = 8; - break; - - case HB_IT_LOGICAL: - uiLen = 1; - break; - - case HB_IT_STRING: - uiLen = ( USHORT ) HB_MAX( hb_itemGetCLen( pResult ), CDX_MAXKEY ); - break; - } - hb_itemRelease( pResult ); - - /* Make sure uiLen is not 0 */ - if( uiLen == 0 ) - { - hb_itemRelease( pKeyExp ); - if( pExpMacro ) - hb_macroDelete( pExpMacro ); - pError = hb_errNew(); - hb_errPutGenCode( pError, EG_DATAWIDTH ); - hb_errPutSubCode( pError, EDBF_INVALIDKEY ); - hb_errPutDescription( pError, hb_langDGetErrorDesc( EG_DATAWIDTH ) ); - SELF_ERROR( ( AREAP ) pArea, pError ); - hb_errRelease( pError ); - return FAILURE; - } - - /* Check conditional expression */ - pForExp = NULL; - if( pArea->lpdbOrdCondInfo ) - { - /* If we have a codeblock for the conditional expression, use it */ - if( pArea->lpdbOrdCondInfo->itmCobFor ) - pForExp = hb_itemNew( pArea->lpdbOrdCondInfo->itmCobFor ); - else /* Otherwise, try compiling the conditional expression string */ - { - if( SELF_COMPILE( ( AREAP ) pArea, pArea->lpdbOrdCondInfo->abFor ) == FAILURE ) - { - hb_itemRelease( pKeyExp ); - if( pExpMacro ) - hb_macroDelete( pExpMacro ); - return FAILURE; - } - pForExp = hb_itemNew( pArea->valResult ); - } - } - - /* Test conditional expression */ - if( pForExp ) - { - if( hb_itemType( pForExp ) == HB_IT_BLOCK ) - { - if( SELF_EVALBLOCK( ( AREAP ) pArea, pForExp ) == FAILURE ) - { - hb_itemRelease( pKeyExp ); - hb_itemRelease( pForExp ); - if( pExpMacro ) - hb_macroDelete( pExpMacro ); - return FAILURE; - } - uiType = hb_itemType( pArea->valResult ); - } - else - { - pForMacro = ( HB_MACRO_PTR ) hb_itemGetPtr( pForExp ); - hb_macroRun( pForMacro ); - uiType = hb_itemType( &hb_stack.Return ); - } - if( uiType != HB_IT_LOGICAL ) - { - hb_itemRelease( pKeyExp ); - hb_itemRelease( pForExp ); - if( pExpMacro ) - hb_macroDelete( pExpMacro ); - if( pForMacro ) - hb_macroDelete( pForMacro ); - return FAILURE; - } - } - else - pForMacro = NULL; - - /* Check file name */ - szFileName = ( char * ) hb_xgrab( _POSIX_PATH_MAX + 1 ); - szTagName = ( char * ) hb_xgrab( CDX_MAXTAGNAMELEN + 1 ); - if( strlen( ( char * ) pOrderInfo->abBagName ) == 0 ) - { - pFileName = hb_fsFNameSplit( pArea->szDataFileName ); - dbOrderInfo.itmResult = hb_itemPutC( NULL, "" ); - SELF_ORDINFO( ( AREAP ) pArea, DBOI_BAGEXT, &dbOrderInfo ); - if( pFileName->szDrive ) - strcpy( szFileName, pFileName->szDrive ); - else - szFileName[ 0 ] = 0; - if( pFileName->szPath ) - strcat( szFileName, pFileName->szPath ); - strcat( szFileName, pFileName->szName ); - strncat( szFileName, hb_itemGetCPtr( dbOrderInfo.itmResult ), _POSIX_PATH_MAX - - strlen( szFileName ) ); - hb_itemRelease( dbOrderInfo.itmResult ); - if( strlen( ( char * ) pOrderInfo->atomBagName ) == 0 ) - hb_strncpyUpper( szTagName, pFileName->szName, CDX_MAXTAGNAMELEN ); - else - hb_strncpyUpper( szTagName, ( char * ) pOrderInfo->atomBagName, CDX_MAXTAGNAMELEN ); - hb_xfree( pFileName ); - } - else - { - strcpy( szFileName, ( char * ) pOrderInfo->abBagName ); - pFileName = hb_fsFNameSplit( szFileName ); - if( !pFileName->szExtension ) - { - dbOrderInfo.itmResult = hb_itemPutC( NULL, "" ); - SELF_ORDINFO( ( AREAP ) pArea, DBOI_BAGEXT, &dbOrderInfo ); - strncat( szFileName, hb_itemGetCPtr( dbOrderInfo.itmResult ), _POSIX_PATH_MAX - - strlen( szFileName ) ); - hb_itemRelease( dbOrderInfo.itmResult ); - } - if( strlen( ( char * ) pOrderInfo->atomBagName ) == 0 ) - hb_strncpyUpper( szTagName, pFileName->szName, CDX_MAXTAGNAMELEN ); - else - hb_strncpyUpper( szTagName, ( char * ) pOrderInfo->atomBagName, CDX_MAXTAGNAMELEN ); - hb_xfree( pFileName ); - } - - /* Close all index */ - SELF_ORDLSTCLEAR( ( AREAP ) pArea ); - - pIndex = ( LPCDXINDEX ) hb_xgrab( sizeof( CDXINDEX ) ); - pIndex->pArea = pArea; - pIndex->szFileName = szFileName; - - /* New file? */ - if( !hb_fsFile( ( BYTE * ) szFileName ) ) - { - pIndex->hFile = hb_fsCreate( ( BYTE * ) szFileName, FC_NORMAL ); - bNewFile = TRUE; - } - else - { - printf("TODO: OpenIndex()\n"); - pIndex->hFile = FS_ERROR; - bNewFile = FALSE; - } - - pTag = ( LPCDXTAG ) hb_xgrab( sizeof( CDXTAG ) ); - pTag->szName = szTagName; - pTag->uiType = uiType; - pTag->uiLen = uiLen; - pTag->pKeyItem = pKeyExp; - pTag->pForItem = pForExp; - pTag->pIndex = pIndex; - - if( bNewFile ) - hb_cdxCreateCompoundTag( pIndex ); - -hb_fsClose( pIndex->hFile ); -hb_xfree( pTag->szName ); -hb_xfree( pTag->pKeyItem ); -hb_xfree( pTag ); -hb_xfree( pIndex->szFileName ); -hb_xfree( pIndex->pCompound ); -hb_xfree( pIndex ); - - - /* Free all macros */ - if( pExpMacro ) - hb_macroDelete( pExpMacro ); - if( pForMacro ) - hb_macroDelete( pForMacro ); - return SUCCESS; -} -#endif - /* * Provides information about order management. */ @@ -1426,6 +1152,13 @@ static int hb_cdxKeyCompare( LPKEYINFO pKey1, LPKEYINFO pKey2, USHORT * EndPos, /* hb_cdxTagxxx */ /* #include "cdxtag.c" */ +/* Creates a new structure with a tag information + * + * PIF = pointer to a parent index structure + * ITN = tag name + * TagHdr = number of index page where a tag header is stored or -1 if + * allocate a new tag page +*/ static LPCDXTAG hb_cdxTagNew( LPCDXINDEX PIF, char * ITN, LONG TagHdr ) { LPCDXTAG pTag; @@ -1440,6 +1173,7 @@ static LPCDXTAG hb_cdxTagNew( LPCDXINDEX PIF, char * ITN, LONG TagHdr ) pTag->CurKeyInfo = hb_cdxKeyNew(); if( TagHdr == -1 ) { + /* this tag is not stored in the file yet - allocate a space for it */ pTag->TagBlock = hb_cdxIndexGetAvailPage( PIF ); hb_cdxIndexGetAvailPage( PIF ); pTag->TagChanged = TRUE; @@ -1548,13 +1282,15 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag ) hb_vmPushSymbol( &hb_symEval ); hb_vmPush( pTag->pKeyItem ); hb_vmDo( 0 ); + hb_itemCopy( pKey->pItem, &hb_stack.Return ); } else { pMacro = ( HB_MACRO_PTR ) hb_itemGetPtr( pTag->pKeyItem ); hb_macroRun( pMacro ); - } - hb_itemCopy( pKey->pItem, &hb_stack.Return ); + hb_itemCopy( pKey->pItem, hb_stack.pPos - 1 ); + hb_stackPop(); + } switch( hb_itemType( pKey->pItem ) ) { case HB_IT_STRING: @@ -2067,28 +1803,45 @@ static void hb_cdxTagExtNodeBuild( LPCDXTAG pTag, LPCDXDATA pData, LPPAGEINFO PI } } +/* Read a tag definition from the index file + * + * pTag = structure with a tag information + */ static void hb_cdxTagTagLoad( LPCDXTAG pTag ) { CDXTAGHEADER pHeader; HB_MACRO_PTR pMacro; + /* read the page from a file */ hb_cdxIndexPageRead( pTag->pIndex, pTag->TagBlock, &pHeader, sizeof( CDXTAGHEADER ) ); pTag->RootBlock = pHeader.lRoot; + /* Return if: + * no root page allocated + * invalid root page offset (position inside an index file) + * invalid key value length + */ if( pTag->RootBlock == 0 || pTag->RootBlock % CDX_PAGELEN > 0 || pTag->RootBlock > hb_fsSeek( pTag->pIndex->hFile, 0, FS_END ) || pHeader.uiKeySize > CDX_MAXKEY ) return; + pTag->uiLen = pHeader.uiKeySize; pTag->MaxKeys = ( CDX_PAGELEN - 12 ) / ( pTag->uiLen + 8 ); pTag->OptFlags = pHeader.bType; pTag->UniqueKey = ( pTag->OptFlags & 0x01 ); pTag->AscendKey = ( pHeader.iDescending == 0 ); pTag->KeyExpr = ( char * ) hb_xgrab( CDX_MAXKEY + 1 ); + /* QUESTION: Is UPPER a valid operation here? + * This will break expressions like: + * somefield+'smallcaps'+otherfield + */ hb_strncpyUpper( pTag->KeyExpr, ( char * ) pHeader.KeyPool, CDX_MAXKEY ); + if( pTag->OptFlags < 0x80 && pTag->KeyExpr[ 0 ] == 0 ) return; if( pTag->OptFlags & 0x80 ) return; + SELF_COMPILE( (AREAP) pTag->pIndex->pArea, ( BYTE * ) pTag->KeyExpr ); pTag->pKeyItem = pTag->pIndex->pArea->valResult; pTag->pIndex->pArea->valResult = NULL; @@ -2130,7 +1883,9 @@ static void hb_cdxTagTagLoad( LPCDXTAG pTag ) (hb_stack.pPos - 1)->item.asString.length; break; } + hb_stackPop(); /* pop macro evaluated value */ + /* Check if there is a FOR expression */ if( pHeader.KeyPool[ strlen( pTag->KeyExpr ) + 1 ] == 0 ) return; pTag->ForExpr = ( char * ) hb_xgrab( CDX_MAXKEY + 1 ); @@ -2141,7 +1896,7 @@ static void hb_cdxTagTagLoad( LPCDXTAG pTag ) pTag->pIndex->pArea->valResult = NULL; pMacro = ( HB_MACRO_PTR ) hb_itemGetPtr( pTag->pForItem ); hb_macroRun( pMacro ); - if( hb_itemType( &hb_stack.Return ) != HB_IT_LOGICAL ) + if( hb_itemType( hb_stack.pPos - 1 ) != HB_IT_LOGICAL ) { hb_macroDelete( pMacro ); hb_itemRelease( pTag->pForItem ); @@ -2149,6 +1904,7 @@ static void hb_cdxTagTagLoad( LPCDXTAG pTag ) hb_xfree( pTag->ForExpr ); pTag->ForExpr = NULL; } + hb_stackPop(); } static void hb_cdxTagSetRoot( LPCDXTAG pTag, LPPAGEINFO PIK )