2001-08-20 11:55 UTC-0800 Brian Hays <bhays@abacuslaw.com>

This commit is contained in:
Brian Hays
2001-08-21 06:55:25 +00:00
parent 459b8400ee
commit 8ee6ee64f9
7 changed files with 543 additions and 46 deletions

View File

@@ -1,7 +1,52 @@
2001-08-20 11:55 UTC-0800 Brian Hays <bhays@abacuslaw.com>
* contrib/rdd_ads/ads1.c
* fixed subIndexing.
* optimized DBI_GETLOCKARRAY and fixed memory leak
* adsOrderListFocus() failed on space-padded strings
* adsGoTo: if on same record, refresh. Fixed issues that arose
from minor bugs in ADS when using relations in versions
prior to 6.1
* adsAppend() added error handling
* fixed file lock/unlock, and record locking to support
dbrlock lock list maintenance (and memory leak when
no recno was passed to dbrlock())
* contrib/rdd_ads/adsfunc.c
* adssetServerType now returns any error numbers
+ added AdsRefreshRecord, AdsIsTableLocked, AdsIsRecordLocked
* source/rdd/dbcmd.c
* Set NetErr flag to True for failed dbAppend()
* fixed ordCondSet parameters. See pptable.c below.
+ contrib/libgt/bitflags.c
+ Dave Pearson's bitflags.c, which I ported to Harbour.
Has functions to use a Harbour string for storing On/Off
bit flags.
* contrib/libgt/doc/en/ht_gt.txt
+ added docs from Dave Pearson's bitflags.c
* source/pp/pptable.c
* Alexander Kresin's fix for 5.3 compatible parameters
for INDEX ON and ordCondSet().
WARNING! IF you had hard-coded calls to this function,
and used any parameters after the 11th one,
you have to change your code! Or, if you have a header
that translates INDEX ON for clauses USECURRENT, ADDITIVE,
CUSTOM or NOOPTIMIZE, these parameters are shifted back
now.
The parameter list was incorrectly handled before because
of the 12th parameter that is always NIL.
See Harbour Archives, subject "XINDEX warning" for details
2001-08-21 06:47 GMT Dave Pearson <davep@davep.org>
* source/rtl/gtcrs/gtcrs.c
* Fixed incorrectly named variable (Row -> uRow) in hb_gt_VertLine().
2001-08-21 23:35 UTC-0400 David G. Holm <dholm@jsd-llc.com>
* include/hbapigt.h
@@ -41,7 +86,7 @@
*source/compiler/exproptb.c
*source/compiler/genc.c
*source/compiler/hbpcode.c
* fixed bug in "&macro" and &macro() syntax
* fixed bug in "&macro" and &macro() syntax
2001-08-20 14:02 GMT Dave Pearson <davep@davep.org>
* config/test.cf

View File

@@ -0,0 +1,174 @@
/*
* File......: BITFLAGS.C
* Author....: Dave Pearson
* BBS.......: The Dark Knight Returns
* Net/Node..: 050/069
* User Name.: Dave Pearson
* Date......: 31/03/93
* Revision..: 1.0
*
* This is an original work by Dave Pearson and is placed in the public
* domain.
*
* Modification history:
* ---------------------
*
* 8/19/2001 Modifications for Harbour by Brian Hays, also placed in
* the public domain.
*
*/
#include "hbapi.h"
#define _GT_MAX(x,y) (x > y ? x : y)
HB_FUNC( GT_NEWFLAG )
{
char *FlagString;
unsigned ByteCount;
unsigned FlagCount = 1;
unsigned Byte;
if (ISNUM(1))
{
FlagCount = (unsigned) hb_parni(1);
}
if (FlagCount > 0)
{
ByteCount = (unsigned)((FlagCount / 8) + 1);
if (!(FlagCount % 8))
{
--ByteCount;
}
FlagString = hb_xgrab(ByteCount);
for (Byte = 0; Byte < ByteCount; Byte++)
{
FlagString[Byte] = 0;
}
hb_retclen(FlagString, ByteCount);
hb_xfree(FlagString);
}
else
{
hb_retc("");
}
}
HB_FUNC( GT_SETFLAG )
{
char *FlagString;
unsigned StartBit = 1;
unsigned EndBit = 1;
unsigned BitCount;
unsigned BitPointer;
unsigned BytePointer;
if ( ISCHAR(1) )
{
FlagString = hb_parc(1);
if ( ISNUM(2) )
{
StartBit = hb_parni(2);
}
if ( ISNUM(3) )
{
EndBit = hb_parni(3);
}
EndBit = _GT_MAX(StartBit, EndBit);
if (StartBit > 0 && EndBit <= (hb_parclen(1) * 8))
{
for (BitCount = StartBit; BitCount <= EndBit; BitCount++)
{
BitPointer = BitCount % 8;
BytePointer = (unsigned) (BitCount / 8);
if (!BitPointer)
{
BitPointer = 8;
--BytePointer;
}
FlagString[BytePointer] |= 1 << (BitPointer - 1);
}
}
hb_retclen(FlagString, hb_parclen(1));
}
else
{
hb_retc("");
}
}
HB_FUNC( GT_CLRFLAG )
{
char *FlagString;
unsigned StartBit = 1;
unsigned EndBit = 1;
unsigned BitCount;
unsigned BitPointer;
unsigned BytePointer;
if ( ISCHAR(1) )
{
FlagString = hb_parc(1);
if ( ISNUM(2) )
{
StartBit = hb_parni(2);
}
if ( ISNUM(3) )
{
EndBit = hb_parni(3);
}
EndBit = _GT_MAX(StartBit, EndBit);
if (StartBit > 0 && EndBit <= (hb_parclen(1) * 8))
{
for (BitCount = StartBit; BitCount <= EndBit; BitCount++)
{
BitPointer = BitCount % 8;
BytePointer = (unsigned) (BitCount / 8);
if (!BitPointer)
{
BitPointer = 8;
--BytePointer;
}
FlagString[BytePointer] &= 0xff - (1 << (BitPointer - 1));
}
}
hb_retclen(FlagString, hb_parclen(1));
}
else
{
hb_retc("");
}
}
HB_FUNC( GT_ISFLAG )
{
BOOL FlagStatus = FALSE;
unsigned Bit = 1;
unsigned BitPointer;
unsigned BytePointer;
char *FlagString;
if ( ISCHAR(1) )
{
FlagString = hb_parc(1);
if ( ISNUM(2) )
{
Bit = hb_parni(2);
}
if (Bit > 0 && Bit <= (hb_parclen(1) * 8))
{
BitPointer = Bit % 8;
BytePointer = (unsigned) (Bit / 8);
if (!BitPointer)
{
BitPointer = 8;
--BytePointer;
}
FlagStatus = FlagString[BytePointer] & (1 << (BitPointer - 1));
}
}
hb_retl(FlagStatus);
}

View File

