2009-12-04 00:23 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/contrib/rddads/ads1.c
    * added support for dynamic descend flag switching by
         ordDescend( [<tag>], [<bag>], <lDescending> ) -> <lPrevSetting>
      It needs ADS 9.00 or higher and it's ignored in earlier ADS versions.
      Based on Brian Hayes modification in xHarbour ADS RDD.

  * harbour/src/rdd/dbfntx/dbfntx1.c
  * harbour/src/rdd/dbfnsx/dbfnsx1.c
  * harbour/src/rdd/dbfcdx/dbfcdx1.c
  * harbour/contrib/rddads/ads1.c
    * modified ordSkipUnique() to be compatible with CL53 - it means
      that the passed parameter has a little bit different meaning when
      table has active index and it hasn't.
      If no index is active (natural order) then passed parameter is number
      of records to skip just like in dbSkip() function otherwise it's only
      direction choice so negative value means backward skipping and
      zero or positive means forward skipping.
      We may decide to change this behavior anyhow please remember that
      it's not such clear what number of records to skip should mean during
      skipping with active order having repeated key values and with working
      filters which also can exclude some records. It's possible to create
      few algorithms giving different results for some conditions.
This commit is contained in:
Przemyslaw Czerpak
2009-12-03 23:24:14 +00:00
parent 5e1440f748
commit 18f7e28744
5 changed files with 68 additions and 21 deletions

View File

@@ -17,6 +17,30 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-12-04 00:23 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/rddads/ads1.c
* added support for dynamic descend flag switching by
ordDescend( [<tag>], [<bag>], <lDescending> ) -> <lPrevSetting>
It needs ADS 9.00 or higher and it's ignored in earlier ADS versions.
Based on Brian Hayes modification in xHarbour ADS RDD.
* harbour/src/rdd/dbfntx/dbfntx1.c
* harbour/src/rdd/dbfnsx/dbfnsx1.c
* harbour/src/rdd/dbfcdx/dbfcdx1.c
* harbour/contrib/rddads/ads1.c
* modified ordSkipUnique() to be compatible with CL53 - it means
that the passed parameter has a little bit different meaning when
table has active index and it hasn't.
If no index is active (natural order) then passed parameter is number
of records to skip just like in dbSkip() function otherwise it's only
direction choice so negative value means backward skipping and
zero or positive means forward skipping.
We may decide to change this behavior anyhow please remember that
it's not such clear what number of records to skip should mean during
skipping with active order having repeated key values and with working
filters which also can exclude some records. It's possible to create
few algorithms giving different results for some conditions.
2009-12-04 00:18 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* utils/hbmk2/hbmk2.prg
! Added -debug linker option when building .dll for msvc and compatible targets.

View File

