2003-11-09 00:50 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 ) );
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 )
|
||||
|
||||
Reference in New Issue
Block a user