/* * Obtain physical row ID at current WorkArea cursor position. */ static HB_ERRCODE hb_delimRecId( DELIMAREAP pArea, PHB_ITEM pRecNo ) { HB_ERRCODE errCode; ULONG ulRecNo; HB_TRACE(HB_TR_DEBUG, ("hb_delimRecId(%p,%p)", pArea, pRecNo)); errCode = SELF_RECNO( ( AREAP ) pArea, &ulRecNo ); #ifdef HB_C52_STRICT /* this is for strict Clipper compatibility but IMHO Clipper should not do that and always set fixed size independent to the record number */ if( ulRecNo < 10000000 ) { hb_itemPutNLLen( pRecNo, ulRecNo, 7 ); } else { hb_itemPutNLLen( pRecNo, ulRecNo, 10 ); } #else hb_itemPutNInt( pRecNo, ulRecNo ); #endif return errCode; }
static HB_ERRCODE sqlbaseRecId( SQLBASEAREAP pArea, PHB_ITEM pRecNo ) { HB_ERRCODE errCode; HB_ULONG ulRecNo; errCode = SELF_RECNO( ( AREAP ) pArea, &ulRecNo ); hb_itemPutNInt( pRecNo, ulRecNo ); return errCode; }
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; }