From f15ee39b9997b14a8f95a270d14552bfe6df7597 Mon Sep 17 00:00:00 2001 From: Bruno Cantero Date: Sun, 10 Oct 1999 21:44:26 +0000 Subject: [PATCH] ChangeLogTag:19991010-23:30 GMT+1 Bruno Cantero --- harbour/ChangeLog | 16 ++ harbour/source/rdd/dbcmd.c | 249 ++++++++++++++++++++--------- harbour/source/rdd/dbf1.c | 26 ++- harbour/source/rdd/dbfcdx/Makefile | 15 ++ harbour/tests/testdbf.prg | 59 +++++-- 5 files changed, 260 insertions(+), 105 deletions(-) create mode 100644 harbour/source/rdd/dbfcdx/Makefile diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8eb178403e..36c8b214ae 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,19 @@ +19991010-23:30 GMT+1 Bruno Cantero + + + source/rdd/dbcmd.c + + source/rdd/dbf1.c + + Added support for SET DELETED. + * Changed default extension from .DBF and .DBT to .dbf and .dbt + + * source/rdd/dbfcdx/dbfcdx1.c + * Changed default extension from .FPT to .fpt + + * tests/testdbf.prg + * Now test SET DELETED command too. + + + source/rdd/dbfcdx/Makefile + + Added missing file. + 19991010-15:05 GMT+1 Victor Szel * source/rtl/filesys.c + ISDISK() undocumented Clipper 5.3 function added. diff --git a/harbour/source/rdd/dbcmd.c b/harbour/source/rdd/dbcmd.c index 63083c6da4..de2f864561 100644 --- a/harbour/source/rdd/dbcmd.c +++ b/harbour/source/rdd/dbcmd.c @@ -138,7 +138,7 @@ static LPAREANODE pCurrArea = NULL; /* Pointer to a selectd and valid area */ * -- BASIC RDD METHODS -- */ -static ERRCODE AddField( AREAP pArea, LPDBFIELDINFO pFieldInfo ) +static ERRCODE defAddField( AREAP pArea, LPDBFIELDINFO pFieldInfo ) { LPFIELD pField; @@ -166,7 +166,7 @@ static ERRCODE AddField( AREAP pArea, LPDBFIELDINFO pFieldInfo ) return SUCCESS; } -static ERRCODE Alias( AREAP pArea, BYTE * szAlias ) +static ERRCODE defAlias( AREAP pArea, BYTE * szAlias ) { strncpy( ( char * ) szAlias, ( ( PHB_DYNS ) pArea->atomAlias )->pSymbol->szName, @@ -174,20 +174,20 @@ static ERRCODE Alias( AREAP pArea, BYTE * szAlias ) return SUCCESS; } -static ERRCODE Bof( AREAP pArea, BOOL * pBof ) +static ERRCODE defBof( AREAP pArea, BOOL * pBof ) { * pBof = pArea->fBof; return SUCCESS; } -static ERRCODE Close( AREAP pArea ) +static ERRCODE defClose( AREAP pArea ) { ( ( PHB_DYNS ) pArea->atomAlias )->hArea = 0; return SUCCESS; } -static ERRCODE CreateFields( AREAP pArea, PHB_ITEM pStruct ) +static ERRCODE defCreateFields( AREAP pArea, PHB_ITEM pStruct ) { USHORT uiCount; PHB_ITEM pFieldDesc; @@ -208,13 +208,13 @@ static ERRCODE CreateFields( AREAP pArea, PHB_ITEM pStruct ) return SUCCESS; } -static ERRCODE Eof( AREAP pArea, BOOL * pEof ) +static ERRCODE defEof( AREAP pArea, BOOL * pEof ) { * pEof = pArea->fEof; return SUCCESS; } -static ERRCODE Error( AREAP pArea, PHB_ITEM pError ) +static ERRCODE defError( AREAP pArea, PHB_ITEM pError ) { char * szRddName; @@ -226,13 +226,13 @@ static ERRCODE Error( AREAP pArea, PHB_ITEM pError ) return hb_errLaunch( pError ); } -static ERRCODE FieldCount( AREAP pArea, USHORT * uiFields ) +static ERRCODE defFieldCount( AREAP pArea, USHORT * uiFields ) { * uiFields = pArea->uiFieldCount; return SUCCESS; } -static ERRCODE FieldInfo( AREAP pArea, USHORT uiIndex, USHORT uiType, PHB_ITEM pItem ) +static ERRCODE defFieldInfo( AREAP pArea, USHORT uiIndex, USHORT uiType, PHB_ITEM pItem ) { LPFIELD pField; char szType[ 2 ]; @@ -269,7 +269,7 @@ static ERRCODE FieldInfo( AREAP pArea, USHORT uiIndex, USHORT uiType, PHB_ITEM p } -static ERRCODE FieldName( AREAP pArea, USHORT uiIndex, void * szName ) +static ERRCODE defFieldName( AREAP pArea, USHORT uiIndex, void * szName ) { LPFIELD pField; @@ -282,29 +282,30 @@ static ERRCODE FieldName( AREAP pArea, USHORT uiIndex, void * szName ) return SUCCESS; } -static ERRCODE Found( AREAP pArea, BOOL * pFound ) +static ERRCODE defFound( AREAP pArea, BOOL * pFound ) { * pFound = pArea->fFound; return SUCCESS; } -static ERRCODE GetRec( AREAP pArea, BYTE ** pBuffer ) +static ERRCODE defGetRec( AREAP pArea, BYTE ** pBuffer ) { * pBuffer = pArea->lpExtendInfo->bRecord; return SUCCESS; } -static ERRCODE NewArea( AREAP pArea ) +static ERRCODE defNewArea( AREAP pArea ) { pArea->lpFileInfo = ( LPFILEINFO ) hb_xgrab( sizeof( FILEINFO ) ); memset( pArea->lpFileInfo, 0, sizeof( FILEINFO ) ); pArea->lpFileInfo->hFile = FS_ERROR; pArea->lpExtendInfo = ( LPDBEXTENDINFO ) hb_xgrab( sizeof( DBEXTENDINFO ) ); memset( pArea->lpExtendInfo, 0, sizeof( DBEXTENDINFO ) ); + pArea->dbsi.fIgnoreFilter = TRUE; return SUCCESS; } -static ERRCODE Open( AREAP pArea, LPDBOPENINFO pOpenInfo ) +static ERRCODE defOpen( AREAP pArea, LPDBOPENINFO pOpenInfo ) { pArea->atomAlias = hb_dynsymGet( ( char * ) pOpenInfo->atomAlias ); if( ( ( PHB_DYNS ) pArea->atomAlias )->hArea ) @@ -320,7 +321,7 @@ static ERRCODE Open( AREAP pArea, LPDBOPENINFO pOpenInfo ) return SUCCESS; } -static ERRCODE Release( AREAP pArea ) +static ERRCODE defRelease( AREAP pArea ) { LPFILEINFO pFileInfo; @@ -344,7 +345,7 @@ static ERRCODE Release( AREAP pArea ) return SUCCESS; } -static ERRCODE SetFieldExtent( AREAP pArea, USHORT uiFieldExtent ) +static ERRCODE defSetFieldExtent( AREAP pArea, USHORT uiFieldExtent ) { pArea->uiFieldExtent = uiFieldExtent; pArea->lpFields = ( LPFIELD ) hb_xgrab( uiFieldExtent * sizeof( FIELD ) ); @@ -352,15 +353,106 @@ static ERRCODE SetFieldExtent( AREAP pArea, USHORT uiFieldExtent ) return SUCCESS; } -static ERRCODE Skip( AREAP pArea, LONG lToSkip ) +static ERRCODE defSkip( AREAP pArea, LONG lToSkip ) { - if( pArea->dbfi.fFilter ) - return SELF_SKIPFILTER( pArea, lToSkip ); - else - return SELF_SKIPRAW( pArea, lToSkip ); + BOOL bExit; + + if( pArea->dbfi.fFilter || !pArea->dbsi.fIgnoreFilter || !hb_set.HB_SET_DELETED ) + { + if( lToSkip > 0 ) + { + while( lToSkip > 0 ) + { + SELF_SKIPRAW( pArea, 1 ); + SELF_SKIPFILTER( pArea, 1 ); + + SELF_EOF( pArea, &bExit ); + if( bExit ) + return SUCCESS; + + lToSkip--; + } + } + else if( lToSkip < 0 ) + { + while( lToSkip < 0 ) + { + SELF_SKIPRAW( pArea, -1 ); + SELF_SKIPFILTER( pArea, -1 ); + + SELF_BOF( pArea, &bExit ); + if( bExit ) + return SELF_SKIPFILTER( pArea, 1 ); + + lToSkip++; + } + } + else + { + SELF_SKIPRAW( pArea, 0 ); + SELF_SKIPFILTER( pArea, 1 ); + + SELF_EOF( pArea, &bExit ); + if( bExit ) + return SUCCESS; + } + } + return SELF_SKIPRAW( pArea, lToSkip ); } -static ERRCODE StructSize( AREAP pArea, USHORT * uiSize ) +static ERRCODE defSkipFilter( AREAP pArea, LONG lUpDown ) +{ + BOOL bExit, bDeleted; + + if( lUpDown > 0 ) + { + do + { + SELF_EOF( pArea, &bExit ); + if( bExit ) + return SUCCESS; + + if( !hb_set.HB_SET_DELETED ) /* Skip if deleted */ + { + SELF_DELETED( pArea, &bDeleted ); + if( !bDeleted ) + return SUCCESS; + + SELF_SKIPRAW( pArea, 1 ); + } + else + return SUCCESS; + } while( 1 ); + } + else if( lUpDown < 0 ) + { + do + { + SELF_BOF( pArea, &bExit ); + if( bExit ) + return SELF_SKIPFILTER( pArea, 1 ); + + if( !hb_set.HB_SET_DELETED ) /* Skip if deleted */ + { + SELF_DELETED( pArea, &bDeleted ); + if( !bDeleted ) + return SUCCESS; + + SELF_SKIPRAW( pArea, -1 ); + } + else + return SUCCESS; + } while( 1 ); + } + return SUCCESS; +} + +static ERRCODE defSkipRaw( AREAP pArea, LONG lToSkip ) +{ + return SELF_GOTO( pArea, pArea->lpExtendInfo->lRecNo + lToSkip ); +} + +static ERRCODE defStructSize( AREAP pArea, USHORT * uiSize ) { HB_SYMBOL_UNUSED( pArea ); HB_SYMBOL_UNUSED( uiSize ); @@ -368,7 +460,7 @@ static ERRCODE StructSize( AREAP pArea, USHORT * uiSize ) return SUCCESS; } -static ERRCODE SysName( AREAP pArea, BYTE * pBuffer ) +static ERRCODE defSysName( AREAP pArea, BYTE * pBuffer ) { USHORT uiCount; LPRDDNODE pRddNode; @@ -380,7 +472,7 @@ static ERRCODE SysName( AREAP pArea, BYTE * pBuffer ) return SUCCESS; } -static ERRCODE UnSupported( AREAP pArea ) +static ERRCODE defUnSupported( AREAP pArea ) { PHB_ITEM pError; @@ -394,59 +486,59 @@ static ERRCODE UnSupported( AREAP pArea ) return FAILURE; } -static RDDFUNCS defTable = { Bof, - Eof, - Found, - UnSupported, - ( DBENTRYP_UL ) UnSupported, - ( DBENTRYP_I ) UnSupported, - UnSupported, - Skip, - ( DBENTRYP_L ) UnSupported, - ( DBENTRYP_L ) UnSupported, - AddField, - ( DBENTRYP_B ) UnSupported, - CreateFields, - UnSupported, - ( DBENTRYP_BP ) UnSupported, - FieldCount, - ( DBENTRYP_VF ) UnSupported, - FieldInfo, - FieldName, - UnSupported, - GetRec, - ( DBENTRYP_SI ) UnSupported, - ( DBENTRYP_SVL ) UnSupported, - UnSupported, - UnSupported, - ( DBENTRYP_P ) UnSupported, - ( DBENTRYP_SI ) UnSupported, - UnSupported, - ( DBENTRYP_ULP ) UnSupported, - ( DBENTRYP_ISI ) UnSupported, - ( DBENTRYP_I ) UnSupported, - SetFieldExtent, - Alias, - Close, - ( DBENTRYP_VP ) UnSupported, - ( DBENTRYP_SI ) UnSupported, - NewArea, - Open, - Release, - StructSize, - SysName, - Error, - ( DBENTRYP_VSP ) UnSupported, - ( DBENTRYP_VL ) UnSupported, - ( DBENTRYP_UL ) UnSupported, - UnSupported, - ( DBENTRYP_VP ) UnSupported, - ( DBENTRYP_SVP ) UnSupported, - ( DBENTRYP_VP ) UnSupported, - ( DBENTRYP_SVP ) UnSupported, - UnSupported, - UnSupported, - ( DBENTRYP_SVP ) UnSupported +static RDDFUNCS defTable = { defBof, + defEof, + defFound, + defUnSupported, + ( DBENTRYP_UL ) defUnSupported, + ( DBENTRYP_I ) defUnSupported, + defUnSupported, + defSkip, + defSkipFilter, + defSkipRaw, + defAddField, + ( DBENTRYP_B ) defUnSupported, + defCreateFields, + defUnSupported, + ( DBENTRYP_BP ) defUnSupported, + defFieldCount, + ( DBENTRYP_VF ) defUnSupported, + defFieldInfo, + defFieldName, + defUnSupported, + defGetRec, + ( DBENTRYP_SI ) defUnSupported, + ( DBENTRYP_SVL ) defUnSupported, + defUnSupported, + defUnSupported, + ( DBENTRYP_P ) defUnSupported, + ( DBENTRYP_SI ) defUnSupported, + defUnSupported, + ( DBENTRYP_ULP ) defUnSupported, + ( DBENTRYP_ISI ) defUnSupported, + ( DBENTRYP_I ) defUnSupported, + defSetFieldExtent, + defAlias, + defClose, + ( DBENTRYP_VP ) defUnSupported, + ( DBENTRYP_SI ) defUnSupported, + defNewArea, + defOpen, + defRelease, + defStructSize, + defSysName, + defError, + ( DBENTRYP_VSP ) defUnSupported, + ( DBENTRYP_VL ) defUnSupported, + ( DBENTRYP_UL ) defUnSupported, + defUnSupported, + ( DBENTRYP_VP ) defUnSupported, + ( DBENTRYP_SVP ) defUnSupported, + ( DBENTRYP_VP ) defUnSupported, + ( DBENTRYP_SVP ) defUnSupported, + defUnSupported, + defUnSupported, + ( DBENTRYP_SVP ) defUnSupported }; @@ -1261,7 +1353,7 @@ HARBOUR HB_DBGOTO( void ) if( !pCurrArea ) { - hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "DBGOTOP" ); + hb_errRT_DBCMD( EG_NOTABLE, 2001, NULL, "DBGOTO" ); return; } @@ -1394,7 +1486,6 @@ HARBOUR HB_DBSKIP( void ) { if( ISNUM( 1 ) ) lToSkip = hb_parnl( 1 ); - SELF_SKIP( ( AREAP ) pCurrArea->pArea, lToSkip ); } else diff --git a/harbour/source/rdd/dbf1.c b/harbour/source/rdd/dbf1.c index d986e04fc5..8b40efd7d6 100644 --- a/harbour/source/rdd/dbf1.c +++ b/harbour/source/rdd/dbf1.c @@ -593,6 +593,7 @@ static RDDFUNCS dbfSuper = { 0 }; #define dbfFound NULL #define dbfSkip NULL #define dbfSkipFilter NULL +#define dbfSkipRaw NULL #define dbfCreateFields NULL #define dbfFieldCount NULL #define dbfFieldDisplay NULL @@ -629,6 +630,9 @@ static ERRCODE dbfAppend( AREAP pArea, BOOL bUnLockAll ) ULONG lRecCount, lRecNo; PHB_ITEM pError; + if( SELF_GOCOLD( pArea ) == FAILURE ) + return FAILURE; + if( pArea->lpExtendInfo->fReadOnly ) { pError = hb_errNew(); @@ -947,7 +951,8 @@ static ERRCODE dbfGoBottom( AREAP pArea ) if( SELF_RECCOUNT( pArea, &lRecCount ) == FAILURE ) return FAILURE; - return SELF_GOTO( pArea, lRecCount ); + SELF_GOTO( pArea, lRecCount ); + return SELF_SKIPFILTER( pArea, -1 ); } static ERRCODE dbfGoCold( AREAP pArea ) @@ -1016,6 +1021,7 @@ static ERRCODE dbfGoTo( AREAP pArea, ULONG lRecNo ) pArea->fEof = 1; else pArea->fEof = 0; + pArea->fBof = ( lRecNo == 1 ); } pArea->lpExtendInfo->lRecNo = lRecNo; @@ -1051,7 +1057,8 @@ static ERRCODE dbfGoToId( AREAP pArea, PHB_ITEM pItem ) static ERRCODE dbfGoTop( AREAP pArea ) { - return SELF_GOTO( pArea, 1 ); + SELF_GOTO( pArea, 1 ); + return SELF_SKIPFILTER( pArea, 1 ); } static ERRCODE dbfInfo( AREAP pArea, USHORT uiIndex, PHB_ITEM pItem ) @@ -1600,21 +1607,6 @@ static ERRCODE dbfRelease( AREAP pArea ) return SUPER_RELEASE( pArea ); } -static ERRCODE dbfSkipRaw( AREAP pArea, LONG lToSkip ) -{ - LONG lRecNo = pArea->lpExtendInfo->lRecNo + lToSkip; - - if( lRecNo < 1 ) - { - lRecNo = 1; - pArea->fBof = 1; - } - else - pArea->fBof = 0; - - return SELF_GOTO( pArea, lRecNo ); -} - static ERRCODE dbfUnLock( AREAP pArea, ULONG lRecNo ) { if( lRecNo == 0 ) diff --git a/harbour/source/rdd/dbfcdx/Makefile b/harbour/source/rdd/dbfcdx/Makefile new file mode 100644 index 0000000000..9538e3dd69 --- /dev/null +++ b/harbour/source/rdd/dbfcdx/Makefile @@ -0,0 +1,15 @@ +# +# $Id$ +# + +ROOT = ../../../ + +C_SOURCES=\ + dbfcdx1.c \ + +PRG_SOURCES=\ + dbfcdx0.prg \ + +LIB=dbfcdx + +include $(TOP)$(ROOT)config/lib.cf diff --git a/harbour/tests/testdbf.prg b/harbour/tests/testdbf.prg index a35b8466a7..e9e6cf0a86 100644 --- a/harbour/tests/testdbf.prg +++ b/harbour/tests/testdbf.prg @@ -4,13 +4,13 @@ function main() - local aStruct := { { "CHARACTER", "C", 25, 0 }, ; - { "NUMERIC", "N", 8, 0 }, ; - { "DOUBLE", "N", 8, 2 }, ; - { "DATE", "D", 8, 0 }, ; - { "LOGICAL", "L", 1, 0 }, ; - { "MEMO1", "M", 10, 0 }, ; - { "MEMO2", "M", 10, 0 } } + local nI, aStruct := { { "CHARACTER", "C", 25, 0 }, ; + { "NUMERIC", "N", 8, 0 }, ; + { "DOUBLE", "N", 8, 2 }, ; + { "DATE", "D", 8, 0 }, ; + { "LOGICAL", "L", 1, 0 }, ; + { "MEMO1", "M", 10, 0 }, ; + { "MEMO2", "M", 10, 0 } } REQUEST DBFCDX @@ -19,12 +19,12 @@ function main() ? "[" + MYALIAS->MEMO1 + "]" ? "[" + MYALIAS->MEMO2 + "]" ? "-" - dbAppend() + MYALIAS->( dbAppend() ) MYALIAS->MEMO1 := "Hello world!" MYALIAS->MEMO2 := "Harbour power" ? "[" + MYALIAS->MEMO1 + "]" ? "[" + MYALIAS->MEMO2 + "]" - dbAppend() + MYALIAS->( dbAppend() ) MYALIAS->MEMO1 := "111" MYALIAS->MEMO2 := "222" ? "[" + MYALIAS->MEMO1 + "]" @@ -34,5 +34,46 @@ function main() ? "[" + Str( MYALIAS->DOUBLE ) + "]" ? "[" + Str( MYALIAS->NUMERIC ) + "]" + dbCloseAll() + + ? "" + ? "Press any key..." + InKey( 0 ) + + dbCreate( "testdbf", aStruct, "DBFCDX", .t., "MYALIAS" ) + + for nI := 1 to 10 + MYALIAS->( dbAppend() ) + MYALIAS->NUMERIC := nI + ? "Adding a record", nI + if nI == 3 .or. nI == 7 + MYALIAS->( dbDelete() ) + ? "Deleting record", nI + endif + next + + ? "" + ? "With SET DELETED OFF" + ? "Press any key..." + InKey( 0 ) + + MYALIAS->( dbGoTop() ) + do while !MYALIAS->( Eof() ) + ? MYALIAS->NUMERIC + MYALIAS->( dbSkip() ) + enddo + + SET DELETED ON + ? "" + ? "With SET DELETED ON" + ? "Press any key..." + InKey( 0 ) + + MYALIAS->( dbGoTop() ) + do while !MYALIAS->( Eof() ) + ? MYALIAS->NUMERIC + MYALIAS->( dbSkip() ) + enddo + return nil