2003-11-09 00:50 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>

This commit is contained in:
Alexander S.Kresin
2003-11-08 21:53:16 +00:00
parent 4df34da7a8
commit a2a1251487
6 changed files with 280 additions and 241 deletions

View File

@@ -8,6 +8,24 @@
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2003-11-09 00:50 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
* source/pp/pptable.c
+ SET MBLOCKSIZE TO <x>
SET MEMOBLOCK TO <x>
SET MFILEEXT TO <x>
SET AUTOSHARE TO [<x>]
SET AUTORDER TO [<x>]
SET STRICTREAD <x:ON,OFF,&>
New DBFFPT related commands, added by Przemyslaw Czerpak - synced with xHarbour.
* include/hbdefs.h
* source/rdd/dbcmd.c
* source/rdd/dbfcdx/dbfcdx1.c
! Some DBFCDX fixes by Przemyslaw Czerpak - synced with xHarbour.
* source/rdd/dbfntx/dbfntx1.c
! Bug fixed, which appeared while conditional indexing of a parent file in relation.
2003-10-22 13:26 UTC-0800 Luis Krause Mantilla <lkrausem@shaw.ca>
* xharbour/source/rdd/rddord.prg
+ ORDSETRELATION()

View File

@@ -163,35 +163,13 @@
( ( ( ULONG ) ( b3 ) ) << 16 ) | \
( ( ( ULONG ) ( b2 ) ) << 8 ) | \
( ( ( ULONG ) ( b1 ) ) ) )
#define HB_SWAP_USHORT( w ) ( ( USHORT ) ( ( ( ( USHORT ) ( w ) & 0xFF00 ) >> 8 ) | \
( ( ( USHORT ) ( w ) & 0x00FF ) << 8 ) ) )
#define HB_SWAP_ULONG( w ) ( ( ULONG ) ( ( ( ( ULONG ) ( w ) & 0x000000FFL ) << 24 ) | \
( ( ( ULONG ) ( w ) & 0x0000FF00L ) << 8 ) | \
( ( ( ULONG ) ( w ) & 0x00FF0000L ) >> 8 ) | \
( ( ( ULONG ) ( w ) & 0xFF000000L ) >> 24 ) ) )
/* Be careful with double conversion. Some machines can use mixed form
(Little/Big) for BYTE ORDER and WORD ORDER or even completely differ
internal representation */
#define HB_SWAP_PDOUBLE( p ) ( { \
union { \
double d; \
BYTE buffer[ 8 ]; \
} u; \
u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ]; \
u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ]; \
u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ]; \
u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ]; \
u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ]; \
u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ]; \
u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ]; \
u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ]; \
u.d; \
} )
#define HB_SWAP_DOUBLE( d ) ( { \
BYTE double_var[ 8 ]; \
*( double * )double_var = ( double ) ( d ); \
HB_SWAP_PDOUBLE( double_var ); \
} )
#if defined(HB_PDP_ENDIAN)
#error PDP-Endian support unimplemented. If you have such machine do it yourself.
@@ -202,15 +180,14 @@
#define HB_PUT_LE_USHORT( p, w ) ( *( USHORT * )( p ) = ( USHORT ) ( w ) )
#define HB_GET_LE_ULONG( p ) ( *( ULONG * )( p ) )
#define HB_PUT_LE_ULONG( p, l ) ( *( ULONG * )( p ) = ( ULONG ) ( l ) )
#define HB_GET_LE_DOUBLE( p ) ( *( double * )( p ) )
#define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) )
#define HB_GET_BE_USHORT( p ) HB_SWAP_USHORT( *( USHORT * )( p ) )
#define HB_PUT_BE_USHORT( p, w ) ( *( USHORT * )( p ) = HB_SWAP_USHORT( w ) )
#define HB_GET_BE_ULONG( p ) HB_SWAP_ULONG( *( ULONG * )( p ) )
#define HB_PUT_BE_ULONG( p, l ) ( *( ULONG * )( p ) = HB_SWAP_ULONG( l ) )
#define HB_GET_BE_DOUBLE( p ) HB_SWAP_PDOUBLE( p )
#define HB_PUT_BE_DOUBLE( p, d ) ( *( double * )( p ) = HB_SWAP_DOUBLE( d ) )
#define HB_GET_LE_DOUBLE( p ) ( *( double * )( p ) )
#define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) )
#define HB_USHORT_FROM_LE( w ) ( ( USHORT )( w ) )
#define HB_ULONG_FROM_LE( l ) ( ( ULONG )( l ) )
@@ -224,61 +201,48 @@
#define HB_PCODE_MKULONG( p ) ( *( ULONG * )( p ) )
#define HB_PCODE_MKDOUBLE( p ) ( *( double * )( p ) )
/* the conversion for BIG endian can be used here but for speed reasons
* I decided to write full version to avoid one bytes conversion */
#define HB_GET_SORTDBL( v, p ) { \
union { \
double d; \
BYTE buffer[ 8 ]; \
} u; \
if ( ( ( BYTE * ) ( p ) )[ 0 ] & 0x80 ) { \
u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ]; \
u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ]; \
u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ]; \
u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ]; \
u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ]; \
u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ]; \
u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ]; \
u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ] ^ 0x80; \
} else { \
u.buffer[ 0 ] = ( ( BYTE * ) ( p ) )[ 7 ] ^ 0xFF; \
u.buffer[ 1 ] = ( ( BYTE * ) ( p ) )[ 6 ] ^ 0xFF; \
u.buffer[ 2 ] = ( ( BYTE * ) ( p ) )[ 5 ] ^ 0xFF; \
u.buffer[ 3 ] = ( ( BYTE * ) ( p ) )[ 4 ] ^ 0xFF; \
u.buffer[ 4 ] = ( ( BYTE * ) ( p ) )[ 3 ] ^ 0xFF; \
u.buffer[ 5 ] = ( ( BYTE * ) ( p ) )[ 2 ] ^ 0xFF; \
u.buffer[ 6 ] = ( ( BYTE * ) ( p ) )[ 1 ] ^ 0xFF; \
u.buffer[ 7 ] = ( ( BYTE * ) ( p ) )[ 0 ] ^ 0xFF; \
} \
v = u.d; \
}
#define HB_ORD2DBL( o, d ) { \
if ( ( ( BYTE * ) ( o ) )[ 0 ] & 0x80 ) { \
( ( BYTE * ) ( d ) )[ 0 ] = ( ( BYTE * ) ( o ) )[ 7 ]; \
( ( BYTE * ) ( d ) )[ 1 ] = ( ( BYTE * ) ( o ) )[ 6 ]; \
( ( BYTE * ) ( d ) )[ 2 ] = ( ( BYTE * ) ( o ) )[ 5 ]; \
( ( BYTE * ) ( d ) )[ 3 ] = ( ( BYTE * ) ( o ) )[ 4 ]; \
( ( BYTE * ) ( d ) )[ 4 ] = ( ( BYTE * ) ( o ) )[ 3 ]; \
( ( BYTE * ) ( d ) )[ 5 ] = ( ( BYTE * ) ( o ) )[ 2 ]; \
( ( BYTE * ) ( d ) )[ 6 ] = ( ( BYTE * ) ( o ) )[ 1 ]; \
( ( BYTE * ) ( d ) )[ 7 ] = ( ( BYTE * ) ( o ) )[ 0 ] ^ ( BYTE ) 0x80; \
} else { \
( ( BYTE * ) ( d ) )[ 0 ] = ( ( BYTE * ) ( o ) )[ 7 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 1 ] = ( ( BYTE * ) ( o ) )[ 6 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 2 ] = ( ( BYTE * ) ( o ) )[ 5 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 3 ] = ( ( BYTE * ) ( o ) )[ 4 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 4 ] = ( ( BYTE * ) ( o ) )[ 3 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 5 ] = ( ( BYTE * ) ( o ) )[ 2 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 6 ] = ( ( BYTE * ) ( o ) )[ 1 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( d ) )[ 7 ] = ( ( BYTE * ) ( o ) )[ 0 ] ^ ( BYTE ) 0xFF; \
} }
#define HB_DBL2ORD( d, o ) { \
if ( *( double * )( d ) >= 0.0 ) { \
( ( BYTE * ) ( o ) )[ 0 ] = ( ( BYTE * ) ( d ) )[ 7 ] ^ ( BYTE ) 0x80; \
( ( BYTE * ) ( o ) )[ 1 ] = ( ( BYTE * ) ( d ) )[ 6 ]; \
( ( BYTE * ) ( o ) )[ 2 ] = ( ( BYTE * ) ( d ) )[ 5 ]; \
( ( BYTE * ) ( o ) )[ 3 ] = ( ( BYTE * ) ( d ) )[ 4 ]; \
( ( BYTE * ) ( o ) )[ 4 ] = ( ( BYTE * ) ( d ) )[ 3 ]; \
( ( BYTE * ) ( o ) )[ 5 ] = ( ( BYTE * ) ( d ) )[ 2 ]; \
( ( BYTE * ) ( o ) )[ 6 ] = ( ( BYTE * ) ( d ) )[ 1 ]; \
( ( BYTE * ) ( o ) )[ 7 ] = ( ( BYTE * ) ( d ) )[ 0 ]; \
} else { \
( ( BYTE * ) ( o ) )[ 0 ] = ( ( BYTE * ) ( d ) )[ 7 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 1 ] = ( ( BYTE * ) ( d ) )[ 6 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 2 ] = ( ( BYTE * ) ( d ) )[ 5 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 3 ] = ( ( BYTE * ) ( d ) )[ 4 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 4 ] = ( ( BYTE * ) ( d ) )[ 3 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 5 ] = ( ( BYTE * ) ( d ) )[ 2 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 6 ] = ( ( BYTE * ) ( d ) )[ 1 ] ^ ( BYTE ) 0xFF; \
( ( BYTE * ) ( o ) )[ 7 ] = ( ( BYTE * ) ( d ) )[ 0 ] ^ ( BYTE ) 0xFF; \
} }
#define HB_PUT_SORTDBL( p, v ) { \
union { \
double d; \
BYTE buffer[ 8 ]; \
} u; \
u.d = ( double ) ( v ); \
if ( u.d >= 0.0 ) { \
( ( BYTE * ) ( p ) )[ 0 ] = u.buffer[ 7 ] ^ 0x80; \
( ( BYTE * ) ( p ) )[ 1 ] = u.buffer[ 6 ]; \
( ( BYTE * ) ( p ) )[ 2 ] = u.buffer[ 5 ]; \
( ( BYTE * ) ( p ) )[ 3 ] = u.buffer[ 4 ]; \
( ( BYTE * ) ( p ) )[ 4 ] = u.buffer[ 3 ]; \
( ( BYTE * ) ( p ) )[ 5 ] = u.buffer[ 2 ]; \
( ( BYTE * ) ( p ) )[ 6 ] = u.buffer[ 1 ]; \
( ( BYTE * ) ( p ) )[ 7 ] = u.buffer[ 0 ]; \
} else { \
( ( BYTE * ) ( p ) )[ 7 ] = u.buffer[ 0 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 6 ] = u.buffer[ 1 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 5 ] = u.buffer[ 2 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 4 ] = u.buffer[ 3 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 3 ] = u.buffer[ 4 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 2 ] = u.buffer[ 5 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 1 ] = u.buffer[ 6 ] ^ 0xFF; \
( ( BYTE * ) ( p ) )[ 0 ] = u.buffer[ 7 ] ^ 0xFF; \
} \
}
#else
/* We use Big-Endian here */
@@ -290,8 +254,6 @@
#define HB_PUT_BE_USHORT( p, w ) ( *( USHORT * )( p ) = ( USHORT ) ( w ) )
#define HB_GET_BE_ULONG( p ) ( *( ULONG * )( p ) )
#define HB_PUT_BE_ULONG( p, l ) ( *( ULONG * )( p ) = ( ULONG ) ( l ) )
#define HB_GET_BE_DOUBLE( p ) ( *( double * )( p ) )
#define HB_PUT_BE_DOUBLE( p, d ) ( *( double * )( p ) = ( double ) ( d ) )
#define HB_USHORT_FROM_LE( w ) HB_MKUSHORT( HB_HIBYTE( w ), HB_LOBYTE( w ) )
#define HB_ULONG_FROM_LE( l ) HB_MKULONG( HB_HIBYTE( HB_HIWORD( l ) ), HB_LOBYTE( HB_HIWORD( l ) ), HB_HIBYTE( l ), HB_LOBYTE( l ) )
@@ -303,40 +265,32 @@
#define HB_PCODE_MKLONG( p ) HB_MKLONG( *( BYTE * )( p ), ( ( BYTE * )( p ) )[ 1 ], ( ( BYTE * )( p ) )[ 2 ], ( ( BYTE * )( p ) )[ 3 ] )
#define HB_PCODE_MKULONG( p ) HB_MKULONG( *( BYTE * )( p ), ( ( BYTE * )( p ) )[ 1 ], ( ( BYTE * )( p ) )[ 2 ], ( ( BYTE * )( p ) )[ 3 ] )
#define HB_ORD2DBL( o, d ) { \
*( double * )( d ) = *( double * )( o ); \
if ( ( ( BYTE * ) ( d ) )[ 0 ] & 0x80 ) { \
( ( BYTE * ) ( d ) )[ 0 ] ^= 0x80; \
} else { \
( ( LONG * ) ( d ) )[ 0 ] ^= 0xFFFFFFFFL; \
( ( LONG * ) ( d ) )[ 1 ] ^= 0xFFFFFFFFL; \
} }
#define HB_DBL2ORD( d, o ) { \
*( double * )( o ) = *( double * )( d ); \
if ( *( double * )( o ) >= 0.0 ) { \
( ( BYTE * ) ( o ) )[ 0 ] ^= 0x80; \
} else { \
( ( LONG * ) ( o ) )[ 0 ] ^= 0xFFFFFFFFL; \
( ( LONG * ) ( o ) )[ 1 ] ^= 0xFFFFFFFFL; \
} }
#if defined( __GNUC__ )
#define HB_GET_LE_DOUBLE( p ) HB_SWAP_PDOUBLE( p )
#define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = HB_SWAP_DOUBLE( d ) )
/* Be careful with double conversion. Some machines can use mixed form
(Little/Big) for BYTE ORDER and WORD ORDER or even completely differ
internal representation */
#define HB_GET_LE_DOUBLE( p ) HB_PCODE_MKDOUBLE( p )
#define HB_PUT_LE_DOUBLE( p, d ) ( *( double * )( p ) = HB_DOUBLE_TO_LE( d ) )
#define HB_DOUBLE_FROM_LE( d ) HB_SWAP_DOUBLE( d );
#define HB_DOUBLE_TO_LE( d ) HB_DOUBLE_FROM_LE( d )
#define HB_PCODE_MKDOUBLE( p ) HB_SWAP_PDOUBLE( p )
#define HB_GET_SORTDBL( v, p ) ( { \
union { \
double d; \
BYTE buffer[ 8 ]; \
} u; \
u.d = HB_GET_BE_DOUBLE( p ); \
if ( u.buffer[ 0 ] & 0x80 ) { \
u.buffer[ 0 ] ^= 0x80; \
} else { \
( ( LONG * ) ( u.buffer ) )[ 0 ] ^= 0xFFFFFFFFL; \
( ( LONG * ) ( u.buffer ) )[ 1 ] ^= 0xFFFFFFFFL; \
} \
v = u.d; \
} )
#define HB_PUT_SORTDBL( p, v ) ( { \
HB_PUT_BE_DOUBLE( p, v ); \
if ( ( double ) ( v ) >= 0.0 ) { \
( ( BYTE * ) ( p ) )[ 0 ] ^= 0x80; \
} else { \
( ( LONG * ) ( p ) )[ 0 ] ^= 0xFFFFFFFFL; \
( ( LONG * ) ( p ) )[ 1 ] ^= 0xFFFFFFFFL; \
} \
} )
/*
#define HB_DOUBLE_FROM_LE( d ) \
( { \
BYTE double_var[ 8 ]; \
@@ -359,7 +313,6 @@
u.buffer[ 7 ] = ( p )[ 0 ]; \
u.d; \
} )
*/
#else
#error Little-Endian IEEE 754 double type conversion unimplemented with a non-GCC compiler
#endif

View File

@@ -433,8 +433,17 @@ void hb_pp_Table( void )
static COMMANDS sC___248 = {0,"SET","DIRCASE ( \1A00 )","Set(_SET_DIRCASE, \1A00 )",&sC___247 };
static COMMANDS sC___249 = {0,"SET","DIRSEPARATOR \1A30","Set(_SET_DIRSEPARATOR, \1A10 )",&sC___248 };
static COMMANDS sC___250 = {0,"SET","DIRSEPARATOR ( \1A00 )","Set(_SET_DIRSEPARATOR, \1A00 )",&sC___249 };
static COMMANDS sC___251 = {0,"SET","MBLOCKSIZE TO \1A00","Set( _SET_MBLOCKSIZE, \1A00 )",&sC___250 };
static COMMANDS sC___252 = {0,"SET","MEMOBLOCK TO \1A00","Set( _SET_MBLOCKSIZE, \1A00 )",&sC___251 };
static COMMANDS sC___253 = {0,"SET","MFILEEXT TO \1A00","Set( _SET_MFILEEXT, \1A00 )",&sC___252 };
static COMMANDS sC___254 = {0,"SET","AUTOSHARE TO \1A00","Set( _SET_AUTOSHARE, \1A00 )",&sC___253 };
static COMMANDS sC___255 = {0,"SET","AUTOSHARE TO","Set( _SET_AUTOSHARE, 0 )",&sC___254 };
static COMMANDS sC___256 = {0,"SET","AUTORDER TO \1A00","Set( _SET_AUTORDER, \1A00 )",&sC___255 };
static COMMANDS sC___257 = {0,"SET","AUTORDER TO","Set( _SET_AUTORDER, 0 )",&sC___256 };
static COMMANDS sC___258 = {0,"SET","STRICTREAD \1A20 ON,OFF,&>","Set(_SET_STRICTREAD,\1A30 )",&sC___257 };
static COMMANDS sC___259 = {0,"SET","STRICTREAD (\1A00)","Set(_SET_STRICTREAD,\1A00 )",&sC___258 };
hb_pp_topDefine = &sD___56;
hb_pp_topCommand = &sC___250;
hb_pp_topCommand = &sC___259;
hb_pp_topTranslate = NULL;
}

