campo-sirio/cb/source/d4flush.c
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

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 */