@@ -4100,7 +4100,6 @@ static HB_ERRCODE adsOrderInfo( ADSAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO
hb_itemPutCL( pOrderInfo->itmResult, ( char* ) aucBuffer, u16len );
else
hb_itemPutC( pOrderInfo->itmResult, NULL );
break;
case DBOI_ISCOND:
@@ -4113,7 +4112,17 @@ static HB_ERRCODE adsOrderInfo( ADSAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO
case DBOI_ISDESC:
if( hIndex )
{
AdsIsIndexDescending( hIndex, &u16 );
#if ADS_LIB_VERSION >= 900
if( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) )
{
if( hb_itemGetL( pOrderInfo->itmNewVal ) ? u16 == 0 : u16 != 0 )
AdsSetIndexDirection( hIndex, TRUE );
}
#endif
}
else
u16 = 0;
hb_itemPutL( pOrderInfo->itmResult, u16 != 0 );
@@ -4152,7 +4161,6 @@ static HB_ERRCODE adsOrderInfo( ADSAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO
}
else
hb_itemPutC( pOrderInfo->itmResult, NULL );
break;
case DBOI_KEYSIZE:
@@ -4349,7 +4357,6 @@ static HB_ERRCODE adsOrderInfo( ADSAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO
if( u16 )
break;
u32++;
u32RetVal = AdsSkip( hIndex, 1 );
if( u32RetVal != AE_SUCCESS )
break;
@@ -4458,13 +4465,18 @@ static HB_ERRCODE adsOrderInfo( ADSAREAP pArea, USHORT uiIndex, LPDBORDERINFO pO
break;
#if ADS_LIB_VERSION >= 900
case DBOI_SKIPUNIQUE:
if( hIndex &&
AdsSkipUnique( hIndex, ( SIGNED32 ) ( pOrderInfo && HB_IS_NUMBER( pOrderInfo->itmNewVal ) ? hb_itemGetNL( pOrderInfo->itmNewVal ) : 1 ) ) == AE_SUCCESS )
hb_itemPutL( pOrderInfo->itmResult, TRUE );
{
LONG lToSkip = pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) ?
hb_itemGetNL( pOrderInfo->itmNewVal ) : 1;
if( hIndex )
hb_itemPutL( pOrderInfo->itmResult,
AdsSkipUnique( hIndex, lToSkip >= 0 ? 1 : -1 ) == AE_SUCCESS );
else
hb_itemPutL( pOrderInfo->itmResult,
SELF_SKIP( ( AREAP ) pArea, lToSkip ) == HB_SUCCESS );
break;
}
#endif
case DBOI_OPTLEVEL :

View File

@@ -5179,23 +5179,28 @@ static BOOL hb_cdxCurKeyRefresh( CDXAREAP pArea, LPCDXTAG pTag )
/*
* skip to next/previous unique key
*/
static HB_ERRCODE hb_cdxDBOISkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward )
static HB_ERRCODE hb_cdxDBOISkipUnique( CDXAREAP pArea, LPCDXTAG pTag, LONG lToSkip )
{
HB_ERRCODE retval;
BOOL fForward;
HB_TRACE(HB_TR_DEBUG, ("hb_cdxDBOISkipUnique(%p, %p, %i)", pArea, pTag, fForward));
HB_TRACE(HB_TR_DEBUG, ("hb_cdxDBOISkipUnique(%p, %p, %ld)", pArea, pTag, lToSkip));
if( FAST_GOCOLD( ( AREAP ) pArea ) == HB_FAILURE )
return HB_FAILURE;
if( ! pTag )
return SELF_SKIP( ( AREAP ) pArea, fForward ? 1 : -1 );
return SELF_SKIP( ( AREAP ) pArea, lToSkip );
if( pArea->dbfarea.lpdbPendingRel )
SELF_FORCEREL( ( AREAP ) pArea );
pArea->dbfarea.area.fTop = pArea->dbfarea.area.fBottom = FALSE;
/* CL53 DBFCDX when index is active use this parameter
only to chose forward or backward skipping */
fForward = lToSkip >= 0;
if( !pArea->dbfarea.fPositioned )
{
if( fForward )
@@ -8115,8 +8120,9 @@ static HB_ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO
case DBOI_SKIPUNIQUE:
pInfo->itmResult = hb_itemPutL( pInfo->itmResult,
hb_cdxDBOISkipUnique( pArea, pTag,
hb_itemGetNI( pInfo->itmNewVal ) >= 0 ) == HB_SUCCESS );
hb_cdxDBOISkipUnique( pArea, pTag,
pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ?
hb_itemGetNL( pInfo->itmNewVal ) : 1 ) == HB_SUCCESS );
break;
case DBOI_SKIPEVAL:

View File

@@ -4413,10 +4413,10 @@ static void hb_nsxOrdSetRelKeyPos( LPTAGINFO pTag, double dPos )
/*
* skip to next/previous unique key
*/
static BOOL hb_nsxOrdSkipUnique( LPTAGINFO pTag, LONG lDir )
static BOOL hb_nsxOrdSkipUnique( LPTAGINFO pTag, LONG lToSkip )
{
NSXAREAP pArea = pTag->pIndex->pArea;
BOOL fOut = FALSE, fEof = FALSE, fForward = ( lDir >= 0 );
BOOL fOut = FALSE, fEof = FALSE, fForward = ( lToSkip >= 0 );
if( pArea->dbfarea.lpdbPendingRel )
SELF_FORCEREL( ( AREAP ) pArea );
@@ -7491,7 +7491,9 @@ static HB_ERRCODE hb_nsxOrderInfo( NSXAREAP pArea, USHORT uiIndex, LPDBORDERINFO
break;
case DBOI_SKIPUNIQUE:
pInfo->itmResult = hb_itemPutL( pInfo->itmResult,
hb_nsxOrdSkipUnique( pTag, hb_itemGetNL( pInfo->itmNewVal ) ) );
hb_nsxOrdSkipUnique( pTag,
pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ?
hb_itemGetNL( pInfo->itmNewVal ) : 1 ) );
break;
case DBOI_SKIPEVAL:
case DBOI_SKIPEVALBACK:
@@ -7647,7 +7649,8 @@ static HB_ERRCODE hb_nsxOrderInfo( NSXAREAP pArea, USHORT uiIndex, LPDBORDERINFO
break;
case DBOI_SKIPUNIQUE:
hb_itemPutL( pInfo->itmResult, SELF_SKIP( ( AREAP ) pArea,
hb_itemGetNL( pInfo->itmNewVal ) >= 0 ? 1 : -1 ) == HB_SUCCESS );
pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ?
hb_itemGetNL( pInfo->itmNewVal ) : 1 ) == HB_SUCCESS );
break;
case DBOI_SKIPEVAL:
case DBOI_SKIPEVALBACK:

View File

@@ -4047,10 +4047,10 @@ static void hb_ntxOrdSetRelKeyPos( LPTAGINFO pTag, double dPos )
/*
* skip to next/previous unique key
*/
static BOOL hb_ntxOrdSkipUnique( LPTAGINFO pTag, LONG lDir )
static BOOL hb_ntxOrdSkipUnique( LPTAGINFO pTag, LONG lToSkip )
{
NTXAREAP pArea = pTag->Owner->Owner;
BOOL fOut = FALSE, fEof = FALSE, fForward = ( lDir >= 0 );
BOOL fOut = FALSE, fEof = FALSE, fForward = ( lToSkip >= 0 );
if( pArea->dbfarea.lpdbPendingRel )
SELF_FORCEREL( ( AREAP ) pArea );
@@ -7100,7 +7100,8 @@ static HB_ERRCODE hb_ntxOrderInfo( NTXAREAP pArea, USHORT uiIndex, LPDBORDERINFO
break;
case DBOI_SKIPUNIQUE:
hb_itemPutL( pInfo->itmResult, hb_ntxOrdSkipUnique( pTag,
hb_itemGetNL( pInfo->itmNewVal ) ) );
pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ?
hb_itemGetNL( pInfo->itmNewVal ) : 1 ) );
break;
case DBOI_SKIPEVAL:
case DBOI_SKIPEVALBACK:
@@ -7276,7 +7277,8 @@ static HB_ERRCODE hb_ntxOrderInfo( NTXAREAP pArea, USHORT uiIndex, LPDBORDERINFO
break;
case DBOI_SKIPUNIQUE:
hb_itemPutL( pInfo->itmResult, SELF_SKIP( ( AREAP ) pArea,
hb_itemGetNL( pInfo->itmNewVal ) >= 0 ? 1 : -1 ) == HB_SUCCESS );
pInfo->itmNewVal && HB_IS_NUMERIC( pInfo->itmNewVal ) ?
hb_itemGetNL( pInfo->itmNewVal ) : 1 ) == HB_SUCCESS );
break;
case DBOI_SKIPEVAL:
case DBOI_SKIPEVALBACK: