af15e0698b
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
404 lines
8.7 KiB
C
Executable File
404 lines
8.7 KiB
C
Executable File
/* d4flush.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_WRITE
|
|
int S4FUNCTION d4changed( DATA4 *data, int flag )
|
|
{
|
|
int previous ;
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E94101 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E94101 ) ;
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
#ifndef S4OFF_ENFORCE_LOCK
|
|
if ( flag > 0 )
|
|
if ( data->codeBase->lockEnforce && data->recNum > 0L )
|
|
if ( d4lockTest( data, data->recNum ) != 1 )
|
|
return error4( data->codeBase, e4lock, E94101 ) ;
|
|
#endif
|
|
#endif
|
|
|
|
previous = data->recordChanged ;
|
|
|
|
if ( flag >= 0 )
|
|
data->recordChanged = ( flag > 0 ) ;
|
|
return previous ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef S4SERVER
|
|
int S4FUNCTION d4flush( DATA4 *data )
|
|
{
|
|
#ifdef S4OFF_WRITE
|
|
return 0 ;
|
|
#else
|
|
#ifndef S4CLIENT
|
|
int rc, saveRc ;
|
|
#endif
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E94102 ) ;
|
|
#endif
|
|
|
|
#ifdef S4CLIENT
|
|
return d4update( data );
|
|
#else
|
|
saveRc = d4flushData( data ) ;
|
|
rc = dfile4flushIndex( data->dataFile ) ;
|
|
if ( rc < 0 )
|
|
saveRc = rc ;
|
|
|
|
return saveRc ;
|
|
#endif
|
|
#endif /* S4OFF_WRITE */
|
|
}
|
|
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int d4flushData( DATA4 *data )
|
|
{
|
|
#ifdef S4OFF_WRITE
|
|
return 0 ;
|
|
#else
|
|
#ifndef S4CLIENT
|
|
int rc, saveRc ;
|
|
#endif
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm, E94105 ) ;
|
|
#endif
|
|
|
|
#ifdef S4CLIENT
|
|
return d4flush( data ) ;
|
|
#else
|
|
saveRc = d4updateRecord( data, 0 ) ; /* returns -1 if error4code( codeBase ) < 0 */
|
|
rc = dfile4flushData( data->dataFile ) ;
|
|
if ( rc < 0 )
|
|
saveRc = rc ;
|
|
return saveRc ;
|
|
#endif
|
|
#endif
|
|
}
|
|
#endif /* S4SERVER */
|
|
|
|
#ifndef S4CLIENT
|
|
int dfile4flush( DATA4FILE *data )
|
|
{
|
|
int rc, saveRc ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E91102 ) ;
|
|
#endif
|
|
|
|
saveRc = dfile4flushData( data ) ;
|
|
rc = dfile4flushIndex( data ) ;
|
|
if ( rc < 0 )
|
|
saveRc = rc ;
|
|
|
|
return saveRc ;
|
|
}
|
|
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int dfile4flushIndex( DATA4FILE *data )
|
|
{
|
|
#ifdef S4OFF_WRITE
|
|
return 0 ;
|
|
#else
|
|
int rc ;
|
|
#ifndef S4INDEX_OFF
|
|
#ifndef N4OTHER
|
|
INDEX4FILE *indexOn ;
|
|
#else
|
|
TAG4FILE *tagOn ;
|
|
#endif
|
|
#endif
|
|
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm, E91102 ) ;
|
|
|
|
rc = 0 ;
|
|
|
|
#ifndef S4INDEX_OFF
|
|
#ifndef N4OTHER
|
|
indexOn = (INDEX4FILE *)l4first( &data->indexes ) ;
|
|
if ( indexOn )
|
|
do
|
|
{
|
|
if ( index4flush( indexOn ) )
|
|
rc = -1 ;
|
|
indexOn = (INDEX4FILE *)l4next( &data->indexes, indexOn ) ;
|
|
} while ( indexOn != 0 ) ;
|
|
#else
|
|
for( tagOn = 0 ;; )
|
|
{
|
|
tagOn = dfile4tagNext( data, tagOn ) ;
|
|
if ( !tagOn )
|
|
break ;
|
|
if ( tfile4flush( tagOn ) )
|
|
rc = - 1 ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
return rc ;
|
|
#endif
|
|
}
|
|
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int dfile4flushData( DATA4FILE *data )
|
|
{
|
|
#ifdef S4OFF_WRITE
|
|
return 0 ;
|
|
#else
|
|
int rc ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm, E91102 ) ;
|
|
#endif
|
|
|
|
rc = file4flush( &data->file ) ;
|
|
#ifndef S4OFF_MEMO
|
|
if ( data->memoFile.file.hand != -1 )
|
|
return file4flush( &data->memoFile.file ) ;
|
|
#endif
|
|
return rc ;
|
|
#endif
|
|
}
|
|
#endif /* S4CLIENT */
|
|
|
|
#ifndef S4SERVER
|
|
#ifdef P4ARGS_USED
|
|
#pragma argsused
|
|
#endif
|
|
int S4FUNCTION code4flush( CODE4 *c4 )
|
|
{
|
|
#ifdef S4OFF_WRITE
|
|
return 0 ;
|
|
#else
|
|
DATA4 *dataOn ;
|
|
int rc, rcReturn ;
|
|
LIST4 *list ;
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( c4, 1, E94107 ) )
|
|
return -1;
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( c4 == 0 )
|
|
return error4( 0, e4parm, E94107 ) ;
|
|
#endif
|
|
|
|
rcReturn = 0 ;
|
|
|
|
list = tran4dataList( (&(c4->c4trans.trans)) ) ;
|
|
dataOn = (DATA4 *)l4first( list ) ;
|
|
while ( dataOn )
|
|
{
|
|
rc = d4flush( dataOn ) ; /* returns -1 if error4code( codeBase ) < 0 */
|
|
if ( rc )
|
|
rcReturn = rc ;
|
|
dataOn = (DATA4 *)l4next( list, dataOn) ;
|
|
}
|
|
|
|
return rcReturn ;
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#ifndef S4OFF_WRITE
|
|
|
|
#ifndef S4CLIENT
|
|
#ifndef S4INDEX_OFF
|
|
int dfile4updateIndexes( DATA4FILE *data )
|
|
{
|
|
#ifdef S4FOX
|
|
INDEX4FILE *indexOn ;
|
|
#else
|
|
TAG4FILE *tagOn ;
|
|
#endif
|
|
int rc ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm_null, E91102 ) ;
|
|
#endif
|
|
|
|
rc = 0 ;
|
|
|
|
#ifdef S4FOX
|
|
indexOn = (INDEX4FILE *)l4first( &data->indexes ) ;
|
|
if ( indexOn )
|
|
do
|
|
{
|
|
if ( index4update( indexOn ) < 0 )
|
|
rc = -1 ;
|
|
indexOn = (INDEX4FILE *)l4next( &data->indexes, indexOn ) ;
|
|
} while ( indexOn != 0 ) ;
|
|
#else
|
|
for( tagOn = 0 ;; )
|
|
{
|
|
tagOn = dfile4tagNext( data, tagOn ) ;
|
|
if ( !tagOn )
|
|
break ;
|
|
if ( tfile4update(tagOn) < 0 )
|
|
rc = -1 ;
|
|
}
|
|
#endif
|
|
|
|
return rc ;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
int d4update( DATA4 *data )
|
|
{
|
|
int rc ;
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E94109 ) )
|
|
return -1 ;
|
|
#endif
|
|
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm, E94109 ) ;
|
|
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return -1 ;
|
|
|
|
rc = d4updateRecord( data, 0 ) ;
|
|
|
|
#ifndef S4CLIENT
|
|
if ( rc == 0 )
|
|
if ( data->dataFile->fileChanged ) /* if the header is outdated */
|
|
#ifndef S4SINGLE
|
|
if ( d4lockTestAppend( data ) == 1 ) /* if we have changed the record count */
|
|
#endif
|
|
rc = dfile4updateHeader( data->dataFile, 1, 1 ) ;
|
|
#ifndef S4INDEX_OFF
|
|
if ( rc == 0 )
|
|
dfile4updateIndexes( data->dataFile ) ;
|
|
#endif
|
|
#endif
|
|
|
|
return rc ;
|
|
}
|
|
|
|
int d4updateRecord( DATA4 *data, const int doUnlock )
|
|
{
|
|
int rc ;
|
|
#ifndef S4SINGLE
|
|
int explicitUnlock ;
|
|
#endif
|
|
#ifndef S4OFF_MEMO
|
|
int i ;
|
|
#endif
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E94110 ) )
|
|
return -1 ;
|
|
#endif
|
|
|
|
#ifdef E4PARM_HIGH
|
|
if ( data == 0 )
|
|
return error4( 0, e4parm, E94110 ) ;
|
|
#endif
|
|
|
|
#ifdef E4ANALYZE
|
|
if ( data->codeBase == 0 )
|
|
return error4describe( 0, e4struct, E94110, data->alias, 0, 0 ) ;
|
|
#endif
|
|
|
|
if ( error4code( data->codeBase ) < 0 )
|
|
return e4codeBase ;
|
|
|
|
if ( data->recNum <= 0 || data->eofFlag )
|
|
{
|
|
#ifndef S4OFF_MEMO
|
|
if ( data->fieldsMemo != 0 )
|
|
for ( i = 0; i < data->dataFile->nFieldsMemo; i++ )
|
|
f4memoReset( data->fieldsMemo[i].field ) ;
|
|
#endif
|
|
data->recordChanged = 0 ;
|
|
return 0 ;
|
|
}
|
|
|
|
if ( data->recordChanged )
|
|
{
|
|
rc = d4writeLow( data, data->recNum, doUnlock ) ;
|
|
if ( rc )
|
|
return rc ;
|
|
#ifndef S4SINGLE
|
|
explicitUnlock = 0 ;
|
|
#endif
|
|
|
|
#ifndef S4OFF_MEMO
|
|
for ( i = 0; i < data->dataFile->nFieldsMemo; i++ )
|
|
f4memoReset( data->fieldsMemo[i].field ) ;
|
|
#endif
|
|
data->recNumOld = -1 ;
|
|
}
|
|
else
|
|
{
|
|
#ifndef S4SINGLE
|
|
explicitUnlock = doUnlock ;
|
|
#endif
|
|
#ifndef S4OFF_MEMO
|
|
for ( i = 0; i < data->dataFile->nFieldsMemo; i++ )
|
|
data->fieldsMemo[i].status = 1 ;
|
|
#endif
|
|
}
|
|
|
|
#ifndef S4SINGLE
|
|
if ( explicitUnlock ) /* unlock records (unless entire file is locked)... */
|
|
{
|
|
if ( code4unlockAuto( data->codeBase ) != 0 )
|
|
{
|
|
#ifdef S4SERVER
|
|
if ( dfile4lockTestFile( data->dataFile, data4clientId( data ), data4serverId( data ) ) == 0 )
|
|
#else
|
|
#ifndef S4OFF_TRAN
|
|
if ( code4transEnabled( data->codeBase ) )
|
|
if ( code4tranStatus( data->codeBase ) == r4active )
|
|
return 0 ;
|
|
#endif
|
|
if ( d4lockTestFile( data ) == 0 )
|
|
#endif
|
|
{
|
|
rc = d4unlock( data ) ;
|
|
if ( rc == r4active ) /* just a transactional notification */
|
|
return 0 ;
|
|
return rc ;
|
|
}
|
|
}
|
|
}
|
|
#endif /* S4SINGLE */
|
|
|
|
return 0 ;
|
|
}
|
|
#endif /* S4OFF_WRITE */
|