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