static HB_ERRCODE hb_rddEvalWABlock( AREAP pArea, void * pBlock ) { PHB_ITEM pItem; hb_rddSelectWorkAreaNumber( pArea->uiArea ); pItem = hb_vmEvalBlockOrMacro( ( PHB_ITEM ) pBlock ); if( hb_vmRequestQuery() != 0 || ( HB_IS_LOGICAL( pItem ) && ! hb_itemGetL( pItem ) ) ) return HB_FAILURE; else return HB_SUCCESS; }
static HB_BOOL mixEvalCond( PHB_ITEM pCondItem, ADSXAREAP pArea ) { int iCurrArea = 0; HB_BOOL fRet; if( pArea ) { iCurrArea = hb_rddGetCurrentWorkAreaNumber(); if( iCurrArea != pArea->adsarea.area.uiArea ) hb_rddSelectWorkAreaNumber( pArea->adsarea.area.uiArea ); else iCurrArea = 0; } fRet = hb_itemGetL( hb_vmEvalBlockOrMacro( pCondItem ) ); if( iCurrArea ) hb_rddSelectWorkAreaNumber( iCurrArea ); return fRet; }
static PMIXKEY mixKeyEval( PMIXTAG pTag, ADSXAREAP pArea ) { PHB_ITEM pItem; PMIXKEY pKey; int iCurrArea = hb_rddGetCurrentWorkAreaNumber(); PHB_CODEPAGE pCodepage = hb_cdpSelect( pArea->adsarea.area.cdPage ); if( iCurrArea != pArea->adsarea.area.uiArea ) hb_rddSelectWorkAreaNumber( pArea->adsarea.area.uiArea ); else iCurrArea = 0; pItem = hb_vmEvalBlockOrMacro( pTag->pKeyItem ); pKey = mixKeyNew( pItem, pArea->adsarea.ulRecNo, pTag->bType, pTag->uiLen ); if( iCurrArea ) hb_rddSelectWorkAreaNumber( iCurrArea ); hb_cdpSelect( pCodepage ); return pKey; }
static PMIXTAG mixTagCreate( const char * szTagName, PHB_ITEM pKeyExpr, PHB_ITEM pKeyItem, PHB_ITEM pForItem, PHB_ITEM pWhileItem, HB_BYTE bType, HB_USHORT uiLen, ADSXAREAP pArea ) { PMIXTAG pTag; PMIXKEY pKey; LPDBORDERCONDINFO pOrdCondInfo = pArea->adsarea.area.lpdbOrdCondInfo; ADSHANDLE hOrder; HB_ULONG ulRec, ulStartRec, ulNextCount = 0; HB_LONG lStep = 0; PHB_ITEM pItem, pEvalItem = NULL; pTag = ( PMIXTAG ) hb_xgrab( sizeof( MIXTAG ) ); memset( pTag, 0, sizeof( MIXTAG ) ); pTag->szName = ( char * ) hb_xgrab( MIX_MAXTAGNAMELEN + 1 ); hb_strncpyUpperTrim( pTag->szName, szTagName, MIX_MAXTAGNAMELEN ); pTag->szKeyExpr = ( char * ) hb_xgrab( hb_itemGetCLen( pKeyExpr ) + 1 ); hb_strncpyTrim( pTag->szKeyExpr, hb_itemGetCPtr( pKeyExpr ), hb_itemGetCLen( pKeyExpr ) ); /* TODO: for expresion */ pTag->szForExpr = NULL; pTag->pKeyItem = pKeyItem; pTag->pForItem = pForItem; pTag->bType = bType; pTag->uiLen = uiLen; /* Use national support */ if( bType == 'C' && pArea->adsarea.area.cdPage && ! HB_CDP_ISBINSORT( pArea->adsarea.area.cdPage ) ) pTag->pCodepage = pArea->adsarea.area.cdPage; pTag->pKeys = ( PMIXKEY * ) hb_xgrab( sizeof( PMIXKEY ) * MIX_KEYPOOLFIRST ); pTag->ulRecMax = MIX_KEYPOOLFIRST; ulStartRec = 0; if( pOrdCondInfo ) { pEvalItem = pOrdCondInfo->itmCobEval; lStep = pOrdCondInfo->lStep; } if( ! pOrdCondInfo || pOrdCondInfo->fAll ) { pArea->adsarea.hOrdCurrent = 0; } else { if( pOrdCondInfo->itmRecID ) ulStartRec = hb_itemGetNL( pOrdCondInfo->itmRecID ); if( ulStartRec ) { ulNextCount = 1; } else if( pOrdCondInfo->fRest || pOrdCondInfo->lNextCount > 0 ) { if( pOrdCondInfo->itmStartRecID ) ulStartRec = hb_itemGetNL( pOrdCondInfo->itmStartRecID ); if( ! ulStartRec ) ulStartRec = pArea->adsarea.ulRecNo; if( pArea->adsarea.area.lpdbOrdCondInfo->lNextCount > 0 ) ulNextCount = pOrdCondInfo->lNextCount; } else if( ! pOrdCondInfo->fUseCurrent ) { pArea->adsarea.hOrdCurrent = 0; } } hOrder = pArea->adsarea.hOrdCurrent ? pArea->adsarea.hOrdCurrent : pArea->adsarea.hTable; if( ulStartRec ) AdsGotoRecord( pArea->adsarea.hTable, ulStartRec ); else AdsGotoTop( pArea->adsarea.hTable ); hb_adsUpdateAreaFlags( pArea ); while( ! pArea->adsarea.area.fEof ) { SELF_RECNO( ( AREAP ) pArea, &ulRec ); SELF_GOTO( ( AREAP ) pArea, ulRec ); if( pEvalItem ) { if( lStep >= pOrdCondInfo->lStep ) { lStep = 0; if( ! mixEvalCond( pEvalItem, NULL ) ) break; } ++lStep; } if( pWhileItem && ! mixEvalCond( pWhileItem, NULL ) ) { break; } if( pForItem == NULL || mixEvalCond( pForItem, NULL ) ) { pItem = hb_vmEvalBlockOrMacro( pKeyItem ); pKey = mixKeyNew( pItem, ulRec, bType, uiLen ); if( pTag->ulRecCount == pTag->ulRecMax ) { pTag->pKeys = ( PMIXKEY * ) hb_xrealloc( pTag->pKeys, sizeof( PMIXKEY ) * ( pTag->ulRecMax + MIX_KEYPOOLRESIZE ) ); pTag->ulRecMax += MIX_KEYPOOLRESIZE; } pTag->pKeys[ pTag->ulRecCount ] = pKey; pTag->ulRecCount++; } if( ulNextCount ) { ulNextCount--; if( ! ulNextCount ) break; } AdsSkip( hOrder, 1 ); hb_adsUpdateAreaFlags( pArea ); } /* QuickSort */ if( pTag->ulRecCount >= 2 ) mixQSort( pTag->pKeys, 0, pTag->ulRecCount - 1, uiLen, pTag->pCodepage ); return pTag; }
static HB_ERRCODE adsxOrderInfo( ADSXAREAP pArea, HB_USHORT uiIndex, LPDBORDERINFO pOrderInfo ) { PMIXTAG pTag = pArea->pTagCurrent; /* resolve any pending relations */ if( pArea->adsarea.lpdbPendingRel ) SELF_FORCEREL( ( AREAP ) pArea ); /* all others need an index handle */ if( uiIndex != DBOI_ORDERCOUNT ) { if( pOrderInfo->itmOrder ) { if( HB_IS_STRING( pOrderInfo->itmOrder ) ) { pTag = pArea->pTagList; while( pTag ) { if( ! hb_stricmp( hb_itemGetCPtr( pOrderInfo->itmOrder ), pTag->szName ) ) break; pTag = pTag->pNext; } } else if( HB_IS_NUMERIC( pOrderInfo->itmOrder ) ) { UNSIGNED16 usOrder = 0, usSearch = ( UNSIGNED16 ) hb_itemGetNI( pOrderInfo->itmOrder ); AdsGetNumIndexes( pArea->adsarea.hTable, &usOrder ); pTag = usSearch <= usOrder ? NULL : pArea->pTagList; while( pTag ) { if( ++usOrder == usSearch ) break; pTag = pTag->pNext; } } } if( ! pTag ) return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); } switch( uiIndex ) { case DBOI_CONDITION: hb_itemPutC( pOrderInfo->itmResult, pTag->szForExpr ); break; case DBOI_EXPRESSION: hb_itemPutC( pOrderInfo->itmResult, pTag->szKeyExpr ); break; case DBOI_ISCOND: hb_itemPutL( pOrderInfo->itmResult, pTag->pForItem != NULL ); break; case DBOI_ISDESC: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; case DBOI_UNIQUE: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; case DBOI_KEYTYPE: hb_itemPutCL( pOrderInfo->itmResult, ( char * ) &pTag->bType, 1 ); break; case DBOI_KEYSIZE: hb_itemPutNI( pOrderInfo->itmResult, pTag->uiLen ); break; case DBOI_KEYVAL: { PHB_ITEM pItem; PHB_CODEPAGE pCodepage = hb_cdpSelect( pArea->adsarea.area.cdPage ); pItem = hb_vmEvalBlockOrMacro( pTag->pKeyItem ); hb_cdpSelect( pCodepage ); hb_itemMove( pOrderInfo->itmResult, pItem ); break; } case DBOI_KEYCOUNT: case DBOI_KEYCOUNTRAW: /* ignore filter but RESPECT SCOPE */ hb_itemPutNL( pOrderInfo->itmResult, pTag->ulRecCount ); break; case DBOI_POSITION: case DBOI_RECNO: case DBOI_KEYNORAW: if( uiIndex == DBOI_POSITION && pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) { HB_ULONG ulPos; ulPos = hb_itemGetNL( pOrderInfo->itmNewVal ); if( ulPos > 0 && ulPos <= pTag->ulRecCount ) SELF_GOTO( ( AREAP ) pArea, pTag->pKeys[ ulPos - 1 ]->rec ); pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, ! pArea->adsarea.area.fEof ); } else { PMIXKEY pKey; HB_ULONG ulKeyPos; if( ! pArea->adsarea.fPositioned ) SELF_GOTO( ( AREAP ) pArea, pArea->adsarea.ulRecNo ); else pArea->adsarea.area.fEof = HB_FALSE; pKey = mixKeyEval( pTag, pArea ); hb_itemPutNL( pOrderInfo->itmResult, mixFindKey( pTag, pKey, &ulKeyPos ) ? ( ulKeyPos + 1 ) : 0 ); mixKeyFree( pKey ); } break; case DBOI_RELKEYPOS: if( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ) { HB_ULONG ulPos; ulPos = ( HB_ULONG ) ( hb_itemGetND( pOrderInfo->itmNewVal ) * ( double ) pTag->ulRecCount ); if( ulPos > 0 && ulPos <= pTag->ulRecCount ) SELF_GOTO( ( AREAP ) pArea, pTag->pKeys[ ulPos - 1 ]->rec ); pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult, ! pArea->adsarea.area.fEof ); } else { PMIXKEY pKey; HB_ULONG ulKeyPos; if( ! pArea->adsarea.fPositioned ) SELF_GOTO( ( AREAP ) pArea, pArea->adsarea.ulRecNo ); else pArea->adsarea.area.fEof = HB_FALSE; pKey = mixKeyEval( pTag, pArea ); if( ! mixFindKey( pTag, pKey, &ulKeyPos + 1 ) ) ulKeyPos = 0; mixKeyFree( pKey ); pOrderInfo->itmResult = hb_itemPutND( pOrderInfo->itmResult, ( double ) ulKeyPos / ( double ) pTag->ulRecCount ); } break; case DBOI_NAME: hb_itemPutC( pOrderInfo->itmResult, pTag->szName ); break; case DBOI_BAGNAME: hb_itemPutC( pOrderInfo->itmResult, NULL ); break; case DBOI_FULLPATH: hb_itemPutC( pOrderInfo->itmResult, NULL ); break; case DBOI_BAGEXT: hb_itemPutC( pOrderInfo->itmResult, "mix" ); break; case DBOI_ORDERCOUNT: { UNSIGNED16 usOrder = 0; AdsGetNumIndexes( pArea->adsarea.hTable, &usOrder ); pTag = pArea->pTagList; while( pTag ) { pTag = pTag->pNext; usOrder++; } hb_itemPutNI( pOrderInfo->itmResult, ( int ) usOrder ); break; } case DBOI_NUMBER: { PMIXTAG pTag2; UNSIGNED16 usOrder = 0; AdsGetNumIndexes( pArea->adsarea.hTable, &usOrder ); pTag2 = pArea->pTagList; usOrder++; while( pTag2 && pTag != pTag2 ) { pTag2 = pTag2->pNext; usOrder++; } hb_itemPutNI( pOrderInfo->itmResult, ( int ) usOrder ); break; } case DBOI_CUSTOM: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; case DBOI_OPTLEVEL: hb_itemPutNI( pOrderInfo->itmResult, DBOI_OPTIMIZED_NONE ); break; case DBOI_KEYADD: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; case DBOI_KEYDELETE: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; case DBOI_AUTOOPEN: hb_itemPutL( pOrderInfo->itmResult, HB_FALSE ); break; default: return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); } return HB_SUCCESS; }