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