332 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* d4extra.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
 | 
						|
#ifndef UNIX
 | 
						|
   #ifdef __TURBOC__
 | 
						|
      #pragma hdrstop
 | 
						|
   #endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef E4ANALYZE
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
int code4verify( CODE4 *c4, int subs )
 | 
						|
{
 | 
						|
   if ( c4 == 0 )
 | 
						|
      return error4( 0, e4parm_null, E93901 ) ;
 | 
						|
 | 
						|
   if ( error4code( c4 ) < 0 )
 | 
						|
      return error4code( c4 ) ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int dfile4verify( DATA4FILE *d4, int subs )
 | 
						|
{
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   if ( d4 == 0 )
 | 
						|
      return error4( 0, e4parm_null, E91102 ) ;
 | 
						|
 | 
						|
   if ( d4->c4 == 0 )
 | 
						|
      return error4( 0, e4struct, E91102 ) ;
 | 
						|
 | 
						|
   if ( subs == 1 )
 | 
						|
      if ( ( rc = code4verify( d4->c4, 1 ) ) < 0 )
 | 
						|
         return rc ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4SINGLE
 | 
						|
#ifndef S4CLIENT
 | 
						|
int lock4verify( LOCK4 *lock, const int subs )
 | 
						|
{
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   if ( lock->data == 0 )
 | 
						|
      return error4( 0, e4parm_null, E93903 ) ;
 | 
						|
 | 
						|
   if ( subs == 1 )
 | 
						|
      if ( ( rc = dfile4verify( lock->data, 1 ) ) < 0 )
 | 
						|
         return rc ;
 | 
						|
 | 
						|
   if ( lock->link.n == 0 || lock->link.p == 0 )
 | 
						|
      return error4( lock->data->c4, e4struct, E93903 ) ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
#endif  /* S4CLIENT */
 | 
						|
#endif  /* S4SINGLE */
 | 
						|
#endif  /* E4ANALYZE */
 | 
						|
 | 
						|
#ifndef S4SINGLE
 | 
						|
#ifndef S4CLIENT
 | 
						|
int lock4lock( LOCK4 *lock )
 | 
						|
{
 | 
						|
   int rc ;
 | 
						|
 | 
						|
#ifdef E4ANALYZE
 | 
						|
   if ( ( rc = lock4verify( lock, 1 ) ) < 0 )
 | 
						|
      return rc ;
 | 
						|
#endif
 | 
						|
 | 
						|
   switch( lock->id.type )
 | 
						|
   {
 | 
						|
      case LOCK4ALL:
 | 
						|
         rc = dfile4lockAll( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4APPEND:
 | 
						|
         rc = dfile4lockAppend( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4FILE:
 | 
						|
         rc = dfile4lockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4RECORD:
 | 
						|
         rc = dfile4lock( lock->data, lock->id.clientId, lock->id.serverId, lock->id.recNum ) ;
 | 
						|
         break ;
 | 
						|
      default:
 | 
						|
         rc = error4( lock->data->c4, e4lock, E83901 ) ;
 | 
						|
         break ;
 | 
						|
   }
 | 
						|
 | 
						|
   return rc ;
 | 
						|
}
 | 
						|
 | 
						|
int lock4unlock( LOCK4 *lock )
 | 
						|
{
 | 
						|
   int rc, oldUnlockAuto ;
 | 
						|
 | 
						|
#ifdef E4ANALYZE
 | 
						|
   if ( ( rc = lock4verify( lock, 1 ) ) < 0 )
 | 
						|
      return rc ;
 | 
						|
#endif
 | 
						|
 | 
						|
   oldUnlockAuto = code4unlockAuto( lock->data->c4 ) ;
 | 
						|
   code4unlockAutoSet( lock->data->c4, 1 ) ;
 | 
						|
 | 
						|
   switch ( lock->id.type )
 | 
						|
   {
 | 
						|
      case LOCK4ALL:
 | 
						|
         #ifndef N4OTHER
 | 
						|
            #ifndef S4MEMO_OFF
 | 
						|
               dfile4memoUnlock( lock->data ) ;
 | 
						|
            #endif
 | 
						|
         #endif
 | 
						|
         #ifndef S4INDEX_OFF
 | 
						|
            dfile4unlockIndex( lock->data, lock->id.serverId ) ;
 | 
						|
         #endif
 | 
						|
         rc = dfile4unlockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4APPEND:
 | 
						|
         rc = dfile4unlockAppend( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4FILE:
 | 
						|
         rc = dfile4unlockFile( lock->data, lock->id.clientId, lock->id.serverId ) ;
 | 
						|
         break ;
 | 
						|
      case LOCK4RECORD:
 | 
						|
         rc = dfile4unlockRecord( lock->data, lock->id.clientId, lock->id.serverId, lock->id.recNum ) ;
 | 
						|
         break ;
 | 
						|
      default:
 | 
						|
         rc = error4( lock->data->c4, e4info, E93801 ) ;
 | 
						|
         break ;
 | 
						|
   }
 | 
						|
 | 
						|
   code4unlockAutoSet( lock->data->c4, oldUnlockAuto ) ;
 | 
						|
 | 
						|
   return rc ;
 | 
						|
}
 | 
						|
#endif  /* S4CLIENT */
 | 
						|
#endif  /* S4SINGLE */
 | 
						|
 | 
						|
/*
 | 
						|
int dfile4lockAppendAdd( DATA4 *d4 )
 | 
						|
{
 | 
						|
   LOCK4 *lock ;
 | 
						|
   CODE4 *c4 ;
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   if ( ( rc = d4verify( d4, 1 ) ) < 0 )
 | 
						|
      return rc ;
 | 
						|
 | 
						|
   c4 = d4->codeBase ;
 | 
						|
 | 
						|
   if ( c4->lockMemory == 0 )
 | 
						|
   {
 | 
						|
      c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
 | 
						|
      if ( c4->lockMemory == 0 )
 | 
						|
         return 0 ;
 | 
						|
   }
 | 
						|
 | 
						|
   lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
 | 
						|
   if ( lock == 0 )
 | 
						|
      return error4( c4, e4memory, 0 ) ;
 | 
						|
 | 
						|
   lock->data = d4->dataFile ;
 | 
						|
   lock->type = S4LOCK_APPEND ;
 | 
						|
   lock->serverId = data4serverId( d4 ) ;
 | 
						|
   lock->clientId = data4clientId( d4 ) ;
 | 
						|
   l4add( &d4->trans->locks, lock ) ;
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int dfile4lockFileAdd( DATA4 *d4 )
 | 
						|
{
 | 
						|
   LOCK4 *lock ;
 | 
						|
   CODE4 *c4 ;
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   if ( ( rc = d4verify( d4, 1 ) ) < 0 )
 | 
						|
      return rc ;
 | 
						|
 | 
						|
   c4 = d4->codeBase ;
 | 
						|
 | 
						|
   if ( c4->lockMemory == 0 )
 | 
						|
   {
 | 
						|
      c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
 | 
						|
      if ( c4->lockMemory == 0 )
 | 
						|
         return 0 ;
 | 
						|
   }
 | 
						|
 | 
						|
   lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
 | 
						|
   if ( lock == 0 )
 | 
						|
      return error4( c4, e4memory, 0 ) ;
 | 
						|
 | 
						|
   lock->data = d4->dataFile ;
 | 
						|
   lock->type = S4LOCK_FILE ;
 | 
						|
   lock->serverId = data4serverId( d4 ) ;
 | 
						|
   lock->clientId = data4clientId( d4 ) ;
 | 
						|
   l4add( &d4->trans->locks, lock ) ;
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int dfile4lockRecordAdd( DATA4 *d4, long rec )
 | 
						|
{
 | 
						|
   LOCK4 *lock ;
 | 
						|
   CODE4 *c4 ;
 | 
						|
   int rc ;
 | 
						|
 | 
						|
   if ( ( rc = d4verify( d4, 1 ) ) < 0 )
 | 
						|
      return rc ;
 | 
						|
 | 
						|
   c4 = d4->codeBase ;
 | 
						|
 | 
						|
   if ( c4->lockMemory == 0 )
 | 
						|
   {
 | 
						|
      c4->lockMemory = mem4create( c4, c4->memStartLock, sizeof(TAG4), c4->memExpandLock, 0 ) ;
 | 
						|
      if ( c4->lockMemory == 0 )
 | 
						|
         return 0 ;
 | 
						|
   }
 | 
						|
 | 
						|
   lock = (LOCK4 *)mem4alloc( c4->lockMemory ) ;
 | 
						|
   if ( lock == 0 )
 | 
						|
      return error4( c4, e4memory, 0 ) ;
 | 
						|
 | 
						|
   lock->data = d4->dataFile ;
 | 
						|
   lock->type = S4LOCK_RECORD ;
 | 
						|
   lock->recNum = rec ;
 | 
						|
   lock->serverId = data4serverId( d4 ) ;
 | 
						|
   lock->clientId = data4clientId( d4 ) ;
 | 
						|
 | 
						|
   l4add( &d4->trans->locks, lock ) ;
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef S4OFF_COMMUNICATIONS
 | 
						|
void message4release( CODE4 *c4 )
 | 
						|
{
 | 
						|
   MESSAGE4 *message ;
 | 
						|
 | 
						|
   for ( ;; )
 | 
						|
   {
 | 
						|
      message = (MESSAGE4 *)l4first( &c4->availMessages ) ;
 | 
						|
      if ( message == 0 )
 | 
						|
         return ;
 | 
						|
      l4remove( &c4->availMessages, message ) ;
 | 
						|
      if ( message->packet != 0 )
 | 
						|
      {
 | 
						|
         u4free( message->packet ) ;
 | 
						|
         message->packet = 0 ;
 | 
						|
      }
 | 
						|
      u4free( message ) ;
 | 
						|
   }
 | 
						|
}
 | 
						|
 | 
						|
void S4FUNCTION message4free( CODE4 *c4, MESSAGE4 *message )
 | 
						|
{
 | 
						|
   if ( message->packet != 0 )
 | 
						|
   {
 | 
						|
      if ( c4 == 0 )
 | 
						|
      {
 | 
						|
         if ( message->packet != 0 )
 | 
						|
         {
 | 
						|
            u4free( message->packet ) ;
 | 
						|
            message->packet = 0 ;
 | 
						|
         }
 | 
						|
         u4free( message ) ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         l4add( &c4->availMessages, message ) ;
 | 
						|
   }
 | 
						|
}
 | 
						|
 | 
						|
MESSAGE4 * S4FUNCTION message4alloc( CODE4 *c4, unsigned int sizePacket )
 | 
						|
{
 | 
						|
   MESSAGE4 *message ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( c4 == 0 )
 | 
						|
      {
 | 
						|
         error4( 0, e4parm_null, E93904 ) ;
 | 
						|
         return 0 ;
 | 
						|
      }
 | 
						|
 | 
						|
      if ( sizePacket < sizeof( PACKET4 ) )
 | 
						|
      {
 | 
						|
         error4( 0, e4parm, E93904 ) ;
 | 
						|
         return 0 ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   message = 0 ;
 | 
						|
   for( ;; )
 | 
						|
   {
 | 
						|
      message = (MESSAGE4 *)l4next( &c4->availMessages, message ) ;
 | 
						|
      if ( message == 0 )
 | 
						|
      {
 | 
						|
         message = (MESSAGE4 *)u4allocFree( c4, (long)sizeof( MESSAGE4 ) ) ;
 | 
						|
         if ( message == 0 )
 | 
						|
         {
 | 
						|
            #ifdef E4STACK
 | 
						|
               error4stack( c4, e4memory, E93904 ) ;
 | 
						|
            #endif
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
 | 
						|
         message->packet = (PACKET4 *)u4allocFree( c4, (long)sizePacket ) ;
 | 
						|
         if ( message->packet == 0 )
 | 
						|
         {
 | 
						|
            #ifdef E4STACK
 | 
						|
               error4stack( c4, e4memory, E93904 ) ;
 | 
						|
            #endif
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
         message->len = sizePacket ;
 | 
						|
         break ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
         if ( message->len >= sizePacket )
 | 
						|
         {
 | 
						|
            l4remove( &c4->availMessages, message ) ;
 | 
						|
            break ;
 | 
						|
         }
 | 
						|
   }
 | 
						|
   return message ;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |