From bcd2904445246ea282a7dc5f5debcb8cf1e3853d Mon Sep 17 00:00:00 2001 From: Mindaugas Kavaliauskas Date: Wed, 18 May 2011 13:56:36 +0000 Subject: [PATCH] 2011-05-18 16:57 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) * harbour/contrib/rddads/adsx.c ! fixed DBORDERINFO() and ORDNUMBER(), etc. behaviour, for order specified using tag parameter --- harbour/ChangeLog | 5 ++++ harbour/contrib/rddads/adsx.c | 53 +++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 44a4fd6302..493f4211f6 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,11 @@ The license applies to all entries newer than 2009-04-28. */ +2011-05-18 16:57 UTC+0300 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt) + * harbour/contrib/rddads/adsx.c + ! fixed DBORDERINFO() and ORDNUMBER(), etc. behaviour, for order + specified using tag parameter + 2011-05-18 09:49 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + contrib/xhb/tests/dll.prg + dll call sample diff --git a/harbour/contrib/rddads/adsx.c b/harbour/contrib/rddads/adsx.c index e8b57d7eb8..4bfc4bcf73 100644 --- a/harbour/contrib/rddads/adsx.c +++ b/harbour/contrib/rddads/adsx.c @@ -1180,10 +1180,59 @@ static HB_ERRCODE adsxOrderDestroy( ADSXAREAP pArea, LPDBORDERINFO pOrderInfo ) static HB_ERRCODE adsxOrderInfo( ADSXAREAP pArea, HB_USHORT uiIndex, LPDBORDERINFO pOrderInfo ) { - LPMIXTAG pTag = pArea->pTagCurrent; + LPMIXTAG pTag; - if( ! pTag && uiIndex != DBOI_ORDERCOUNT ) + /* resolve any pending relations */ + if( pArea->adsarea.lpdbPendingRel ) + SELF_FORCEREL( ( AREAP ) pArea ); + + /* all others need an index handle */ + if( uiIndex != DBOI_ORDERCOUNT && pOrderInfo->itmOrder && !HB_IS_NIL( 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; + } + + if( ! pTag ) + return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); + } + else if( HB_IS_NUMERIC( pOrderInfo->itmOrder ) ) + { + UNSIGNED16 usOrder = 0, usSearch = ( UNSIGNED16 ) hb_itemGetNI( pOrderInfo->itmOrder ); + + AdsGetNumIndexes( pArea->adsarea.hTable, &usOrder ); + + if( usSearch <= usOrder ) + return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); + + pTag = pArea->pTagList; + usOrder++; + while ( pTag ) + { + if( usSearch == usOrder ) + break; + + pTag = pTag->pNext; + usOrder++; + } + + if( ! pTag ) + return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); + } + } + else if( ! pArea->pTagCurrent && uiIndex != DBOI_ORDERCOUNT ) + { return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pOrderInfo ); + } + else + pTag = pArea->pTagCurrent; /* resolve any pending relations */ if( pArea->adsarea.lpdbPendingRel )