@@ -9,6 +9,10 @@
* Copyright 1999 Andy M Leighton
* Documentation
*
* FlagString functions GT_NEWFLAG, GT_SETFLAG, GT_CLRFLAG, and
* GT_ISFLAG are an original work by Dave Pearson and
* are placed in the public domain.
*
* See doc/license.txt for licensing terms.
*
*/
@@ -564,3 +568,150 @@
* $END$
*/
/* $DOC$
* $FUNCNAME$
* GT_NEWFLAG()
* $CATEGORY$
* General
* $ONELINER$
* Create a new bit flag string.
* $SYNTAX$
* GT_NewFlag(<nFlagCount>) --> cFlagString
* $ARGUMENTS$
* <nFlagCount> is the number of flags you wish to store.
* $RETURNS$
* A string to hold the bit flags. All flags are set to FALSE.
* $DESCRIPTION$
* GT_NewFlag() is used to construct a bit flag string. The bit flag
* functions can be used for storing a large number of logical values
* in a small space.
*
* To create a bit flag string you need to pass GT_NewFlag() a value
* that is equal to or greater than the number of flags required (you
* may want to allow for future expansion). Each character in the
* string returned from GT_NewFlag() will hold 8 logical values.
* $EXAMPLES$
* cFlags := GT_NewFlag(20) // Create a bit flag string for 20
* // logical values.
* $SEEALSO$
* GT_SETFLAG() GT_CLRFLAG() GT_ISFLAG()
* $END$
*/
/* $DOC$
* $FUNCNAME$
* GT_SETFLAG()
* $CATEGORY$
* General
* $ONELINER$
* Set a number of flags to TRUE in a bit flag string.
* $SYNTAX$
* GT_SetFlag(<cFlagString>,[<nStart>],[<nEnd>]) --> cFlagString
* $ARGUMENTS$
* <cFlagString> is a bit flag string created with GT_NewFlag()
*
* <nStart> is the starting flag. This is an optional numeric value.
* If not supplied it defaults to 1.
*
* <nEnd> is the ending flag. This is an optional numeric value. If
* not supplied it defaults to <nStart>.
* $RETURNS$
* The bit map string with the new flag settings.
* $DESCRIPTION$
* GT_SetFlag() is used to turn flags within the flag string on.
* $EXAMPLES$
* cFlags := GT_NewFlag(20) // Create a bit flag string for 20
* // logical values.
*
* // Now set flags 10 to 15 to true.
*
* cFlags := GT_SetFlag(cFlags,10,15)
*
* // And set flag 18 to true.
*
* cFlags := GT_SetFlag(cFlags,18)
*
* // And set flag 1 to true.
*
* cFlags := GT_SetFlag(cFlags)
* $SEEALSO$
* GT_NEWFLAG() GT_CLRFLAG() GT_ISFLAG()
* $END$
*/
/* $DOC$
* $FUNCNAME$
* GT_CLRFLAG()
* $CATEGORY$
* General
* $ONELINER$
* Set a number of flags to FALSE in a bit flag string.
* $SYNTAX$
* GT_ClrFlag(<cFlagString>,[<nStart>],[<nEnd>]) --> cFlagString
* $ARGUMENTS$
* <cFlagString> is a bit flag string created with GT_NewFlag()
*
* <nStart> is the starting flag. This is an optional numeric value.
* If not supplied it defaults to 1.
*
* <nEnd> is the ending flag. This is an optional numeric value. If
* not supplied it defaults to <nStart>.
* $RETURNS$
* The bit map string with the new flag settings.
* $DESCRIPTION$
* GT_ClrFlag() is used to turn flags within the flag string off.
* $EXAMPLES$
* cFlags := GT_NewFlag(20) // Create a bit flag string for 20
* // logical values.
*
* // Now, turn them all on.
*
* cFlags := GT_SetFlag(cFlags,1,20)
*
* // Now set flags 10 to 15 to false.
*
* cFlags := GT_ClrFlag(cFlags,10,15)
*
* // And set flag 18 to false.
*
* cFlags := GT_ClrFlag(cFlags,18)
*
* // And set flag 1 to false.
*
* cFlags := GT_ClrFlag(cFlags)
* $SEEALSO$
* GT_NEWFLAG() GT_SETFLAG() GT_ISFLAG()
* $END$
*/
/* $DOC$
* $FUNCNAME$
* GT_ISFLAG()
* $CATEGORY$
* General
* $ONELINER$
* Test the setting of a flag in a bit flag string.
* $SYNTAX$
* GT_IsFlag(<cFlagString>,[<nFlag>]) --> lSetting
* $ARGUMENTS$
* <cFlagString> is a bit flag string created with GT_NewFlag()
*
* <nFlag> is the flag to be tested.
* $RETURNS$
* A boolean value, TRUE if the flag is on, FALSE if it's off.
* $DESCRIPTION$
* GT_IsFlag() is used to test the state of a flag with a bit flag
* string.
* $EXAMPLES$
*
* // Print the setting of the flags in a flag string called ``cDave''
*
* for nFlag := 1 to (len(cDave)*8)
* ? "Flag number ",nFlag," == ",GT_IsFlag(cDave,nFlag)
* next
* $SEEALSO$
* GT_NEWFLAG() GT_SETFLAG() GT_CLRFLAG()
* $END$
*/

View File

@@ -437,7 +437,21 @@ static ERRCODE adsGoTo( ADSAREAP pArea, ULONG ulRecNo )
pArea->fValidBuffer = FALSE;
pArea->fFound = FALSE;
if( ulRecNo > 0 && ulRecNo <= pArea->ulRecCount )
/* -----------------7/19/2001 3:04PM-----------------
The following call is a necessary workaround for ACE32.DLL
prior to 6.1. There were bugs where
AdsGotoRecord() can FAIL to move the record pointer
after some sequences of setting/clearing relations.
A call to AdsGetRecordNum() before it clears the problem. -BH
--------------------------------------------------*/
AdsGetRecordNum( pArea->hTable, ADS_IGNOREFILTERS,
(UNSIGNED32 *)&(pArea->ulRecNo) );
if ( pArea->ulRecNo == ulRecNo && ulRecNo > 0 && !pArea->fEof) /* just refresh current record */
{ /* if it was at eof, and another station or handle added a record, it needs to GoTo or AtEof stays True. */
AdsRefreshRecord(pArea->hTable);
}
else if( ulRecNo > 0 && ulRecNo <= pArea->ulRecCount )
{
pArea->ulRecNo = ulRecNo;
pArea->fBof = pArea->fEof = FALSE;
@@ -468,8 +482,6 @@ static ERRCODE adsGoToId( ADSAREAP pArea, PHB_ITEM pItem )
if( HB_IS_NUMERIC( pItem ) )
{
ulRecNo = hb_itemGetNL( pItem );
// if( ulRecNo == 0 ) // bh: Go 0 must go to eof!
// ulRecNo = pArea->ulRecNo;
return adsGoTo( pArea, ulRecNo );
}
else
@@ -481,12 +493,11 @@ static ERRCODE adsGoToId( ADSAREAP pArea, PHB_ITEM pItem )
static ERRCODE adsGoTop( ADSAREAP pArea )
{
UNSIGNED32 ulRetVal;
HB_TRACE(HB_TR_DEBUG, ("adsGoTop(%p)", pArea));
pArea->fTop = TRUE;
pArea->fBottom = FALSE;
ulRetVal = AdsGotoTop ( (pArea->hOrdCurrent) ? pArea->hOrdCurrent : pArea->hTable );
AdsGotoTop ( (pArea->hOrdCurrent) ? pArea->hOrdCurrent : pArea->hTable );
hb_adsCheckBofEof( pArea );
return SUPER_SKIPFILTER( (AREAP)pArea, 1 );
@@ -662,13 +673,21 @@ static ERRCODE adsAddField( ADSAREAP pArea, LPDBFIELDINFO pFieldInfo )
static ERRCODE adsAppend( ADSAREAP pArea, BOOL bUnLockAll )
{
UNSIGNED32 ulRetVal;
HB_SYMBOL_UNUSED( bUnLockAll );
HB_TRACE(HB_TR_DEBUG, ("adsAppend(%p, %d)", pArea, (int) bUnLockAll));
AdsAppendRecord ( pArea->hTable );
pArea->ulRecCount++;
hb_adsCheckBofEof( pArea );
return SUCCESS;
ulRetVal = AdsAppendRecord( pArea->hTable );
if ( ulRetVal == AE_SUCCESS )
{
pArea->ulRecCount++;
pArea->fBof = FALSE ;
pArea->fEof = FALSE ;
return SUCCESS;
}
else
return FAILURE;
}
#define adsCreateFields NULL
@@ -1151,16 +1170,20 @@ static ERRCODE adsInfo( ADSAREAP pArea, USHORT uiIndex, PHB_ITEM pItem )
AdsGetNumLocks(pArea->hTable, &uiIndex);
if(uiIndex)
{
UNSIGNED32 *puLocks;
puLocks = (UNSIGNED32 *) hb_xgrab( (uiIndex + 1) * sizeof( UNSIGNED32 ) );
AdsGetAllLocks(pArea->hTable, puLocks, &uiIndex);
UNSIGNED32 *puLocks;
puLocks = (UNSIGNED32 *) hb_xgrab( (uiIndex + 1) * sizeof( UNSIGNED32 ) );
AdsGetAllLocks(pArea->hTable, puLocks, &uiIndex);
if(uiIndex)
for(uiCount=0; uiCount < uiIndex; uiCount++)
hb_arrayAdd( pItem, hb_itemPutNL( NULL, puLocks[ uiCount ] ) );
hb_xfree(puLocks);
if(uiIndex)
{
hb_arraySize( pItem, uiIndex );
for(uiCount=0; uiCount < uiIndex; uiCount++)
hb_itemPutNL( hb_arrayGetItemPtr( pItem, (ULONG) uiCount+1 ),
puLocks[ uiCount ] );
}
hb_xfree(puLocks);
}
break;
}
@@ -1467,8 +1490,21 @@ static ERRCODE adsOrderListFocus( ADSAREAP pArea, LPDBORDERINFO pOrderInfo )
}
else if( HB_IS_STRING( pOrderInfo->itmOrder ) )
{
/* ADS can't handle a space-padded string--we have to trim it */
UNSIGNED8 pucTagName[ADS_MAX_TAG_NAME + 1];
ULONG i;
char * pSrc = hb_itemGetCPtr( pOrderInfo->itmOrder );
ULONG ulLen = hb_strRTrimLen( pSrc,
hb_itemGetCLen( pOrderInfo->itmOrder ), FALSE );
if( ulLen > ADS_MAX_TAG_NAME )
ulLen = ADS_MAX_TAG_NAME;
strncpy( pucTagName, pSrc, ulLen);
pucTagName[ulLen] = '\0';
ulRetVal = AdsGetIndexHandle( pArea->hTable,
(UNSIGNED8*) hb_itemGetCPtr( pOrderInfo->itmOrder ), &phIndex );
pucTagName, &phIndex );
}
if( ulRetVal != AE_SUCCESS )
return FAILURE;
@@ -2055,14 +2091,11 @@ static ERRCODE adsRawLock( ADSAREAP pArea, USHORT uiAction, ULONG lRecNo )
case FILE_UNLOCK:
if( !pArea->fShared )
return TRUE;
hb_adsUnLockAllRecords( pArea );
if( pArea->fFLocked )
{
ulRetVal = AdsUnlockTable ( pArea->hTable );
if ( ulRetVal != AE_SUCCESS )
return FAILURE;
ulRetVal = AdsUnlockTable ( pArea->hTable );
if ( ulRetVal == AE_SUCCESS || ulRetVal == AE_TABLE_NOT_LOCKED || ulRetVal == AE_TABLE_NOT_SHARED )
pArea->fFLocked = FALSE;
}
else
return FAILURE;
break;
}
return SUCCESS;
@@ -2070,18 +2103,51 @@ static ERRCODE adsRawLock( ADSAREAP pArea, USHORT uiAction, ULONG lRecNo )
static ERRCODE adsLock( ADSAREAP pArea, LPDBLOCKINFO pLockInfo )
{
USHORT uiAction ;
BOOL bUnlocked = FALSE;
ULONG ulRecNo;
HB_TRACE(HB_TR_DEBUG, ("adsLock(%p, %p)", pArea, pLockInfo));
if( pLockInfo->itmRecID == 0 )
{
hb_adsUnLockAllRecords( pArea );
bUnlocked = TRUE;
/* Get current record */
AdsGetRecordNum( pArea->hTable, ADS_IGNOREFILTERS,
(UNSIGNED32 *)&(pArea->ulRecNo) );
pLockInfo->itmRecID = hb_itemPutNL( NULL, pArea->ulRecNo );
(UNSIGNED32 *)&(pArea->ulRecNo) );
ulRecNo = pArea->ulRecNo;
}
if( adsRawLock( pArea, pLockInfo->uiMethod, hb_itemGetNL( pLockInfo->itmRecID ) ) == SUCCESS )
else
ulRecNo = (ULONG) hb_itemGetNL(pLockInfo->itmRecID) ;
switch ( pLockInfo->uiMethod )
{
case DBLM_EXCLUSIVE :
if ( !bUnlocked )
hb_adsUnLockAllRecords( pArea );
uiAction = REC_LOCK ;
break;
case DBLM_MULTIPLE :
uiAction = REC_LOCK ;
break;
case DBLM_FILE :
uiAction = FILE_LOCK ;
break;
default :
/* This should probably throw a real error... */
AdsShowError( (UNSIGNED8 *) "Error in pLockInfo->uiMethod" );
pLockInfo->fResult = FALSE;
return FAILURE;
}
if( adsRawLock( pArea, uiAction, ulRecNo ) == SUCCESS )
pLockInfo->fResult = TRUE;
else
pLockInfo->fResult = FALSE;
@@ -2094,9 +2160,12 @@ static ERRCODE adsUnLock( ADSAREAP pArea, ULONG lRecNo )
HB_TRACE(HB_TR_DEBUG, ("adsUnLock(%p, %lu)", pArea, lRecNo));
if( lRecNo == 0 )
hb_adsUnLockAllRecords( pArea );
{
adsRawLock( pArea, FILE_UNLOCK, lRecNo );
}
else
adsRawLock( pArea, REC_UNLOCK, lRecNo );
return SUCCESS;
}

View File

@@ -89,12 +89,13 @@ HB_FUNC( ADSSETFILETYPE )
HB_FUNC( ADSSETSERVERTYPE )
{
int servType;
UNSIGNED32 ulRetVal = 999999;
if( hb_pcount() > 0 )
{
servType = hb_parni( 1 );
if( servType>0 && servType<3 )
AdsSetServerType( servType );
ulRetVal = AdsSetServerType( servType );
}
hb_retnl( ulRetVal );
}
HB_FUNC( ADSSETDATEFORMAT )
@@ -137,13 +138,13 @@ HB_FUNC( ADSISSERVERLOADED )
UNSIGNED16 pbLoaded = 0;
UNSIGNED32 ulRetVal;
hb_retnl( 0 );
if( ISCHAR( 1 ) )
{
ulRetVal = AdsIsServerLoaded( (UNSIGNED8*) hb_parc(1), &pbLoaded);
if ( ulRetVal == AE_SUCCESS )
hb_retnl( pbLoaded );
if ( ulRetVal != AE_SUCCESS )
pbLoaded = 0;
}
hb_retnl( pbLoaded );
}
//HB_FUNC( ADSGETCONNECTIONTYPE )
@@ -169,6 +170,45 @@ HB_FUNC( ADSISSERVERLOADED )
//}
HB_FUNC( ADSISTABLELOCKED )
{
UNSIGNED32 ulRetVal ;
UNSIGNED16 pbLocked = FALSE;
ADSAREAP pArea;
pArea = (ADSAREAP) hb_rddGetCurrentWorkAreaPointer();
if( pArea )
ulRetVal = AdsIsTableLocked( pArea->hTable, &pbLocked );
if( !pArea || ulRetVal != AE_SUCCESS )
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "ADSISTABLELOCKED" );
hb_retl( pbLocked );
}
HB_FUNC( ADSISRECORDLOCKED )
{
UNSIGNED32 ulRetVal ;
UNSIGNED32 ulRec;
UNSIGNED16 pbLocked = FALSE;
ADSAREAP pArea;
pArea = (ADSAREAP) hb_rddGetCurrentWorkAreaPointer();
if( pArea )
{
if ( ISNUM( 1 ) )
ulRec = hb_parnl( 1 );
else
ulRec = pArea->ulRecNo;
ulRetVal = AdsIsRecordLocked( pArea->hTable, ulRec, &pbLocked );
}
if( !pArea || ulRetVal != AE_SUCCESS )
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "ADSISRECORDLOCKED" );
hb_retl( pbLocked );
}
HB_FUNC( ADSLOCKING )
{
int oldType = adsLockType;
@@ -893,6 +933,17 @@ HB_FUNC( ADSWRITEALLRECORDS )
hb_retnl( AdsWriteAllRecords() );
}
HB_FUNC( ADSREFRESHRECORD )
{
ADSAREAP pArea;
pArea = (ADSAREAP) hb_rddGetCurrentWorkAreaPointer();
if( pArea )
AdsRefreshRecord( pArea->hTable );
else
hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "ADSREFRESHRECORD" );
}
HB_FUNC( ADSCOPYTABLE )
{
ADSAREAP pArea;
@@ -1048,4 +1099,6 @@ HB_FUNC( ADSGETNUMINDEXES ) /* cExpr */
HB_FUNC( ADSGETCONNECTIONHANDLE )
{
hb_retni( adsConnectHandle );
}
}