View File

@@ -2645,13 +2645,9 @@ HB_FUNC( ORDKEYGOTO )
if( s_pCurrArea )
{
pOrderInfo.itmOrder = hb_param( 1, HB_IT_STRING );
if( !pOrderInfo.itmOrder )
pOrderInfo.itmOrder = hb_param( 1, HB_IT_NUMERIC );
pOrderInfo.atomBagName = hb_param( 2, HB_IT_STRING );
/* Either or both may be NIL */
pOrderInfo.itmNewVal = hb_param( 3 , HB_IT_NUMERIC );
pOrderInfo.itmOrder = NULL;
pOrderInfo.atomBagName = NULL;
pOrderInfo.itmNewVal = hb_param( 1 , HB_IT_NUMERIC );
pOrderInfo.itmResult = hb_itemPutL( NULL, FALSE );
SELF_ORDINFO( ( AREAP ) s_pCurrArea->pArea, DBOI_POSITION, &pOrderInfo );
hb_retl( hb_itemGetL( pOrderInfo.itmResult ) );

View File

@@ -123,7 +123,7 @@ static void hb_cdxIndexPoolFree( LPCDXINDEX pIndex, int nPagesLeft );
/* split Root Page */
static int hb_cdxPageRootSplit( LPCDXPAGE pPage );
static LPCDXKEY hb_cdxKeyNew( void );
static RDDFUNCS cdxSuper;
static RDDFUNCS cdxTable =
@@ -489,7 +489,7 @@ static LPCDXKEY hb_cdxKeyPutC( LPCDXKEY pKey, char * szText, USHORT uiRealLen, U
pKey->len = 0;
}
}
uiLen = szText ? strlen( szText ) : 0;
uiLen = (USHORT) ( szText ? strlen( szText ) : 0 );
if ( uiLen > uiRealLen )
uiLen = uiRealLen;
pKey->len = uiRealLen;
@@ -558,13 +558,15 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP
{
BYTE buf[8], *ptr;
BYTE len = 0;
double d;
ptr = &buf[0];
switch ( hb_itemType( pItem ) )
{
case HB_IT_STRING:
case HB_IT_STRING | HB_IT_MEMO:
ptr = pItem->item.asString.value;
ptr = ( BYTE * ) pItem->item.asString.value;
len = ( BYTE ) HB_CDXMAXKEY( pItem->item.asString.length );
break;
case HB_IT_INTEGER:
@@ -573,15 +575,17 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP
#ifndef HB_LONG_LONG_OFF
case HB_IT_LONGLONG:
#endif
HB_PUT_SORTDBL( ptr, hb_itemGetND( pItem ) );
d = hb_itemGetND( pItem );
HB_DBL2ORD( &d, ptr );
len = 8;
break;
case HB_IT_DATE:
HB_PUT_SORTDBL( ptr, (double) hb_itemGetDL( pItem ) );
d = (double) hb_itemGetDL( pItem );
HB_DBL2ORD( &d, ptr );
len = 8;
break;
case HB_IT_LOGICAL:
*ptr = ( hb_itemGetL( pItem ) ? 'T' : 'F' );
*ptr = (BYTE) ( hb_itemGetL( pItem ) ? 'T' : 'F' );
len = 1;
break;
default:
@@ -595,7 +599,7 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP
pKey = hb_cdxKeyPut( pKey, ptr, len, ulRec );
#ifndef HB_CDP_SUPPORT_OFF
if ( fTrans && pTag->uiType == 'C' )
hb_cdpnTranslate( pKey->val, s_cdpage, pTag->pIndex->pArea->cdPage, pKey->len );
hb_cdpnTranslate( ( char * ) pKey->val, s_cdpage, pTag->pIndex->pArea->cdPage, pKey->len );
#endif
return pKey;
}
@@ -605,22 +609,22 @@ static LPCDXKEY hb_cdxKeyPutItem( LPCDXKEY pKey, PHB_ITEM pItem, ULONG ulRec, LP
*/
static PHB_ITEM hb_cdxKeyGetItem( LPCDXKEY pKey, PHB_ITEM pItem, USHORT uiType )
{
double d;
if ( pKey )
{
double d;
switch( uiType )
{
case 'C':
pItem = hb_itemPutCL( pItem, pKey->val, pKey->len );
pItem = hb_itemPutCL( pItem, ( char * ) pKey->val, pKey->len );
break;
case 'N':
HB_GET_SORTDBL( d, pKey->val )
HB_ORD2DBL( pKey->val, &d );
pItem = hb_itemPutND( pItem, d );
break;
case 'D':
HB_GET_SORTDBL( d, pKey->val )
pItem = hb_itemPutDL( pItem, (LONG) d );
HB_ORD2DBL( pKey->val, &d );
pItem = hb_itemPutDL( pItem, ( LONG ) d );
break;
case 'L':
pItem = hb_itemPutL( pItem, pKey->val[0] == 'T' );
@@ -876,7 +880,7 @@ static ULONG hb_cdxIndexGetAvailPage( LPCDXINDEX pIndex, BOOL bHeader )
{
FHANDLE hFile = pIndex->hFile;
BYTE byBuf[4];
ULONG ulPos = 0;
ULONG ulPos;
if ( pIndex->fReadonly )
{
@@ -1297,7 +1301,7 @@ static BYTE * hb_cdxPageGetKeyVal( LPCDXPAGE pPage, SHORT iKey )
BYTE bTrail;
iLen = pPage->TagParent->uiLen;
bTrail = ( pPage->TagParent->uiType == 'C' ) ? ' ' : '\0';
bTrail = ( BYTE ) ( pPage->TagParent->uiType == 'C' ? ' ' : '\0' );
if ( iKey < pPage->bufKeyNum - 1 )
pPage->bufKeyNum = 0;
if ( pPage->bufKeyNum == 0 )
@@ -1765,7 +1769,7 @@ static int hb_cdxPageLeafAddKey( LPCDXPAGE pPage, LPCDXKEY pKey )
}
else
{
pPage->pKeyBuf = hb_xrealloc( pPage->pKeyBuf, ( pPage->iKeys + 1 ) * iLen );
pPage->pKeyBuf = (BYTE*) hb_xrealloc( pPage->pKeyBuf, ( pPage->iKeys + 1 ) * iLen );
}
#ifndef HB_CDX_DBGCODE_OFF
@@ -2578,7 +2582,7 @@ static int hb_cdxPageKeyIntBalance( LPCDXPAGE pPage, SHORT iChildRet )
if ( iKeys > 0 )
{
pPtr = pKeyPool = hb_xgrab( iKeys * iLen );
pPtr = pKeyPool = (BYTE*) hb_xgrab( iKeys * iLen );
for ( i = 0; i < iBlncKeys; i++ )
{
if ( childs[i]->iKeys > 0 )
@@ -3828,7 +3832,7 @@ static void hb_cdxIndexLoad( LPCDXINDEX pIndex, char * szBaseName )
hb_cdxTagKeyRead( pIndex->pCompound, TOP_RECORD );
while ( !pIndex->pCompound->TagEOF )
{
(*pTagPtr) = hb_cdxTagNew( pIndex, pIndex->pCompound->CurKey->val,
(*pTagPtr) = hb_cdxTagNew( pIndex, (char *) pIndex->pCompound->CurKey->val,
pIndex->pCompound->CurKey->rec );
pTagPtr = &(*pTagPtr)->pNext;
hb_cdxTagKeyRead( pIndex->pCompound, NEXT_RECORD );
@@ -4075,13 +4079,13 @@ static BOOL hb_cdxCurKeyRefresh( CDXAREAP pArea, LPCDXTAG pTag, BOOL fUniq )
hb_cdxKeyFree( pKey );
}
}
return ( pTag->CurKey->rec == pArea->ulRecNo );
return ( pTag->CurKey->rec != 0 && pTag->CurKey->rec == pArea->ulRecNo );
}
/*
* return number of keys in order
*/
ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward )
static ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward )
{
ERRCODE retval;
@@ -4156,7 +4160,7 @@ ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward )
}
}
hb_cdxIndexUnLockRead( pTag->pIndex );
return SUCCESS;
return retval;
}
@@ -4165,12 +4169,9 @@ ERRCODE hb_cdxSkipUnique( CDXAREAP pArea, LPCDXTAG pTag, BOOL fForward )
*/
static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
{
LPCDXKEY pCurKey;
LPCDXPAGE pPage;
ULONG lKeyCount = 0;
pTag = hb_cdxGetActiveTag( pArea );
/* TODO: what with deleted flag? */
if ( fFilters && ! pArea->dbfi.itmCobExpr )
fFilters = FALSE;
@@ -4206,6 +4207,7 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
}
else if ( pTag )
{
LPCDXKEY pCurKey;
hb_cdxIndexLockRead( pTag->pIndex );
pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey );
@@ -4223,6 +4225,7 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
}
else
{
LPCDXPAGE pPage;
hb_cdxTagKeyRead( pTag, TOP_RECORD );
pPage = pTag->RootPage;
while ( pPage->Child )
@@ -4259,20 +4262,14 @@ static long hb_cdxDBOIKeyCount( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
*/
static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
{
LPCDXKEY pCurKey;
LPCDXPAGE pPage;
ULONG lKeyNo = 0;
pTag = hb_cdxGetActiveTag( pArea );
/* TODO: what with deleted flag? */
if ( fFilters && ! pArea->dbfi.itmCobExpr )
fFilters = 0;
if ( pArea->fEof )
lKeyNo = 0;
else if ( pTag && ( pTag->CurKey->rec != pArea->ulRecNo ) )
/* TODO: fix it */
lKeyNo = 0;
else if ( fFilters )
{
PHB_ITEM pRecNo;
@@ -4306,64 +4303,61 @@ static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
hb_cdxIndexLockRead( pTag->pIndex );
if ( hb_cdxCurKeyRefresh( pArea, pTag, FALSE ) )
{
pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey );
if ( pTag->topScope || pTag->bottomScope || pTag->UsrUnique )
{
if ( hb_cdxBottomScope( pTag ) )
{
LPCDXKEY pCurKey = hb_cdxKeyCopy( NULL, pTag->CurKey );
while ( !pTag->TagBOF && !pTag->TagEOF && hb_cdxTopScope( pTag ) )
{
lKeyNo++;
hb_cdxTagKeyRead( pTag, PREV_RECORD );
}
pTag->fRePos = TRUE;
hb_cdxKeyCopy( pTag->CurKey, pCurKey );
hb_cdxKeyFree( pCurKey );
}
}
else
{
if ( !pTag->TagBOF && !pTag->TagEOF )
LPCDXPAGE pPage = pTag->RootPage;
while ( pPage->Child )
pPage = pPage->Child;
if ( pTag->UsrAscend )
{
pPage = pTag->RootPage;
while ( pPage->Child )
pPage = pPage->Child;
if ( pTag->UsrAscend )
lKeyNo = pPage->iCurKey + 1;
if ( pPage->Left != CDX_DUMMYNODE )
{
lKeyNo = pPage->iCurKey + 1;
if ( pPage->Left != CDX_DUMMYNODE )
ULONG ulPage = pPage->Left;
pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE );
pPage->Page = ulPage;
while ( pPage->Page != CDX_DUMMYNODE )
{
ULONG ulPage = pPage->Right;
pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE );
pPage->Page = ulPage;
while ( pPage->Page != CDX_DUMMYNODE )
{
hb_cdxPageLoad( pPage );
lKeyNo += pPage->iKeys;
pPage->Page = pPage->Left;
}
hb_cdxPageFree( pPage, TRUE );
hb_cdxPageLoad( pPage );
lKeyNo += pPage->iKeys;
pPage->Page = pPage->Left;
}
hb_cdxPageFree( pPage, TRUE );
}
else
{
}
else
{
lKeyNo = pPage->iKeys - pPage->iCurKey;
if ( pPage->Right != CDX_DUMMYNODE )
{
ULONG ulPage = pPage->Right;
pPage = hb_cdxPageNew( pTag, NULL, CDX_DUMMYNODE );
pPage->Page = ulPage;
while ( pPage->Page != CDX_DUMMYNODE )
{
hb_cdxPageLoad( pPage );
lKeyNo += pPage->iKeys;
pPage->Page = pPage->Right;
}
hb_cdxPageFree( pPage, TRUE );
while ( pPage->Page != CDX_DUMMYNODE )
{
hb_cdxPageLoad( pPage );
lKeyNo += pPage->iKeys;
pPage->Page = pPage->Right;
}
hb_cdxPageFree( pPage, TRUE );
}
}
}
pTag->fRePos = TRUE;
hb_cdxKeyCopy( pTag->CurKey, pCurKey );
hb_cdxKeyFree( pCurKey );
}
hb_cdxIndexUnLockRead( pTag->pIndex );
}
@@ -4381,14 +4375,78 @@ static long hb_cdxDBOIKeyNo( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
/*
* DBOI_KEYGOTO goto specific logical record in the index file
*/
static long hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
static ERRCODE hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, ULONG ulKeyNo, BOOL fFilters )
{
/* TODO: DBOI_KEYGOTO goto specific logical record in the index file */
HB_SYMBOL_UNUSED( pArea );
HB_SYMBOL_UNUSED( pTag );
HB_SYMBOL_UNUSED( fFilters );
ERRCODE retval;
return 0;
/* TODO: what with deleted flag? */
if ( fFilters && ! pArea->dbfi.itmCobExpr )
fFilters = 0;
if ( ulKeyNo == 0 )
retval = hb_cdxGoEof( pArea );
else if ( fFilters )
{
USHORT uiTag = pArea->uiTag;
pArea->uiTag = hb_cdxGetTagNumber( pArea, pTag );
retval = SELF_GOTOP( ( AREAP ) pArea );
while ( !pArea->fEof && ulKeyNo-- )
retval = SELF_SKIP( ( AREAP ) pArea, 1 );
pArea->uiTag = uiTag;
}
else if ( pTag )
{
hb_cdxIndexLockRead( pTag->pIndex );
if ( pTag->topScope || pTag->bottomScope || pTag->UsrUnique )
{
if ( pTag->topScope )
hb_cdxTagKeyFind( pTag, pTag->topScopeKey );
else
hb_cdxTagKeyRead( pTag, TOP_RECORD );
while ( !pTag->TagBOF && !pTag->TagEOF && hb_cdxBottomScope( pTag ) &&
--ulKeyNo )
hb_cdxTagKeyRead( pTag, NEXT_RECORD );
}
else
{
LPCDXPAGE pPage, pOwnerPage = NULL;
ULONG ulNextPg;
hb_cdxTagKeyRead( pTag, TOP_RECORD );
pPage = pTag->RootPage;
while ( pPage->Child )
{
pOwnerPage = pPage;
pPage = pPage->Child;
}
while ( (USHORT) pPage->iKeys < ulKeyNo && pOwnerPage &&
( ulNextPg = pTag->UsrAscend ?
pPage->Right : pPage->Left ) != CDX_DUMMYNODE )
{
ulKeyNo -= pPage->iKeys;
pOwnerPage->Child = hb_cdxPageNew( pPage->TagParent, pPage->Owner, ulNextPg );
hb_cdxPageFree( pPage, FALSE );
pPage = pOwnerPage->Child;
}
if ( (USHORT) pPage->iKeys >= ulKeyNo )
{
pPage->iCurKey = pTag->UsrAscend ? ulKeyNo - 1 : pPage->iKeys - ulKeyNo;
hb_cdxSetCurKey( pPage );
}
else
pTag->CurKey->rec = 0;
}
hb_cdxIndexUnLockRead( pTag->pIndex );
if ( pTag->CurKey->rec == 0 )
retval = hb_cdxGoEof( pArea );
else
retval = SELF_GOTO( ( AREAP ) pArea, pTag->CurKey->rec );
}
else
{
retval = SELF_GOTO( ( AREAP ) pArea, ulKeyNo );
}
return retval;
}
@@ -4401,7 +4459,7 @@ static long hb_cdxDBOIKeyGoto( CDXAREAP pArea, LPCDXTAG pTag, BOOL fFilters )
/* ( DBENTRYP_BP ) hb_cdxFound : NULL */
/* ( DBENTRYP_V ) hb_cdxGoBottom */
ERRCODE hb_cdxGoBottom( CDXAREAP pArea )
static ERRCODE hb_cdxGoBottom( CDXAREAP pArea )
{
LPCDXTAG pTag;
ERRCODE retval;
@@ -4433,7 +4491,7 @@ ERRCODE hb_cdxGoBottom( CDXAREAP pArea )
/* ( DBENTRYP_I ) hb_cdxGoToId : NULL */
/* ( DBENTRYP_V ) hb_cdxGoTop */
ERRCODE hb_cdxGoTop( CDXAREAP pArea )
static ERRCODE hb_cdxGoTop( CDXAREAP pArea )
{
LPCDXTAG pTag;
ERRCODE retval;
@@ -4462,7 +4520,7 @@ ERRCODE hb_cdxGoTop( CDXAREAP pArea )
}
/* ( DBENTRYP_BIB ) hb_cdxSeek */
ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFindLast )
static ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFindLast )
{
LPCDXTAG pTag
@@ -4546,7 +4604,7 @@ ERRCODE hb_cdxSeek( CDXAREAP pArea, BOOL fSoftSeek, PHB_ITEM pKeyItm, BOOL fFind
/* ( DBENTRYP_L ) hb_cdxSkipFilter : NULL */
/* ( DBENTRYP_L ) hb_cdxSkipRaw */
ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip )
static ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip )
{
LPCDXTAG pTag;
ERRCODE retval;
@@ -4630,7 +4688,7 @@ ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip )
}
}
hb_cdxIndexUnLockRead( pTag->pIndex );
return SUCCESS;
return retval;
}
/* ( DBENTRYP_VF ) hb_cdxAddField : NULL */
@@ -4651,7 +4709,7 @@ ERRCODE hb_cdxSkipRaw( CDXAREAP pArea, LONG lToSkip )
/*
* Perform a write of WorkArea memory to the data store.
*/
ERRCODE hb_cdxGoCold( CDXAREAP pArea )
static ERRCODE hb_cdxGoCold( CDXAREAP pArea )
{
BOOL fRecordChanged = pArea->fRecordChanged;
BOOL fAppend = pArea->fAppend;
@@ -4664,10 +4722,11 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea )
if ( ( fRecordChanged || pArea->fCdxAppend ) && pArea->lpIndexes )
{
LPCDXTAG pTag = pArea->lpIndexes->TagList;
USHORT uiTag = 1;
LPCDXKEY pKey = NULL;
BOOL fAdd, fDel, fLck = FALSE;
#if 0
USHORT uiTag = 1;
#endif
if ( pArea->fShared )
{
if ( fAppend )
@@ -4768,7 +4827,9 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea )
else
pTag = NULL;
}
#if 0
++uiTag;
#endif
}
if ( pKey )
hb_cdxKeyFree( pKey );
@@ -4781,7 +4842,7 @@ ERRCODE hb_cdxGoCold( CDXAREAP pArea )
/*
* Mark the WorkArea data buffer as hot.
*/
ERRCODE hb_cdxGoHot( CDXAREAP pArea )
static ERRCODE hb_cdxGoHot( CDXAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("hb_cdxGoHot(%p)", pArea));
@@ -4830,7 +4891,7 @@ ERRCODE hb_cdxGoHot( CDXAREAP pArea )
/*
* Close the table in the WorkArea.
*/
ERRCODE hb_cdxClose( CDXAREAP pArea )
static ERRCODE hb_cdxClose( CDXAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("hb_cdxClose(%p)", pArea));
@@ -4866,7 +4927,7 @@ ERRCODE hb_cdxClose( CDXAREAP pArea )
/*
* Open a data store in the WorkArea.
*/
ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo )
static ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo )
{
HB_TRACE(HB_TR_DEBUG, ("hb_cdxOpen(%p, %p)", pArea, pOpenInfo));
@@ -4898,7 +4959,7 @@ ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo )
if ( hb_spFile( ( BYTE * ) szFileName, szSpFile ) )
{
pOrderInfo.itmResult = hb_itemPutNI( NULL, 0 );
pOrderInfo.atomBagName = hb_itemPutC( NULL, szSpFile );
pOrderInfo.atomBagName = hb_itemPutC( NULL, (char *) szSpFile );
pOrderInfo.itmOrder = NULL;
SELF_ORDLSTADD( ( AREAP ) pArea, &pOrderInfo );
pOrderInfo.itmOrder = hb_itemPutNI( NULL, hb_set.HB_SET_AUTORDER );
@@ -4921,7 +4982,7 @@ ERRCODE hb_cdxOpen( CDXAREAP pArea, LPDBOPENINFO pOpenInfo )
/*
* Retrieve the size of the WorkArea structure.
*/
ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize )
static ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize )
{
HB_TRACE(HB_TR_DEBUG, ("hb_cdxStrucSize(%p, %p)", pArea, uiSize));
HB_SYMBOL_UNUSED( pArea );
@@ -4934,7 +4995,7 @@ ERRCODE hb_cdxStructSize( CDXAREAP pArea, USHORT * uiSize )
/*
* Obtain the name of replaceable database driver (RDD) subsystem.
*/
ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer )
static ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer )
{
HB_TRACE(HB_TR_DEBUG, ("hb_cdxSysName(%p, %p)", pArea, pBuffer));
HB_SYMBOL_UNUSED( pArea );
@@ -4946,7 +5007,7 @@ ERRCODE hb_cdxSysName( CDXAREAP pArea, BYTE * pBuffer )
/* ( DBENTRYP_VEI ) hb_cdxEval : NULL */
/* ( DBENTRYP_V ) hb_cdxPack */
extern ERRCODE hb_cdxPack( CDXAREAP pArea )
static ERRCODE hb_cdxPack( CDXAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("nb_cdxPack(%p)", pArea ));
@@ -4967,7 +5028,7 @@ extern ERRCODE hb_cdxPack( CDXAREAP pArea )
/* ( DBENTRYP_VT ) hb_cdxTransRec : NULL */
/* ( DBENTRYP_V ) hb_cdxZap */
extern ERRCODE hb_cdxZap ( CDXAREAP pArea )
static ERRCODE hb_cdxZap ( CDXAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("nb_cdxZap(%p)", pArea ));
@@ -4995,7 +5056,7 @@ extern ERRCODE hb_cdxZap ( CDXAREAP pArea )
/* ( DBENTRYP_VR ) hb_cdxSetRel : NULL */
/* ( DBENTRYP_OI ) hb_cdxOrderListAdd */
ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
static ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
{
USHORT uiFlags;
FHANDLE hFile;
@@ -5106,7 +5167,7 @@ ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
pIndex = hb_cdxIndexNew( pArea );
pIndex->hFile = hFile;
pIndex->szFileName = hb_strdup( szSpFile );
pIndex->szFileName = hb_strdup( (char *) szSpFile );
if ( pArea->lpIndexes == NULL )
{
pArea->lpIndexes = pIndex;
@@ -5139,7 +5200,7 @@ ERRCODE hb_cdxOrderListAdd( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
/*
* Clear the current order list.
*/
extern ERRCODE hb_cdxOrderListClear( CDXAREAP pArea )
static ERRCODE hb_cdxOrderListClear( CDXAREAP pArea )
{
HB_TRACE(HB_TR_DEBUG, ("cdxOrderListClear(%p)", pArea));
@@ -5156,7 +5217,7 @@ extern ERRCODE hb_cdxOrderListClear( CDXAREAP pArea )
/* ( DBENTRYP_VP ) hb_cdxOrderListDelete : NULL */
/* ( DBENTRYP_OI ) hb_cdxOrderListFocus */
ERRCODE hb_cdxOrderListFocus( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
static ERRCODE hb_cdxOrderListFocus( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
{
LPCDXTAG pTag;
@@ -5232,7 +5293,7 @@ static ERRCODE hb_cdxOrderListRebuild( CDXAREAP pArea )
/*
* create new order
*/
ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
static ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
{
ULONG ulRecNo;
BOOL fNewFile, fOpenedIndex;
@@ -5248,7 +5309,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
USHORT uiType, uiLen;
BYTE bType;
pKeyExp = pForExp = NULL;
pForExp = NULL;
pExpMacro = pForMacro = NULL;
HB_TRACE(HB_TR_DEBUG, ("cdxOrderCreate(%p, %p)", pArea, pOrderInfo));
@@ -5441,7 +5502,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
}
else
{
strcpy( szFileName, szSpFile );
strcpy( szFileName, ( char * ) szSpFile );
hFile = hb_spOpen( ( BYTE * ) szFileName,
FO_READWRITE | ( pArea->fShared ? FO_DENYNONE : FO_EXCLUSIVE ) );
}
@@ -5554,7 +5615,7 @@ ERRCODE hb_cdxOrderCreate( CDXAREAP pArea, LPDBORDERCREATEINFO pOrderInfo )
}
/* ( DBENTRYP_OI ) hb_cdxOrderDestroy */
ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
static ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
{
LPCDXINDEX pIndex, pIndexTmp;
LPCDXTAG pTag;
@@ -5624,7 +5685,7 @@ ERRCODE hb_cdxOrderDestroy( CDXAREAP pArea, LPDBORDERINFO pOrderInfo )
/*
* Provides information about order management.
*/
ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInfo )
static ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInfo )
{
LPCDXTAG pTag = NULL;
USHORT uiTag = 0;
@@ -5664,8 +5725,9 @@ ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, USHORT uiIndex, LPDBORDERINFO pOrderInf
if ( pOrderInfo->itmNewVal && HB_IS_NUMERIC( pOrderInfo->itmNewVal ) )
{
/* TODO: DBOI_KEYGOTO goto specific logical record in the index file */
pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult,
hb_cdxDBOIKeyGoto( pArea, pTag, TRUE ) );
pOrderInfo->itmResult = hb_itemPutL( pOrderInfo->itmResult,
hb_cdxDBOIKeyGoto( pArea, pTag,
hb_itemGetNL( pOrderInfo->itmNewVal ), TRUE ) == SUCCESS );
}
else
pOrderInfo->itmResult = hb_itemPutNL( pOrderInfo->itmResult,
@@ -6348,7 +6410,6 @@ static void hb_cdxSortLinkNew( LPSORTINFO pSort, LONG * NewLink )
static void hb_cdxSortSwapSendWord( LPSORTINFO pSort, BYTE * Value )
{
LONG Tag;
BYTE * pce;
BYTE bLen;
double d;
@@ -6357,10 +6418,8 @@ static void hb_cdxSortSwapSendWord( LPSORTINFO pSort, BYTE * Value )
bLen = Value[0];
bLen -= 8;
Value++;
pce = Value + bLen;
HB_GET_SORTDBL( d, pce );
HB_ORD2DBL( &Value[bLen], &d );
Tag = ( LONG ) d;
// hb_cdxSortOutputWord( pSort, Tag, Value, uiLen );
if ( pSort->pSwapPage->nCurPos + sizeof(SORTSWAPITEM) + bLen - 1 >= sizeof(pSort->pSwapPage->page) ) {
if ( hb_fsWrite( pSort->hTempFile, (BYTE *) pSort->pSwapPage->page, pSort->pSwapPage->nCurPos ) != pSort->pSwapPage->nCurPos )
@@ -6426,7 +6485,7 @@ static void hb_cdxSortSwapFillPage( LPSORTINFO pSort )
static int hb_cdxSortSwapSavePage( LPSORTINFO pSort )
{
SORTSWAPPAGE swap;
char *ptr;
BYTE *ptr;
pSort->nSwapPages++;
if ( ! pSort->hTempFile ) {
@@ -6512,7 +6571,7 @@ static BOOL hb_cdxSortSwapGetNextKey( LPSORTINFO pSort, LONG * pKeyRec, BYTE * p
USHORT winPage, nPage;
ULONG winKeyRec;
BYTE winKeyLen;
char * winKeyVal;
BYTE * winKeyVal;
int iResult = 1;
/* this way some compilers don't emit warnings */
@@ -6576,7 +6635,7 @@ static BOOL hb_cdxSortSwapGetNextKey( LPSORTINFO pSort, LONG * pKeyRec, BYTE * p
}
pPage->tmpRecNo = pItem->recno;
pPage->tmpKeyLen = pItem->keyLen;
pPage->tmpKeyVal = pItem->key;
pPage->tmpKeyVal = ( BYTE * ) pItem->key;
}
return TRUE;
}
@@ -6590,7 +6649,7 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort )
{
LPSORTSWAPPAGE pPage;
LPSORTSWAPITEM pItem;
char *ptr;
BYTE *ptr;
USHORT nPage;
LONG nKeyRec;
BYTE KeyVal[2][CDX_MAXKEY + 1], *pKeyVal, *pKeyPrevVal;
@@ -6633,7 +6692,7 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort )
pItem = (LPSORTSWAPITEM) (pPage->page);
pPage->tmpRecNo = pItem->recno;
pPage->tmpKeyLen = pItem->keyLen;
pPage->tmpKeyVal = pItem->key;
pPage->tmpKeyVal = ( BYTE * ) pItem->key;
hb_fsSeek( pSort->hTempFile, pPage->nFileOffset + pPage->pageLen, SEEK_SET );
#ifdef CDXDEBUG
@@ -6651,8 +6710,8 @@ static int hb_cdxSortSwapBuildIndex( LPSORTINFO pSort )
{
if ( pKeyPrevVal ) {
if ( nKeyPrevLen == nKeyLen ) {
if (! hb_cdxSortKeyValCompare( pSort->CurTag, (char *) pKeyPrevVal, (BYTE) nKeyPrevLen,
(char *) pKeyVal, (BYTE) nKeyLen ) )
if (! hb_cdxSortKeyValCompare( pSort->CurTag, pKeyPrevVal, (BYTE) nKeyPrevLen,
pKeyVal, (BYTE) nKeyLen ) )
{
continue;
}
@@ -6714,10 +6773,12 @@ static void hb_cdxSortInsertWord( LPSORTINFO pSort, LONG Tag, char * Value,
USHORT uiLen )
{
char s[ 8 ];
double d;
USHORT cc, nc;
LPSORTDATA wx;
HB_PUT_SORTDBL( s, ( double ) Tag );
d = ( double ) Tag;
HB_DBL2ORD( &d, s );
if( pSort->NodeLimit - pSort->NodeCur < uiLen + 8 )
{
@@ -7025,16 +7086,14 @@ static void hb_cdxSortRecurseDict( LPSORTINFO pSort, LONG WPtr, LONG WBgn )
static void hb_cdxSortSendWord( LPSORTINFO pSort, BYTE * Value )
{
LONG Tag;
char * pce;
USHORT uiLen;
double d;
uiLen = ( USHORT ) Value[0];
Value++;
pce = (char *) (Value + uiLen - 8) ;
HB_GET_SORTDBL( d, pce );
HB_ORD2DBL( &Value[uiLen - 8], &d );
Tag = ( LONG ) d;
hb_cdxSortOutputWord( pSort, Tag, Value, uiLen-8 );
hb_cdxSortOutputWord( pSort, Tag, Value, uiLen - 8 );
}
static void hb_cdxSortOutputWord( LPSORTINFO pSort, LONG Tag, BYTE * Value,
@@ -7117,7 +7176,7 @@ static void hb_cdxSortAddExternal( LPSORTINFO pSort, USHORT Lvl, LONG Tag, LONG
memset( pSort->NodeList[ Lvl ]->cdxu.External.ExtData, 0,
sizeof( pSort->NodeList[ Lvl ]->cdxu.External.ExtData ) );
pSort->NodeList[ Lvl ]->cdxu.External.FreeSpace = CDX_EXTERNAL_SPACE;
hb_cdxSortKeyPut( pSort->LastKey, "", 0, 0, ( pSort->CurTag->uiType == 'C' ) );
hb_cdxSortKeyPut( pSort->LastKey, (BYTE*) "", 0, 0, ( pSort->CurTag->uiType == 'C' ) );
}
ct = ( USHORT ) ( pSort->CurTag->uiLen - Value->length );
cd = hb_cdxSortKeyFindDup( Value, pSort->LastKey );
@@ -7316,6 +7375,8 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag )
if ( bForOk )
{
double d;
if ( pTag->nField )
{
SELF_GETVALUE( ( AREAP ) pArea, pTag->nField, pItem );
@@ -7349,12 +7410,14 @@ static void hb_cdxTagDoIndex( LPCDXTAG pTag )
case HB_IT_LONGLONG:
#endif
case HB_IT_DOUBLE:
HB_PUT_SORTDBL( &cTemp[0], hb_itemGetND( pItem ) );
d = hb_itemGetND( pItem );
HB_DBL2ORD( &d, &cTemp[0] );
hb_cdxSortInsertWord( pSort, pArea->ulRecNo, (char *) cTemp, 8 );
break;
case HB_IT_DATE:
HB_PUT_SORTDBL( &cTemp[0], (double) hb_itemGetDL( pItem ) );
d = (double) hb_itemGetDL( pItem );
HB_DBL2ORD( &d, &cTemp[0] );
hb_cdxSortInsertWord( pSort, pArea->ulRecNo, (char *) cTemp, 8 );
break;

View File

@@ -2606,9 +2606,9 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex )
printf( "ntxCreateOrder" );
}
}
if( pArea->lpdbOrdCondInfo )
if( pArea->lpdbOrdCondInfo || pArea->lpdbRelations )
{
if( !pArea->lpdbOrdCondInfo->fAll )
if( !pArea->lpdbOrdCondInfo->fAll || pArea->lpdbRelations )
SELF_SKIP( ( AREAP ) pArea, 1 );
if( pArea->lpdbOrdCondInfo->lStep )
{
@@ -2623,8 +2623,8 @@ static ERRCODE hb_ntxIndexCreate( LPNTXINDEX pIndex )
hb_vmSend( 0 );
}
}
else if( pArea->lpdbRelations )
SELF_SKIP( ( AREAP ) pArea, 1 );
// else if( pArea->lpdbRelations )
// SELF_SKIP( ( AREAP ) pArea, 1 );
}
hb_ntxSortKeyEnd( pTag, &sortInfo );
if( ( !pArea->lpdbOrdCondInfo || pArea->lpdbOrdCondInfo->fAll ) && !pArea->lpdbRelations )