/* c4trans.h   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */

#ifndef S4OFF_TRAN
   #define TRAN4ENTRY_LEN unsigned long
#endif  /* S4OFF_TRAN */

#ifdef S4SERVER
   #ifndef S4OFF_TRAN
      #ifndef S4OFF_WRITE
         #define S4TRAN_DEFINED
         #ifdef S4INLINE
            #define code4tranStart( c4 )        ( tran4lowStart( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 0 ) )
            #define code4tranStartSingle( c4 )  ( tran4lowStart( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 0 ) )
            #define code4tranCommit( c4 )       ( tran4lowCommit( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 1, 1 ) )
            #define code4tranCommitSingle( c4 )  ( tran4lowCommit( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 1, 0 ) )
            #define code4tranRollback( c4 )     ( tran4lowRollback( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 1 ) )
            #define code4tranRollbackSingle( c4 )     ( tran4lowRollback( &((c4)->currentClient->trans), connection4id( (c4)->currentClient->connection ), 0 ) )
            #define code4tranStatus( c4 ) ( (c4)->currentClient->trans.currentTranStatus )
            #define code4tranStatusSet( c4, val ) ( (c4)->currentClient->trans.currentTranStatus = (val) )
         #else
            int S4FUNCTION code4tranCommit( CODE4 S4PTR * ) ;
            int S4FUNCTION code4tranStart( CODE4 S4PTR * ) ;
            int S4FUNCTION code4tranStartSingle( CODE4 S4PTR * ) ;
            int S4FUNCTION code4tranRollback( CODE4 S4PTR * ) ;
            int S4FUNCTION code4tranStatus( CODE4 * ) ;
            int S4FUNCTION code4tranStatusSet( CODE4 *, const int val ) ;
         #endif
      #endif
   #endif
   #ifdef S4TRAN_DEFINED
      #undef S4TRAN_DEFINED
   #else
      #define code4tranCommit( c4 ) ( 0 )
      #define code4tranStart( c4 ) ( 0 )
      #define code4tranRollback( c4 ) ( 0 )
      #define code4tranStatus( c4 ) ( r4inactive )
   #endif
#else
   #ifdef __cplusplus
      extern "C" {
   #endif
   /* exported for utilities */
   int S4FUNCTION code4tranInit( CODE4 S4PTR * ) ;
   S4EXPORT int S4FUNCTION code4tranCommit( CODE4 S4PTR * ) ;
   S4EXPORT int S4FUNCTION code4tranStart( CODE4 S4PTR * ) ;
   S4EXPORT int S4FUNCTION code4tranRollback( CODE4 S4PTR * ) ;
   #ifdef S4OFF_TRAN
      #ifdef S4CLIENT
         #define code4tranStatus( c4 ) ( (c4)->c4trans.trans.currentTranStatus )
      #else
         #define code4tranStatus( c4 ) ( 0 )
      #endif
   #else
      #ifndef S4OFF_WRITE
         int S4FUNCTION code4tranStartSingle( CODE4 S4PTR * ) ;
         #ifdef S4INLINE
            #define code4tranStatus( c4 ) ( (c4)->c4trans.trans.currentTranStatus )
            #define code4tranStatusSet( c4, val ) ( (c4)->c4trans.trans.currentTranStatus = (val) )
         #else
            S4EXPORT int S4FUNCTION code4tranStatusSet( CODE4 *, const int val ) ;
         #endif
      #endif
   #endif
   #ifndef S4INLINE
      #ifdef S4CLIENT
         int code4tranInit2( CODE4 *, const char *, const char * ) ;
         void code4tranInitUndo( CODE4 * ) ;
      #endif
   #endif
   #ifdef S4STAND_ALONE
      S4EXPORT int S4FUNCTION code4tranInit2( CODE4 S4PTR *, const char S4PTR *, const char S4PTR * ) ;
      void code4tranInitUndo( CODE4 * ) ;
   #endif
   #ifdef __cplusplus
      }
   #endif
#endif  /* S4SERVER */

