static HB_ERRCODE sqlbaseSkipRaw( SQLBASEAREAP pArea, HB_LONG lToSkip ) { HB_ERRCODE errCode; if( pArea->lpdbPendingRel ) { if( SELF_FORCEREL( ( AREAP ) pArea ) != HB_SUCCESS ) return HB_FAILURE; } if( lToSkip == 0 ) { /* TODO: maybe gocold is enough here?! */ HB_BOOL bBof, bEof; /* Save flags */ bBof = pArea->area.fBof; bEof = pArea->area.fEof; errCode = SELF_GOTO( ( AREAP ) pArea, pArea->ulRecNo ); /* Restore flags */ pArea->area.fBof = bBof; pArea->area.fEof = bEof; } else if( lToSkip < 0 && ( HB_ULONG ) ( -lToSkip ) >= pArea->ulRecNo ) { errCode = SELF_GOTO( ( AREAP ) pArea, 1 ); pArea->area.fBof = HB_TRUE; } else errCode = SELF_GOTO( ( AREAP ) pArea, pArea->ulRecNo + lToSkip ); return errCode; }
static HB_ERRCODE sqlbaseSkip( SQLBASEAREAP pArea, HB_LONG lToSkip ) { HB_ERRCODE errCode; if( pArea->lpdbPendingRel ) { if( SELF_FORCEREL( ( AREAP ) pArea ) != HB_SUCCESS ) return HB_FAILURE; } pArea->area.fTop = pArea->area.fBottom = HB_FALSE; if( lToSkip == 0 || hb_setGetDeleted() || pArea->area.dbfi.itmCobExpr || pArea->area.dbfi.fFilter ) return SUPER_SKIP( ( AREAP ) pArea, lToSkip ); errCode = SELF_SKIPRAW( ( AREAP ) pArea, lToSkip ); /* Move first record and set Bof flag */ if( errCode == HB_SUCCESS && pArea->area.fBof && lToSkip < 0 ) { errCode = SELF_GOTOP( ( AREAP ) pArea ); pArea->area.fBof = HB_TRUE; } if( lToSkip < 0 ) pArea->area.fEof = HB_FALSE; else /* if( lToSkip > 0 ) */ pArea->area.fBof = HB_FALSE; return errCode; }
static HB_ERRCODE sqlbaseSetFilter( SQLBASEAREAP pArea, LPDBFILTERINFO pFilterInfo ) { if( pArea->lpdbPendingRel ) { if( SELF_FORCEREL( ( AREAP ) pArea ) != HB_SUCCESS ) return HB_FAILURE; } return SUPER_SETFILTER( ( AREAP ) pArea, pFilterInfo ); }
static HB_ERRCODE sqlbaseChildEnd( SQLBASEAREAP pArea, LPDBRELINFO pRelInfo ) { HB_ERRCODE errCode; if( pArea->lpdbPendingRel == pRelInfo ) errCode = SELF_FORCEREL( ( AREAP ) pArea ); else errCode = HB_SUCCESS; SUPER_CHILDEND( ( AREAP ) pArea, pRelInfo ); return errCode; }
static HB_ERRCODE adsxSkip( ADSXAREAP pArea, HB_LONG lToSkip ) { PMIXKEY pKey; HB_ULONG ulKeyPos; HB_ERRCODE errCode = HB_SUCCESS; if( ! pArea->pTagCurrent || lToSkip == 0 ) return SUPER_SKIP( ( AREAP ) pArea, lToSkip ); /* resolve any pending relations */ if( pArea->adsarea.lpdbPendingRel ) SELF_FORCEREL( ( AREAP ) pArea ); pArea->adsarea.area.fTop = pArea->adsarea.area.fBottom = HB_FALSE; if( lToSkip > 0 ) { if( ! pArea->adsarea.fPositioned ) { errCode = SELF_GOTO( ( AREAP ) pArea, pArea->adsarea.ulRecNo ); } else { pArea->adsarea.area.fEof = HB_FALSE; } pKey = mixKeyEval( pArea->pTagCurrent, pArea ); if( mixFindKey( pArea->pTagCurrent, pKey, &ulKeyPos ) && pArea->pTagCurrent->ulRecCount > ( HB_ULONG ) lToSkip && ulKeyPos < pArea->pTagCurrent->ulRecCount - ( HB_ULONG ) lToSkip ) { if( SELF_GOTO( ( AREAP ) pArea, pArea->pTagCurrent->pKeys[ ulKeyPos + lToSkip ]->rec ) == HB_FAILURE ) errCode = HB_FAILURE; pArea->adsarea.fPositioned = HB_TRUE; pArea->adsarea.area.fEof = HB_FALSE; } else { SELF_GOTO( ( AREAP ) pArea, 0 ); pArea->adsarea.fPositioned = HB_FALSE; pArea->adsarea.area.fEof = HB_TRUE; } mixKeyFree( pKey ); pArea->adsarea.area.fBof = HB_FALSE; } else { if( ! pArea->adsarea.fPositioned ) { errCode = SELF_GOBOTTOM( ( AREAP ) pArea ); pArea->adsarea.area.fBottom = HB_FALSE; ++lToSkip; } else { pArea->adsarea.area.fBof = HB_FALSE; } pKey = mixKeyEval( pArea->pTagCurrent, pArea ); if( mixFindKey( pArea->pTagCurrent, pKey, &ulKeyPos ) && pArea->pTagCurrent->ulRecCount >= ( HB_ULONG ) ( -lToSkip ) && ulKeyPos >= ( HB_ULONG ) ( -lToSkip ) ) { if( SELF_GOTO( ( AREAP ) pArea, pArea->pTagCurrent->pKeys[ ulKeyPos + lToSkip ]->rec ) == HB_FAILURE ) errCode = HB_FAILURE; pArea->adsarea.area.fBof = HB_FALSE; } else { SELF_GOTOP( ( AREAP ) pArea ); pArea->adsarea.area.fBof = HB_TRUE; } mixKeyFree( pKey ); pArea->adsarea.area.fEof = HB_FALSE; } /* Force relational movement in child WorkAreas */ if( pArea->adsarea.area.lpdbRelations ) SELF_SYNCCHILDREN( ( AREAP ) pArea ); return errCode; }
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; }