View File

@@ -395,10 +395,10 @@ void hb_pp_Table( void )
static COMMANDS sC___228 = {0,"CLEAR","","CLEAR SCREEN ; CLEAR GETS",&sC___227 };
static COMMANDS sC___229 = {0,"CLEAR","ALL",
"CLOSE DATABASES ; CLOSE FORMAT ; CLEAR MEMORY ; CLEAR GETS ; SET ALTERNATE OFF ; SET ALTERNATE TO",&sC___228 };
static COMMANDS sC___230 = {0,"INDEX","ON \1A00 [TAG \1B40 ] TO \1C40 [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )",&sC___229 };
static COMMANDS sC___231 = {0,"INDEX","ON \1A00 TAG \1B40 [TO \1C40] [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )",&sC___230 };
static COMMANDS sC___230 = {0,"INDEX","ON \1A00 [TAG \1B40 ] TO \1C40 [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>] [\1O20 USECURRENT>] [\1P20 ADDITIVE>] [\1R20 CUSTOM>] [\1S20 NOOPTIMIZE>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50],, [\1P50], [\1O50], [\1R50], [\1S50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )",&sC___229 };
static COMMANDS sC___231 = {0,"INDEX","ON \1A00 TAG \1B40 [TO \1C40] [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>] [\1O20 USECURRENT>] [\1P20 ADDITIVE>] [\1R20 CUSTOM>] [\1S20 NOOPTIMIZE>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50],, [\1P50], [\1O50], [\1R50], [\1S50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )",&sC___230 };
static COMMANDS sC___232 = {0,"INDEX","ON \1A00 TO \1B40 [\1C20 UNIQUE>]",
"dbCreateIndex( \1B30, \1A20, \1A40, if( \1C50, .t., NIL ) )",&sC___231 };
static COMMANDS sC___233 = {0,"DELETE","TAG \1A40 [ IN \1B40 ] [, \1C40 [ IN \1D40 ] ]",

View File

@@ -1095,7 +1095,10 @@ HB_FUNC( DBAPPEND )
{
bUnLockAll = ISLOG( 1 ) ? hb_parl( 1 ) : TRUE;
s_bNetError = FALSE;
SELF_APPEND( ( AREAP ) s_pCurrArea->pArea, bUnLockAll );
if( SELF_APPEND( ( AREAP ) s_pCurrArea->pArea, bUnLockAll ) == FAILURE )
{
s_bNetError = TRUE; /* Temp fix! What about other types of errors? */
}
}
else
hb_errRT_DBCMD( EG_NOTABLE, EDBCMD_NOTABLE, NULL, "DBAPPEND" );
@@ -1843,6 +1846,7 @@ HB_FUNC( DBTABLEEXT )
HB_FUNC( DBUNLOCK )
{
if( s_pCurrArea )
SELF_UNLOCK( ( AREAP ) s_pCurrArea->pArea, 0 );
else
@@ -2295,10 +2299,11 @@ HB_FUNC( ORDCONDSET )
lpdbOrdCondInfo->lRecno = hb_parnl( 9 );
lpdbOrdCondInfo->fRest = hb_parl( 10 );
lpdbOrdCondInfo->fDescending = hb_parl( 11 );
lpdbOrdCondInfo->fAdditive = hb_parl( 12 );
lpdbOrdCondInfo->fUseCurrent = hb_parl( 13 );
lpdbOrdCondInfo->fCustom = hb_parl( 14 );
lpdbOrdCondInfo->fNoOptimize = hb_parl( 15 );
/* 12th parameter is always nil */
lpdbOrdCondInfo->fAdditive = hb_parl( 13 );
lpdbOrdCondInfo->fUseCurrent = hb_parl( 14 );
lpdbOrdCondInfo->fCustom = hb_parl( 15 );
lpdbOrdCondInfo->fNoOptimize = hb_parl( 16 );
if( !lpdbOrdCondInfo->itmCobWhile )
lpdbOrdCondInfo->fRest = TRUE;