From 11aa69b7c3b939ef8fd43b4630e525d3f4a0254b Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 12 Sep 2007 09:50:40 +0000 Subject: [PATCH] 2007-09-12 11:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbrdddbf.h * harbour/source/rdd/dbf1.c + added two new members to DBFAREA structure: fModStamp and fTrigger * harbour/include/hbrddntx.h * harbour/include/hbrddcdx.h * harbour/contrib/bmdbfcdx/hbrddbmcdx.h * updated for DBFAREA structure modifications * harbour/contrib/libct/ctnet.c * use hb_stricmp() instead of stricmp() * harbour/include/hbrddcdx.h * harbour/source/rdd/dbfcdx/dbfcdx1.c * updated for DBFAREA structure modifications + added some very basic support for order temperature flags --- harbour/ChangeLog | 18 ++ harbour/contrib/bmdbfcdx/hbrddbmcdx.h | 2 + harbour/contrib/libct/ctnet.c | 2 +- harbour/include/hbrddcdx.h | 9 +- harbour/include/hbrdddbf.h | 2 + harbour/include/hbrddntx.h | 2 + harbour/source/rdd/dbf1.c | 3 +- harbour/source/rdd/dbfcdx/dbfcdx1.c | 432 +++++++++++++++----------- 8 files changed, 285 insertions(+), 185 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 349a9b38c0..caa923984d 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,24 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-09-12 11:50 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbrdddbf.h + * harbour/source/rdd/dbf1.c + + added two new members to DBFAREA structure: fModStamp and fTrigger + + * harbour/include/hbrddntx.h + * harbour/include/hbrddcdx.h + * harbour/contrib/bmdbfcdx/hbrddbmcdx.h + * updated for DBFAREA structure modifications + + * harbour/contrib/libct/ctnet.c + * use hb_stricmp() instead of stricmp() + + * harbour/include/hbrddcdx.h + * harbour/source/rdd/dbfcdx/dbfcdx1.c + * updated for DBFAREA structure modifications + + added some very basic support for order temperature flags + 2007-09-12 08:29 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * source/rtl/getsys.prg ! Fix for crash in TGetList():ShowGetMsg() reported by Lorenzo. diff --git a/harbour/contrib/bmdbfcdx/hbrddbmcdx.h b/harbour/contrib/bmdbfcdx/hbrddbmcdx.h index 304e741e78..ff13963f86 100644 --- a/harbour/contrib/bmdbfcdx/hbrddbmcdx.h +++ b/harbour/contrib/bmdbfcdx/hbrddbmcdx.h @@ -498,6 +498,7 @@ typedef struct _CDXAREA ULONG ulRecNo; /* Current record */ BOOL fAutoInc; /* WorkArea with auto increment fields */ BOOL fHasMemo; /* WorkArea with Memo fields */ + BOOL fModStamp; /* WorkArea with modification autoupdate fields */ BOOL fHasTags; /* WorkArea with MDX or CDX index */ BOOL fDataFlush; /* data was written to DBF and not commited */ BOOL fMemoFlush; /* data was written to MEMO and not commited */ @@ -513,6 +514,7 @@ typedef struct _CDXAREA BOOL fUpdateHeader; /* Update header of file */ BOOL fFLocked; /* TRUE if file is locked */ BOOL fHeaderLocked; /* TRUE if DBF header is locked */ + BOOL fTrigger; /* Execute trigger function */ LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */ ULONG * pLocksPos; /* List of records locked */ ULONG ulNumLocksPos; /* Number of records locked */ diff --git a/harbour/contrib/libct/ctnet.c b/harbour/contrib/libct/ctnet.c index bddd6bbb72..ca16915836 100644 --- a/harbour/contrib/libct/ctnet.c +++ b/harbour/contrib/libct/ctnet.c @@ -181,7 +181,7 @@ HB_FUNC( NETPRINTER ) { char * cPrn = hb_setGetCPtr( HB_SET_PRINTFILE ); /* query default local printer port. */ - if( !cPrn || !*cPrn || stricmp( cPrn, "PRN" ) == 0 ) + if( !cPrn || !*cPrn || hb_stricmp( cPrn, "PRN" ) == 0 ) cPrn = "LPT1"; hb_retl( hb_IsNetShared( cPrn ) ); } diff --git a/harbour/include/hbrddcdx.h b/harbour/include/hbrddcdx.h index 879d18c990..fcb64d283e 100644 --- a/harbour/include/hbrddcdx.h +++ b/harbour/include/hbrddcdx.h @@ -150,7 +150,7 @@ HB_EXTERN_BEGIN #define CDX_TYPE_STRUCTURE 0x80 /* FoxPro */ /* - TODO like in SIXCDX: + SIx3 order temperature flags: switch ( indexOpt & ( CDX_TYPE_TEMPORARY | CDX_TYPE_CUSTOM ) ) case CDX_TYPE_TEMPORARY: PARTIAL_RYO @@ -325,7 +325,10 @@ typedef struct _CDXTAG BOOL UniqueKey; /* unique order flag */ BOOL Temporary; /* temporary order flag */ BOOL Custom; /* custom order flag */ - + BOOL Template; /* user keyadata in ordKeyAdd()/ordKeyDel() accepted */ + BOOL MultiKey; /* repeated key values in custom indexes accepted */ + BOOL Partial; /* order is updated only partially - missing keys possible */ + BOOL ChgOnly; /* only existing key modifications are updated, no new key added */ BOOL UsrAscend; /* user settable ascending/descending order flag */ BOOL UsrUnique; /* user settable unique order flag */ @@ -496,6 +499,7 @@ typedef struct _CDXAREA BOOL fAutoInc; /* WorkArea with auto increment fields */ BOOL fHasMemo; /* WorkArea with Memo fields */ BOOL fHasTags; /* WorkArea with MDX or CDX index */ + BOOL fModStamp; /* WorkArea with modification autoupdate fields */ BOOL fDataFlush; /* data was written to DBF and not commited */ BOOL fMemoFlush; /* data was written to MEMO and not commited */ BOOL fShared; /* Shared file */ @@ -510,6 +514,7 @@ typedef struct _CDXAREA BOOL fUpdateHeader; /* Update header of file */ BOOL fFLocked; /* TRUE if file is locked */ BOOL fHeaderLocked; /* TRUE if DBF header is locked */ + BOOL fTrigger; /* Execute trigger function */ LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */ ULONG * pLocksPos; /* List of records locked */ ULONG ulNumLocksPos; /* Number of records locked */ diff --git a/harbour/include/hbrdddbf.h b/harbour/include/hbrdddbf.h index 5481b0261f..4467b09137 100644 --- a/harbour/include/hbrdddbf.h +++ b/harbour/include/hbrdddbf.h @@ -192,6 +192,7 @@ typedef struct _DBFAREA BOOL fAutoInc; /* WorkArea with auto increment fields */ BOOL fHasMemo; /* WorkArea with Memo fields */ BOOL fHasTags; /* WorkArea with MDX or CDX index */ + BOOL fModStamp; /* WorkArea with modification autoupdate fields */ BOOL fDataFlush; /* data was written to DBF and not commited */ BOOL fMemoFlush; /* data was written to MEMO and not commited */ BOOL fShared; /* Shared file */ @@ -206,6 +207,7 @@ typedef struct _DBFAREA BOOL fUpdateHeader; /* Update header of file */ BOOL fFLocked; /* TRUE if file is locked */ BOOL fHeaderLocked; /* TRUE if DBF header is locked */ + BOOL fTrigger; /* Execute trigger function */ LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */ ULONG * pLocksPos; /* List of records locked */ ULONG ulNumLocksPos; /* Number of records locked */ diff --git a/harbour/include/hbrddntx.h b/harbour/include/hbrddntx.h index 11720f2619..b5ef2f3557 100644 --- a/harbour/include/hbrddntx.h +++ b/harbour/include/hbrddntx.h @@ -392,6 +392,7 @@ typedef struct _NTXAREA BOOL fAutoInc; /* WorkArea with auto increment fields */ BOOL fHasMemo; /* WorkArea with Memo fields */ BOOL fHasTags; /* WorkArea with MDX or CDX index */ + BOOL fModStamp; /* WorkArea with modification autoupdate fields */ BOOL fDataFlush; /* data was written to DBF and not commited */ BOOL fMemoFlush; /* data was written to MEMO and not commited */ BOOL fShared; /* Shared file */ @@ -406,6 +407,7 @@ typedef struct _NTXAREA BOOL fUpdateHeader; /* Update header of file */ BOOL fFLocked; /* TRUE if file is locked */ BOOL fHeaderLocked; /* TRUE if DBF header is locked */ + BOOL fTrigger; /* Execute trigger function */ LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */ ULONG * pLocksPos; /* List of records locked */ ULONG ulNumLocksPos; /* Number of records locked */ diff --git a/harbour/source/rdd/dbf1.c b/harbour/source/rdd/dbf1.c index e13476eb03..10ad68d947 100644 --- a/harbour/source/rdd/dbf1.c +++ b/harbour/source/rdd/dbf1.c @@ -4180,7 +4180,8 @@ static ERRCODE hb_dbfReadDBHeader( DBFAREAP pArea ) } else { - pArea->fAutoInc = pArea->fTableEncrypted = pArea->fHasMemo = FALSE; + pArea->fAutoInc = pArea->fModStamp = + pArea->fTableEncrypted = pArea->fHasMemo = FALSE; pArea->bTableType = DB_DBF_STD; pArea->bMemoType = DB_MEMO_NONE; pArea->bCryptType = DB_CRYPT_NONE; diff --git a/harbour/source/rdd/dbfcdx/dbfcdx1.c b/harbour/source/rdd/dbfcdx/dbfcdx1.c index afc4d0d70f..eac5f01f50 100644 --- a/harbour/source/rdd/dbfcdx/dbfcdx1.c +++ b/harbour/source/rdd/dbfcdx/dbfcdx1.c @@ -3417,14 +3417,25 @@ static void hb_cdxTagHeaderStore( LPCDXTAG pTag ) */ pTag->TagChanged = FALSE; + pTag->OptFlags &= ~( CDX_TYPE_UNIQUE | CDX_TYPE_FORFILTER | + CDX_TYPE_TEMPORARY | CDX_TYPE_CUSTOM ); if ( pTag->UniqueKey ) pTag->OptFlags |= CDX_TYPE_UNIQUE; + if ( pTag->pForItem != NULL ) + pTag->OptFlags |= CDX_TYPE_FORFILTER; +#if defined( HB_SIXCDX ) + if ( pTag->Custom ) + pTag->OptFlags |= CDX_TYPE_TEMPORARY | CDX_TYPE_CUSTOM; + else if ( pTag->ChgOnly ) + pTag->OptFlags |= CDX_TYPE_CUSTOM; + else if ( pTag->Partial ) + pTag->OptFlags |= CDX_TYPE_TEMPORARY; +#else if ( pTag->Temporary ) pTag->OptFlags |= CDX_TYPE_TEMPORARY; if ( pTag->Custom ) pTag->OptFlags |= CDX_TYPE_CUSTOM; - if ( pTag->pForItem != NULL ) - pTag->OptFlags |= CDX_TYPE_FORFILTER; +#endif memset( &tagHeader, 0, sizeof( CDXTAGHEADER ) ); HB_PUT_LE_UINT32( tagHeader.rootPtr, pTag->RootBlock ); @@ -3485,17 +3496,42 @@ static void hb_cdxTagLoad( LPCDXTAG pTag ) pTag->RootBlock = 0; /* To force RT error - index corrupted */ return; } - pTag->uiLen = HB_GET_LE_UINT16( tagHeader.keySize ); - pTag->MaxKeys = CDX_INT_FREESPACE / ( pTag->uiLen + 8 ); - pTag->OptFlags = tagHeader.indexOpt; - pTag->UniqueKey = ( pTag->OptFlags & CDX_TYPE_UNIQUE ) != 0; - pTag->Temporary = ( pTag->OptFlags & CDX_TYPE_TEMPORARY ) != 0; - pTag->Custom = ( pTag->OptFlags & CDX_TYPE_CUSTOM ) != 0; - pTag->AscendKey = pTag->UsrAscend = ( HB_GET_LE_UINT16( tagHeader.ascendFlg ) == 0 ); - pTag->UsrUnique = FALSE; pTag->KeyExpr = ( char * ) hb_xgrab( CDX_MAXEXP + 1 ); hb_strncpyTrim( pTag->KeyExpr, ( const char * ) tagHeader.keyExpPool, CDX_MAXEXP ); + pTag->uiLen = HB_GET_LE_UINT16( tagHeader.keySize ); + pTag->MaxKeys = CDX_INT_FREESPACE / ( pTag->uiLen + 8 ); + + pTag->OptFlags = tagHeader.indexOpt; + pTag->UniqueKey = ( pTag->OptFlags & CDX_TYPE_UNIQUE ) != 0; +#if defined( HB_SIXCDX ) + pTag->Temporary = FALSE; + pTag->Custom = ( pTag->OptFlags & CDX_TYPE_CUSTOM ) != 0 && + ( pTag->OptFlags & CDX_TYPE_TEMPORARY ) != 0; + pTag->ChgOnly = ( pTag->OptFlags & CDX_TYPE_CUSTOM ) != 0 && + ( pTag->OptFlags & CDX_TYPE_TEMPORARY ) == 0; + pTag->Partial = ( pTag->OptFlags & CDX_TYPE_CUSTOM ) != 0 || + ( pTag->OptFlags & CDX_TYPE_TEMPORARY ) != 0; +#if 0 + /* For CDX format SIx3 really makes sth like that */ + pTag->Template = hb_strnicmp( pTag->KeyExpr, "sxChar(", 7 ) == 0 || + hb_strnicmp( pTag->KeyExpr, "sxDate(", 7 ) == 0 || + hb_strnicmp( pTag->KeyExpr, "sxNum(", 6 ) == 0 || + hb_strnicmp( pTag->KeyExpr, "sxLog(", 6 ) == 0 ) + /* SIx3 does not support repeated key value for the same record */ + pTag->MultiKey = FALSE; +#endif + pTag->Template = pTag->MultiKey = pTag->Custom; +#else + pTag->Temporary = ( pTag->OptFlags & CDX_TYPE_TEMPORARY ) != 0; + pTag->Custom = ( pTag->OptFlags & CDX_TYPE_CUSTOM ) != 0; + pTag->ChgOnly = FALSE; + pTag->Partial = pTag->Temporary || pTag->Custom; + pTag->Template = pTag->MultiKey = pTag->Custom; +#endif + + pTag->AscendKey = pTag->UsrAscend = ( HB_GET_LE_UINT16( tagHeader.ascendFlg ) == 0 ); + pTag->UsrUnique = FALSE; if ( pTag->OptFlags & CDX_TYPE_STRUCTURE || ! *pTag->KeyExpr ) return; @@ -4271,7 +4307,8 @@ static BOOL hb_cdxTagKeyAdd( LPCDXTAG pTag, LPCDXKEY pKey ) hb_cdxTagOpen( pTag ); if( hb_cdxPageSeekKey( pTag->RootPage, pKey, pTag->UniqueKey ? CDX_IGNORE_REC_NUM : pKey->rec, - TRUE ) != 0 || ( pTag->Custom && !pTag->UniqueKey ) ) + TRUE ) != 0 || ( pTag->Custom && pTag->MultiKey && + !pTag->UniqueKey ) ) { hb_cdxPageKeyInsert( pTag->RootPage, pKey ); pTag->curKeyState &= ~( CDX_CURKEY_RAWPOS | CDX_CURKEY_LOGPOS | @@ -4521,6 +4558,8 @@ static LPCDXTAG hb_cdxIndexCreateTag( BOOL fStruct, LPCDXINDEX pIndex, pTag->UniqueKey = fUniq; pTag->UsrUnique = FALSE; pTag->Custom = fCustom; + pTag->Template = pTag->MultiKey = pTag->Custom; + pTag->Partial = pTag->ChgOnly = FALSE; pTag->uiType = bType; pTag->bTrail = ( pTag->uiType == 'C' ) ? ' ' : '\0'; pTag->uiLen = uiLen; @@ -6778,7 +6817,7 @@ static ERRCODE hb_cdxGoCold( CDXAREAP pArea ) * There is possible race condition here but not very dangerous. * To avoid it we should Lock all index file before SUPER_GOCOLD * but it makes other problem if two stations open the database index - * files in a differ order then they can block each other. + * files in a different order then they can block each other. * Without changes in locking scheme we can do only one thing which * is enough if there is only one index file: lock first index only * before SUPER_GOCOLD @@ -7706,79 +7745,79 @@ static ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo ) /* * Provides information about order management. */ -static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInfo ) +static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pInfo ) { LPCDXTAG pTag; USHORT uiTag = 0; - HB_TRACE(HB_TR_DEBUG, ("hb_cdxOrderInfo(%p, %hu, %p)", pArea, uiIndex, pOrderInfo)); + HB_TRACE(HB_TR_DEBUG, ("hb_cdxOrderInfo(%p, %hu, %p)", pArea, uiIndex, pInfo)); switch( uiIndex ) { case DBOI_STRICTREAD: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_STRICTREAD, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_STRICTREAD, 0, pInfo->itmResult ); case DBOI_OPTIMIZE: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_OPTIMIZE, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_OPTIMIZE, 0, pInfo->itmResult ); case DBOI_AUTOOPEN: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOOPEN, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOOPEN, 0, pInfo->itmResult ); case DBOI_AUTOORDER: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOORDER, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOORDER, 0, pInfo->itmResult ); case DBOI_AUTOSHARE: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOSHARE, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_AUTOSHARE, 0, pInfo->itmResult ); case DBOI_BAGEXT: - if( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); else - pOrderInfo->itmResult = hb_itemNew( NULL ); - return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_ORDBAGEXT, 0, pOrderInfo->itmResult ); + pInfo->itmResult = hb_itemNew( NULL ); + return SELF_RDDINFO( SELF_RDDNODE( pArea ), RDDI_ORDBAGEXT, 0, pInfo->itmResult ); case DBOI_EVALSTEP: - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, pArea->lpdbOrdCondInfo ? pArea->lpdbOrdCondInfo->lStep : 0 ); return SUCCESS; case DBOI_KEYSINCLUDED: - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, pArea->pSort ? pArea->pSort->ulTotKeys : 0 ); return SUCCESS; case DBOI_I_TAGNAME: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pArea->pSort ? pArea->pSort->pTag->szName : NULL ); return SUCCESS; case DBOI_I_BAGNAME: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pArea->pSort ? pArea->pSort->pTag->pIndex->szFileName : NULL ); return SUCCESS; case DBOI_ISREINDEX: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pArea->pSort ? pArea->pSort->fReindex : FALSE ); return SUCCESS; @@ -7789,17 +7828,17 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO hb_dbfLockIdxGetData( pArea->bLockType, &ulPos, &ulPool ); if ( uiIndex == DBOI_LOCKOFFSET ) - pOrderInfo->itmResult = hb_itemPutNInt( pOrderInfo->itmResult, ulPos ); + pInfo->itmResult = hb_itemPutNInt( pInfo->itmResult, ulPos ); else - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, ulPool > 0 ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, ulPool > 0 ); return SUCCESS; } case DBOI_ORDERCOUNT: { LPCDXINDEX pIndex; - char *pszBag = hb_itemGetCLen( pOrderInfo->atomBagName ) > 0 ? - hb_itemGetCPtr( pOrderInfo->atomBagName ) : NULL; + char *pszBag = hb_itemGetCLen( pInfo->atomBagName ) > 0 ? + hb_itemGetCPtr( pInfo->atomBagName ) : NULL; pIndex = pszBag ? hb_cdxFindBag( pArea, pszBag ) : pArea->lpIndexes; while ( pIndex ) { @@ -7811,7 +7850,7 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO } pIndex = pszBag ? NULL : pIndex->pNext; } - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, uiTag ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, uiTag ); return SUCCESS; } @@ -7823,7 +7862,7 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO ++uiTag; pIndex = pIndex->pNext; } - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, uiTag ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, uiTag ); return SUCCESS; } @@ -7831,9 +7870,9 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO { LPCDXINDEX pIndex = pArea->lpIndexes, pIndexSeek; - if( hb_itemGetCLen( pOrderInfo->atomBagName ) > 0 ) + if( hb_itemGetCLen( pInfo->atomBagName ) > 0 ) pIndexSeek = hb_cdxFindBag( pArea, - hb_itemGetCPtr( pOrderInfo->atomBagName ) ); + hb_itemGetCPtr( pInfo->atomBagName ) ); else { pTag = hb_cdxGetTagByNumber( pArea, pArea->uiTag ); @@ -7851,7 +7890,7 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO } while ( pIndex ); } - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, pIndex ? uiTag : 0 ); return SUCCESS; } @@ -7860,9 +7899,9 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO { LPCDXINDEX pIndex = pArea->lpIndexes, pIndexSeek; - if( hb_itemGetCLen( pOrderInfo->atomBagName ) > 0 ) + if( hb_itemGetCLen( pInfo->atomBagName ) > 0 ) pIndexSeek = hb_cdxFindBag( pArea, - hb_itemGetCPtr( pOrderInfo->atomBagName ) ); + hb_itemGetCPtr( pInfo->atomBagName ) ); else { pTag = hb_cdxGetTagByNumber( pArea, pArea->uiTag ); @@ -7886,7 +7925,7 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO } while ( pIndex ); } - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, pIndex ? uiTag : 0 ); return SUCCESS; } @@ -7895,9 +7934,9 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO if( FAST_GOCOLD( ( AREAP ) pArea ) == FAILURE ) return FAILURE; - if( pOrderInfo->itmOrder ) + if( pInfo->itmOrder ) { - pTag = hb_cdxFindTag( pArea, pOrderInfo->itmOrder, pOrderInfo->atomBagName, &uiTag ); + pTag = hb_cdxFindTag( pArea, pInfo->itmOrder, pInfo->atomBagName, &uiTag ); } else { @@ -7908,8 +7947,8 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO switch( uiIndex ) { case DBOI_CONDITION: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, ( pTag ? pTag->ForExpr : "" ) ); - if ( pTag && pOrderInfo->itmNewVal && HB_IS_STRING( pOrderInfo->itmNewVal ) ) + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, ( pTag ? pTag->ForExpr : "" ) ); + if ( pTag && pInfo->itmNewVal && HB_IS_STRING( pInfo->itmNewVal ) ) { if ( pTag->ForExpr != NULL ) { @@ -7921,9 +7960,9 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO hb_vmDestroyBlockOrMacro( pTag->pForItem ); pTag->pForItem = NULL; } - if ( hb_itemGetCLen( pOrderInfo->itmNewVal ) > 0 ) + if ( hb_itemGetCLen( pInfo->itmNewVal ) > 0 ) { - char * pForExpr = hb_itemGetCPtr( pOrderInfo->itmNewVal ); + char * pForExpr = hb_itemGetCPtr( pInfo->itmNewVal ); if ( SELF_COMPILE( ( AREAP ) pArea, ( BYTE *) pForExpr ) == SUCCESS ) { @@ -7947,113 +7986,113 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO break; case DBOI_EXPRESSION: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, pTag ? pTag->KeyExpr : "" ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pTag ? pTag->KeyExpr : "" ); break; case DBOI_POSITION: - if ( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) + if ( pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, hb_cdxDBOIKeyGoto( pArea, pTag, - hb_itemGetNL( pOrderInfo->itmNewVal ), TRUE ) == SUCCESS ); + hb_itemGetNL( pInfo->itmNewVal ), TRUE ) == SUCCESS ); } else - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, hb_cdxDBOIKeyNo( pArea, pTag, TRUE ) ); break; /* TODO: is this ok? DBOI_RECNO == DBOI_KEYNORAW ? No, it isn't. */ /* case DBOI_RECNO: */ case DBOI_KEYNORAW: - if ( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) + if ( pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, hb_cdxDBOIKeyGoto( pArea, pTag, - hb_itemGetNL( pOrderInfo->itmNewVal ), FALSE ) == SUCCESS ); + hb_itemGetNL( pInfo->itmNewVal ), FALSE ) == SUCCESS ); } else - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, hb_cdxDBOIKeyNo( pArea, pTag, FALSE ) ); break; case DBOI_KEYCOUNT: - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, hb_cdxDBOIKeyCount( pArea, pTag, TRUE ) ); break; case DBOI_KEYCOUNTRAW: - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, hb_cdxDBOIKeyCount( pArea, pTag, FALSE ) ); break; case DBOI_RELKEYPOS: - if ( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) + if ( pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ) hb_cdxDBOISetRelKeyPos( pArea, pTag, - hb_itemGetND( pOrderInfo->itmNewVal ) ); + hb_itemGetND( pInfo->itmNewVal ) ); else - pOrderInfo->itmResult = hb_itemPutND( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutND( pInfo->itmResult, hb_cdxDBOIGetRelKeyPos( pArea, pTag ) ); break; case DBOI_FINDREC: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, hb_cdxDBOIFindRec( pArea, pTag, - hb_itemGetNL( pOrderInfo->itmNewVal ), FALSE ) ); + hb_itemGetNL( pInfo->itmNewVal ), FALSE ) ); break; case DBOI_FINDRECCONT: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, hb_cdxDBOIFindRec( pArea, pTag, - hb_itemGetNL( pOrderInfo->itmNewVal ), TRUE ) ); + hb_itemGetNL( pInfo->itmNewVal ), TRUE ) ); break; case DBOI_SKIPUNIQUE: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, hb_cdxDBOISkipUnique( pArea, pTag, - hb_itemGetNI( pOrderInfo->itmNewVal ) >= 0 ) == SUCCESS ); + hb_itemGetNI( pInfo->itmNewVal ) >= 0 ) == SUCCESS ); break; case DBOI_SKIPEVAL: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipEval( pArea, pTag, TRUE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipEval( pArea, pTag, TRUE, pInfo->itmNewVal ) ); break; case DBOI_SKIPEVALBACK: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipEval( pArea, pTag, FALSE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipEval( pArea, pTag, FALSE, pInfo->itmNewVal ) ); break; case DBOI_SKIPWILD: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipWild( pArea, pTag, TRUE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipWild( pArea, pTag, TRUE, pInfo->itmNewVal ) ); break; case DBOI_SKIPWILDBACK: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipWild( pArea, pTag, FALSE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipWild( pArea, pTag, FALSE, pInfo->itmNewVal ) ); break; case DBOI_SKIPREGEX: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipRegEx( pArea, pTag, TRUE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipRegEx( pArea, pTag, TRUE, pInfo->itmNewVal ) ); break; case DBOI_SKIPREGEXBACK: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxDBOISkipRegEx( pArea, pTag, FALSE, pOrderInfo->itmNewVal ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxDBOISkipRegEx( pArea, pTag, FALSE, pInfo->itmNewVal ) ); break; case DBOI_SCOPEEVAL: - if ( pTag && pOrderInfo->itmNewVal && - hb_arrayLen( pOrderInfo->itmNewVal ) == DBRMI_SIZE && - hb_arrayGetPtr( pOrderInfo->itmNewVal, DBRMI_FUNCTION ) != NULL ) + if ( pTag && pInfo->itmNewVal && + hb_arrayLen( pInfo->itmNewVal ) == DBRMI_SIZE && + hb_arrayGetPtr( pInfo->itmNewVal, DBRMI_FUNCTION ) != NULL ) { - pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNL( pInfo->itmResult, hb_cdxDBOIScopeEval( pTag, ( HB_EVALSCOPE_FUNC ) - hb_arrayGetPtr( pOrderInfo->itmNewVal, DBRMI_FUNCTION ), - hb_arrayGetPtr( pOrderInfo->itmNewVal, DBRMI_PARAM ), - hb_arrayGetItemPtr( pOrderInfo->itmNewVal, DBRMI_LOVAL ), - hb_arrayGetItemPtr( pOrderInfo->itmNewVal, DBRMI_HIVAL ) ) ); + hb_arrayGetPtr( pInfo->itmNewVal, DBRMI_FUNCTION ), + hb_arrayGetPtr( pInfo->itmNewVal, DBRMI_PARAM ), + hb_arrayGetItemPtr( pInfo->itmNewVal, DBRMI_LOVAL ), + hb_arrayGetItemPtr( pInfo->itmNewVal, DBRMI_HIVAL ) ) ); } else { @@ -8063,50 +8102,50 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO break; case DBOI_NAME: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, pTag ? pTag->szName : "" ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pTag ? pTag->szName : "" ); break; case DBOI_NUMBER: - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, uiTag ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, uiTag ); break; case DBOI_BAGNAME: if ( pTag ) { PHB_FNAME pFileName = hb_fsFNameSplit( pTag->pIndex->szFileName ); - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, pFileName->szName ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pFileName->szName ); hb_xfree( pFileName ); } else - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, "" ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, "" ); break; case DBOI_FULLPATH: - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, pTag ? pTag->pIndex->szFileName : "" ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, pTag ? pTag->pIndex->szFileName : "" ); break; case DBOI_FILEHANDLE: - pOrderInfo->itmResult = hb_itemPutNInt( pOrderInfo->itmResult, pTag ? pTag->pIndex->hFile : FS_ERROR ); + pInfo->itmResult = hb_itemPutNInt( pInfo->itmResult, pTag ? pTag->pIndex->hFile : FS_ERROR ); break; case DBOI_ISCOND: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, pTag && pTag->ForExpr != NULL ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->ForExpr != NULL ); break; case DBOI_ISDESC: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, pTag && !pTag->UsrAscend ); - if ( pTag && pOrderInfo->itmNewVal && HB_IS_LOGICAL( pOrderInfo->itmNewVal ) ) + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && !pTag->UsrAscend ); + if ( pTag && pInfo->itmNewVal && HB_IS_LOGICAL( pInfo->itmNewVal ) ) { - pTag->UsrAscend = ! hb_itemGetL( pOrderInfo->itmNewVal ); + pTag->UsrAscend = ! hb_itemGetL( pInfo->itmNewVal ); pTag->curKeyState &= ~( CDX_CURKEY_RAWPOS | CDX_CURKEY_LOGPOS ); } break; case DBOI_UNIQUE: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, ( pTag ? pTag->UniqueKey || pTag->UsrUnique : FALSE ) ); - if ( pTag && pOrderInfo->itmNewVal && HB_IS_LOGICAL( pOrderInfo->itmNewVal ) && !pTag->UniqueKey ) + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, ( pTag ? pTag->UniqueKey || pTag->UsrUnique : FALSE ) ); + if ( pTag && pInfo->itmNewVal && HB_IS_LOGICAL( pInfo->itmNewVal ) && !pTag->UniqueKey ) { - pTag->UsrUnique = hb_itemGetL( pOrderInfo->itmNewVal ); + pTag->UsrUnique = hb_itemGetL( pInfo->itmNewVal ); pTag->curKeyState &= ~( CDX_CURKEY_RAWPOS | CDX_CURKEY_LOGPOS | CDX_CURKEY_RAWCNT | CDX_CURKEY_LOGCNT ); } @@ -8118,24 +8157,24 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO char szType[2]; szType[0] = (char) pTag->uiType; szType[1] = 0; - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, szType ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, szType ); } else - pOrderInfo->itmResult = hb_itemPutC( pOrderInfo->itmResult, "" ); + pInfo->itmResult = hb_itemPutC( pInfo->itmResult, "" ); break; case DBOI_KEYSIZE: - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, pTag ? pTag->uiLen : 0 ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, pTag ? pTag->uiLen : 0 ); break; case DBOI_KEYDEC: /* there is no fixed number of decimal places for numeric keys in CDX format */ - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, 0 ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, 0 ); break; case DBOI_KEYVAL: - hb_itemClear( pOrderInfo->itmResult ); + hb_itemClear( pInfo->itmResult ); if( pArea->lpdbPendingRel ) SELF_FORCEREL( ( AREAP ) pArea ); if ( pTag && pArea->fPositioned ) @@ -8147,68 +8186,68 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO hb_cdxIndexUnLockRead( pTag->pIndex ); } if ( pTag->CurKey->rec == pArea->ulRecNo ) - pOrderInfo->itmResult = hb_cdxKeyGetItem( pTag->CurKey, - pOrderInfo->itmResult, pTag, TRUE ); + pInfo->itmResult = hb_cdxKeyGetItem( pTag->CurKey, + pInfo->itmResult, pTag, TRUE ); } break; case DBOI_SCOPETOP: if ( pTag ) { - if ( pOrderInfo->itmResult ) - hb_cdxTagGetScope( pTag, 0, pOrderInfo->itmResult ); - if ( pOrderInfo->itmNewVal ) - hb_cdxTagSetScope( pTag, 0, pOrderInfo->itmNewVal ); + if ( pInfo->itmResult ) + hb_cdxTagGetScope( pTag, 0, pInfo->itmResult ); + if ( pInfo->itmNewVal ) + hb_cdxTagSetScope( pTag, 0, pInfo->itmNewVal ); } - else if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + else if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_SCOPEBOTTOM: if ( pTag ) { - if ( pOrderInfo->itmResult ) - hb_cdxTagGetScope( pTag, 1, pOrderInfo->itmResult ); - if ( pOrderInfo->itmNewVal ) - hb_cdxTagSetScope( pTag, 1, pOrderInfo->itmNewVal ); + if ( pInfo->itmResult ) + hb_cdxTagGetScope( pTag, 1, pInfo->itmResult ); + if ( pInfo->itmNewVal ) + hb_cdxTagSetScope( pTag, 1, pInfo->itmNewVal ); } - else if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + else if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_SCOPESET: if ( pTag ) { - if ( pOrderInfo->itmNewVal ) + if ( pInfo->itmNewVal ) { - hb_cdxTagSetScope( pTag, 0, pOrderInfo->itmNewVal ); - hb_cdxTagSetScope( pTag, 1, pOrderInfo->itmNewVal ); + hb_cdxTagSetScope( pTag, 0, pInfo->itmNewVal ); + hb_cdxTagSetScope( pTag, 1, pInfo->itmNewVal ); } } - if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_SCOPETOPCLEAR: if ( pTag ) { - if ( pOrderInfo->itmResult ) - hb_cdxTagGetScope( pTag, 0, pOrderInfo->itmResult ); + if ( pInfo->itmResult ) + hb_cdxTagGetScope( pTag, 0, pInfo->itmResult ); hb_cdxTagClearScope( pTag, 0 ); } - else if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + else if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_SCOPEBOTTOMCLEAR: if ( pTag ) { - if ( pOrderInfo->itmResult ) - hb_cdxTagGetScope( pTag, 1, pOrderInfo->itmResult ); + if ( pInfo->itmResult ) + hb_cdxTagGetScope( pTag, 1, pInfo->itmResult ); hb_cdxTagClearScope( pTag, 1 ); } - else if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + else if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_SCOPECLEAR: @@ -8217,31 +8256,60 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO hb_cdxTagClearScope( pTag, 0 ); hb_cdxTagClearScope( pTag, 1 ); } - if ( pOrderInfo->itmResult ) - hb_itemClear( pOrderInfo->itmResult ); + if ( pInfo->itmResult ) + hb_itemClear( pInfo->itmResult ); break; case DBOI_CUSTOM: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, ( pTag ? pTag->Custom : FALSE ) ); - if ( pOrderInfo->itmNewVal && HB_IS_LOGICAL( pOrderInfo->itmNewVal ) - && hb_itemGetL( pOrderInfo->itmNewVal ) ) + if( hb_itemType( pInfo->itmNewVal ) == HB_IT_LOGICAL ) { - pTag->Custom = TRUE; + if( hb_cdxIndexLockWrite( pTag->pIndex ) ) + { + if( !pTag->Template ) + { + BOOL fNewVal = hb_itemGetL( pInfo->itmNewVal ); + if( pTag->Custom ? ! fNewVal : fNewVal ) + { + pTag->Custom = fNewVal; + pTag->Partial = TRUE; + pTag->ChgOnly = FALSE; + pTag->TagChanged = TRUE; + /* This is a hacks to emulate both SIX3 and COMIX behavior + * which should be cleaned. I intentionally not used + * HB_SIXCDX macro here [druzus] + */ + if( pTag->Custom ) + pTag->Template = pTag->MultiKey = TRUE; + } + } + hb_cdxIndexUnLockWrite( pTag->pIndex ); + } } + /* Warning: it's not CL53 compatible. CL53 returns previous + * CUSTOM flag value not current one. [druzus] + */ + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->Custom ); + break; + + case DBOI_PARTIAL: + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->Partial ); + break; + + case DBOI_CHGONLY: + /* TODO: set */ + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->ChgOnly ); break; /* TODO: */ /* case DBOI_TEMPLATE: case DBOI_MULTIKEY: - case DBOI_PARTIAL: - case DBOI_CHGONLY: */ case DBOI_KEYADD: if ( !pTag ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); } else { @@ -8254,18 +8322,19 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO ( pTag->pForItem && !hb_cdxEvalCond( pArea, pTag->pForItem, TRUE ) ) ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); } else { LPCDXKEY pKey; hb_cdxIndexLockWrite( pTag->pIndex ); - if ( pOrderInfo->itmNewVal && !HB_IS_NIL( pOrderInfo->itmNewVal ) ) - pKey = hb_cdxKeyPutItem( NULL, pOrderInfo->itmNewVal, pArea->ulRecNo, pTag, TRUE, TRUE ); + if ( pInfo->itmNewVal && !HB_IS_NIL( pInfo->itmNewVal ) && + pTag->Template ) + pKey = hb_cdxKeyPutItem( NULL, pInfo->itmNewVal, pArea->ulRecNo, pTag, TRUE, TRUE ); else pKey = hb_cdxKeyEval( NULL, pTag ); - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxTagKeyAdd( pTag, pKey ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxTagKeyAdd( pTag, pKey ) ); hb_cdxIndexUnLockWrite( pTag->pIndex ); hb_cdxKeyFree( pKey ); } @@ -8280,7 +8349,7 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO case DBOI_KEYDELETE: if ( !pTag ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); } else { @@ -8293,14 +8362,15 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO ( pTag->pForItem && !hb_cdxEvalCond( pArea, pTag->pForItem, TRUE ) ) ) { - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); } else { LPCDXKEY pKey; hb_cdxIndexLockWrite( pTag->pIndex ); - if ( pOrderInfo->itmNewVal && !HB_IS_NIL( pOrderInfo->itmNewVal ) ) - pKey = hb_cdxKeyPutItem( NULL, pOrderInfo->itmNewVal, pArea->ulRecNo, pTag, TRUE, TRUE ); + if ( pInfo->itmNewVal && !HB_IS_NIL( pInfo->itmNewVal ) && + pTag->Template ) + pKey = hb_cdxKeyPutItem( NULL, pInfo->itmNewVal, pArea->ulRecNo, pTag, TRUE, TRUE ); else { if ( pTag->CurKey->rec != pArea->ulRecNo ) @@ -8311,8 +8381,8 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO else pKey = hb_cdxKeyEval( NULL, pTag ); } - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, - hb_cdxTagKeyDel( pTag, pKey ) ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, + hb_cdxTagKeyDel( pTag, pKey ) ); hb_cdxIndexUnLockWrite( pTag->pIndex ); hb_cdxKeyFree( pKey ); } @@ -8327,35 +8397,35 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO case DBOI_READLOCK: if( pTag ) { - if( hb_itemType( pOrderInfo->itmNewVal ) == HB_IT_LOGICAL ) + if( hb_itemType( pInfo->itmNewVal ) == HB_IT_LOGICAL ) { - if( hb_itemGetL( pOrderInfo->itmNewVal ) ) + if( hb_itemGetL( pInfo->itmNewVal ) ) hb_cdxIndexLockRead( pTag->pIndex ); else hb_cdxIndexUnLockRead( pTag->pIndex ); } - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag->pIndex->lockRead > 0 ); } else - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); break; case DBOI_WRITELOCK: if( pTag ) { - if( hb_itemType( pOrderInfo->itmNewVal ) == HB_IT_LOGICAL ) + if( hb_itemType( pInfo->itmNewVal ) == HB_IT_LOGICAL ) { - if( hb_itemGetL( pOrderInfo->itmNewVal ) ) + if( hb_itemGetL( pInfo->itmNewVal ) ) hb_cdxIndexLockWrite( pTag->pIndex ); else hb_cdxIndexUnLockWrite( pTag->pIndex ); } - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag->pIndex->lockWrite > 0 ); } else - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); break; case DBOI_UPDATECOUNTER: @@ -8364,34 +8434,34 @@ static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO /* refresh update counter */ if( hb_cdxIndexLockRead( pTag->pIndex ) ) hb_cdxIndexUnLockRead( pTag->pIndex ); - pOrderInfo->itmResult = hb_itemPutNInt( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutNInt( pInfo->itmResult, pTag->pIndex->ulVersion ); } else - pOrderInfo->itmResult = hb_itemPutNI( pOrderInfo->itmResult, 0 ); + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, 0 ); break; case DBOI_SHARED: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->pIndex->fShared ); break; case DBOI_ISREADONLY: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag && pTag->pIndex->fReadonly ); break; case DBOI_ISMULTITAG: case DBOI_ISSORTRECNO: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, pTag != NULL ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, pTag != NULL ); break; case DBOI_LARGEFILE: - pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, FALSE ); + pInfo->itmResult = hb_itemPutL( pInfo->itmResult, FALSE ); break; default: - return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); + return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pInfo ); } return SUCCESS;