#ifndef S4OFF_WRITE
   #ifndef S4CLIENT
      #ifndef S4OFF_TRAN
         /* #define TRAN4CREATE    1  Not supported*/
         #define TRAN4OPEN      1
         #define TRAN4OPEN_TEMP 2
         #define TRAN4CLOSE     3
         #define TRAN4START     4
         /* #define TRAN4COMMIT    5  Not supported*/
         #define TRAN4COMPLETE  6
         #define TRAN4ROLLBACK  7
         #define TRAN4WRITE     8
         #define TRAN4APPEND    9
         #define TRAN4VOID     10
         /* #define TRAN4CREATE_TEMP    11  Not Supported*/
         #define TRAN4PACK     12
         #define TRAN4ZAP      13
         #define TRAN4INIT     15
         #define TRAN4SHUTDOWN 16
         #define TRAN4BACKEDUP 17
         #define TRAN4INIT_UNDO 18

         #define E4_LOG_IFS "Log File - invalid file status"
         #define TRAN4FORWARDS  1
         #define TRAN4BACKWARDS 2
         #define TRAN4LOCK_BASE      1000000000
         #define TRAN4LOCK_SERVER    TRAN4LOCK_BASE+0
         #define TRAN4LOCK_MULTIPLE  TRAN4LOCK_BASE+1
         #define TRAN4LOCK_BACKUP    TRAN4LOCK_BASE+2
         #define TRAN4LOCK_RESTORE   TRAN4LOCK_BASE+3
         #define TRAN4LOCK_FIX       TRAN4LOCK_BASE+4
         #define TRAN4VERSION_NUM 1

         #ifdef S4STAND_ALONE
            #define TRAN4LOCK_USERS     TRAN4LOCK_BASE+1000
            #define TRAN4MAX_USERS      1000
         #endif
      #endif  /* S4OFF_TRAN */
   #endif  /* not S4CLIENT */

   #ifdef __cplusplus
      extern "C" {
   #endif
   #ifndef S4OFF_TRAN
      #ifndef S4CLIENT
         int  tran4fileCreate( TRAN4FILE *, const char * ) ;
         int  tran4active( CODE4 *, DATA4 * ) ;
         int  tran4addUser( TRAN4 *, const long, const char *, const unsigned short int ) ;
         /* log file examination functionality */
         int  S4FUNCTION tran4fileAppend( TRAN4FILE S4PTR *, LOG4HEADER S4PTR *, void S4PTR * ) ;  /* a null pointer means use internal value */
         int  S4FUNCTION tran4fileBottom( TRAN4FILE S4PTR *, TRAN4 S4PTR * ) ;
         int  S4FUNCTION tran4fileSkip( TRAN4FILE S4PTR *, TRAN4 S4PTR *, const int ) ;
         int  S4FUNCTION tran4fileTop( TRAN4FILE S4PTR *, TRAN4 S4PTR * ) ;
         int  code4tranInitUndoLow( TRAN4 *, const long ) ;
         int  S4FUNCTION tran4set(  TRAN4 S4PTR *, const int, const long, const long, const int, const unsigned int, const long, const long ) ;
         int  S4FUNCTION tran4putData(  TRAN4 S4PTR *, void *, unsigned ) ;
         /* log file examination functionality */
         #ifndef S4INLINE
            int  S4FUNCTION tran4bottom( TRAN4 S4PTR * ) ;
            unsigned long S4FUNCTION tran4clientDataId( TRAN4 S4PTR * ) ;
            long S4FUNCTION tran4clientId( TRAN4 S4PTR * ) ;
            long S4FUNCTION tran4id( TRAN4 S4PTR * ) ;
            unsigned S4FUNCTION tran4len( TRAN4 S4PTR * ) ;
            unsigned long S4FUNCTION tran4serverDataId( TRAN4 S4PTR * ) ;
            int  S4FUNCTION tran4skip( TRAN4 S4PTR *, int ) ;
            int  S4FUNCTION tran4top( TRAN4 S4PTR * ) ;
            int  S4FUNCTION tran4type( TRAN4 S4PTR * ) ;
         #endif
         void * S4FUNCTION tran4getData( TRAN4 S4PTR *, const long pos  ) ;
      #endif  /* not S4CLIENT */
   #endif  /* S4OFF_TRAN */

   #ifndef S4OFF_TRAN
      #ifndef S4CLIENT
         #ifdef S4DISTRIBUTED
            int tran4lowComplete( TRAN4 *, long ) ;
         #endif
         S4EXPORT int S4FUNCTION tran4lowAppend( TRAN4 *, void * ) ;
         S4EXPORT int S4FUNCTION tran4lowCommit( TRAN4 *, long, unsigned short int, int ) ;
         S4EXPORT int S4FUNCTION tran4lowRollback( TRAN4 *, long, const int ) ;
         S4EXPORT int S4FUNCTION tran4lowStart( TRAN4 *, long, int ) ;
         int tran4lowUnappend( TRAN4 * ) ;
         int tran4lowUnwrite( TRAN4 * ) ;
      #endif  /* S4CLIENT */
   #endif  /* S4OFF_TRAN */
   #ifdef __cplusplus
      }
   #endif

#endif /* S4OFF_WRITE */

#ifndef S4CLIENT
   int tran4closeAll( struct TRAN4St * ) ;
   #ifndef S4SINGLE
      #ifdef S4SERVER
         int tran4lock( TRAN4 * ) ;
      #endif
      int  S4FUNCTION code4tranLockTransactions( CODE4TRANS S4PTR *, long ) ;
      int  S4FUNCTION code4tranUnlockTransactions( CODE4TRANS S4PTR *, long ) ;
   #endif  /* S4SINGLE */
#endif  /* S4CLIENT */
DATA4 *tran4data( struct TRAN4St *, const long, const long ) ;
DATA4 *tran4dataName( struct TRAN4St *, const char *, const long, const int ) ;

#ifdef E4ANALYZE
   int  tran4verify( TRAN4 *, int ) ;
#endif  /* E4ANALYZE */

int  code4tranInitLow( TRAN4 *, CODE4TRANS * ) ;
int  code4transInit( CODE4TRANS *, CODE4 * ) ;
int  S4FUNCTION code4transInitUndo( CODE4TRANS S4PTR * ) ;