420 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			420 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* df4unlok.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
#ifndef S4UNIX
 | 
						|
   #ifdef __TURBOC__
 | 
						|
      #pragma hdrstop
 | 
						|
   #endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef S4OFF_MULTI
 | 
						|
#ifndef S4CLIENT
 | 
						|
 | 
						|
#ifndef N4OTHER
 | 
						|
#ifndef S4MEMO_OFF
 | 
						|
int dfile4memoUnlock( DATA4FILE *data )
 | 
						|
{
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( data == 0 )
 | 
						|
         return error4( 0, e4parm_null, E91102 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
      return 0 ;
 | 
						|
 | 
						|
   if ( data->memoFile.file.hand != -1 )
 | 
						|
      return memo4fileUnlock( &data->memoFile ) ;
 | 
						|
   else
 | 
						|
      return 0 ;
 | 
						|
}
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
int dfile4unlockAppend( DATA4FILE *data, const long clientId, const long serverId )
 | 
						|
{
 | 
						|
   #ifndef S4OFF_MULTI
 | 
						|
      #ifndef S4CLIENT
 | 
						|
         int rc ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( data == 0 || serverId == 0 )
 | 
						|
            return error4( 0, e4parm_null, E91102 ) ;
 | 
						|
      #endif
 | 
						|
      if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
         return 0 ;
 | 
						|
 | 
						|
      if ( data->appendServerLock == serverId && ( clientId == 0 || clientId == data->appendClientLock ) )
 | 
						|
      {
 | 
						|
         #ifndef S4OFF_WRITE
 | 
						|
            #ifdef S4OFF_MULTI
 | 
						|
               dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
            #else
 | 
						|
               if ( data->file.lowAccessMode == OPEN4DENY_RW )
 | 
						|
                  dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
            #endif
 | 
						|
            if ( data->doDate == 1 )
 | 
						|
            {
 | 
						|
               u4yymmdd( &data->yy ) ;
 | 
						|
               data->doDate = 0 ;
 | 
						|
            }
 | 
						|
         #endif
 | 
						|
 | 
						|
         #ifndef S4CLIENT
 | 
						|
            rc = file4unlock( &data->file, L4LOCK_POS, 1L ) ;
 | 
						|
            if ( rc < 0 )
 | 
						|
               return error4stack( data->c4, (short)rc, E91102 ) ;
 | 
						|
         #endif
 | 
						|
         data->appendServerLock = 0 ;
 | 
						|
         data->appendClientLock = 0 ;
 | 
						|
         data->numRecs = -1 ;
 | 
						|
      }
 | 
						|
      if ( error4code( data->c4 ) < 0 )
 | 
						|
         return error4code( data->c4 ) ;
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef S4USE_ADDITIVE_LOCK
 | 
						|
#ifndef S4CLIENT
 | 
						|
int dfile4unlockRange( DATA4FILE *data, const long recNum, long numRecs )
 | 
						|
{
 | 
						|
   int rc=0 ;
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( recNum == 0L && numRecs != 1L )
 | 
						|
         return error4( data->c4, e4parm, E91102 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef N4OTHER
 | 
						|
      if (numRecs == 0)
 | 
						|
         return(0);
 | 
						|
      if (numRecs == -1L)
 | 
						|
         numRecs = L4LOCK_POS-recNum;
 | 
						|
      rc = file4unlock( &data->file, L4LOCK_POS + recNum, numRecs ) ;
 | 
						|
   #endif
 | 
						|
   #ifdef S4MDX
 | 
						|
      if (numRecs == 0)
 | 
						|
         return(0);
 | 
						|
      if ( recNum == 0L )   /* append byte */
 | 
						|
         rc = file4unlock( &data->file, L4LOCK_POS, numRecs ) ;
 | 
						|
      else
 | 
						|
      {
 | 
						|
         if (numRecs == -1L)
 | 
						|
            rc = file4unlock( &data->file, L4LOCK_POS_OLD, L4LOCK_POS - L4LOCK_POS_OLD - recNum ) ;
 | 
						|
         else
 | 
						|
            rc = file4unlock( &data->file, L4LOCK_POS - recNum - numRecs, numRecs ) ;
 | 
						|
         if (rc == 0 && numRecs == -1L)
 | 
						|
            rc = file4unlock( &data->file, L4LOCK_POS - 1L, 1L ) ;   /* unlock flag */
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
   #ifdef S4FOX
 | 
						|
      if ( recNum == 0L )   /* append byte */
 | 
						|
         rc = file4unlock( &data->file, L4LOCK_POS, numRecs ) ;
 | 
						|
      else
 | 
						|
      {
 | 
						|
         if ( data->hasMdxMemo || data->version == 0x30 )
 | 
						|
         {
 | 
						|
            if (numRecs == 0)
 | 
						|
               return(0);
 | 
						|
            if (numRecs == -1L)
 | 
						|
               numRecs = L4LOCK_POS - L4LOCK_POS_OLD - recNum + 1L;
 | 
						|
            rc = file4unlock( &data->file, L4LOCK_POS - recNum - numRecs + 1L, numRecs ) ;
 | 
						|
         }
 | 
						|
         else
 | 
						|
            if (numRecs == -1)
 | 
						|
               if (recNum == 1)  /* also unlock header bytes*/
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS_OLD, L4LOCK_POS - L4LOCK_POS_OLD ) ;
 | 
						|
               else
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS_OLD + dfile4recordPosition( data, recNum-1L )+1L,  L4LOCK_POS - L4LOCK_POS_OLD - dfile4recordPosition( data, recNum-1L )-1L) ;
 | 
						|
            else
 | 
						|
               if (recNum == 1)  /* also unlock header bytes*/
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS_OLD, data->headerLen + numRecs*dfile4recWidth(data) ) ;
 | 
						|
               else
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS_OLD + dfile4recordPosition( data, recNum-1L )+1L, (numRecs+1L)*dfile4recWidth(data)-1L ) ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   return rc ;
 | 
						|
}
 | 
						|
#endif /* S4CLIENT */
 | 
						|
#endif /* S4USE_ADDITIVE_LOCK */
 | 
						|
 | 
						|
int dfile4unlockFile( DATA4FILE *data, const long clientId, const long serverId )
 | 
						|
{
 | 
						|
   #ifndef S4OFF_MULTI
 | 
						|
      #ifndef S4CLIENT
 | 
						|
         #ifdef S4USE_ADDITIVE_LOCK
 | 
						|
            LOCK4 *lock ;
 | 
						|
            long prevLock;
 | 
						|
            int rc;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( data == 0 || serverId == 0 )
 | 
						|
            return error4( 0, e4parm, E91102 ) ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
         return 0 ;
 | 
						|
 | 
						|
      #ifdef S4CLIENT
 | 
						|
         data->fileLock =  0 ;
 | 
						|
         data->numRecs = -1 ;
 | 
						|
      #else
 | 
						|
         #ifndef S4USE_ADDITIVE_LOCK
 | 
						|
            if ( data->fileServerLock == serverId && ( clientId == 0 || clientId == data->fileClientLock ) )
 | 
						|
            {
 | 
						|
               #ifndef S4OFF_WRITE
 | 
						|
                  #ifdef S4OFF_MULTI
 | 
						|
                     dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
                  #else
 | 
						|
                     if ( data->file.lowAccessMode == OPEN4DENY_RW )
 | 
						|
                        dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
                  #endif
 | 
						|
                  if ( data->doDate == 1 )
 | 
						|
                  {
 | 
						|
                     u4yymmdd( &data->yy ) ;
 | 
						|
                     data->doDate = 0 ;
 | 
						|
                  }
 | 
						|
               #endif
 | 
						|
 | 
						|
               #ifdef N4OTHER
 | 
						|
                  if ( file4unlock( &data->file, L4LOCK_POS, L4LOCK_POS ) < 0 )
 | 
						|
                     return -1 ;
 | 
						|
               #endif
 | 
						|
               #ifdef S4MDX
 | 
						|
                  if ( file4unlock( &data->file, L4LOCK_POS_OLD, L4LOCK_POS - L4LOCK_POS_OLD + 1 ) < 0 )
 | 
						|
                     return -1 ;
 | 
						|
               #endif
 | 
						|
               #ifdef S4FOX
 | 
						|
                  /* codebase locks the append byte as well... */
 | 
						|
                  if ( file4unlock( &data->file, L4LOCK_POS_OLD, L4LOCK_POS_OLD - 1L ) < 0 )
 | 
						|
                     return -1 ;
 | 
						|
               #endif
 | 
						|
               data->fileServerLock =  0 ;
 | 
						|
               data->fileClientLock =  0 ;
 | 
						|
               data->numRecs = -1 ;
 | 
						|
            }
 | 
						|
         #else
 | 
						|
            if ( data->fileServerLock == serverId && ( clientId == 0 || clientId == data->fileClientLock ) )
 | 
						|
            {
 | 
						|
               #ifndef S4OFF_WRITE
 | 
						|
                  #ifdef S4OFF_MULTI
 | 
						|
                     dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
                  #else
 | 
						|
                     if ( data->file.lowAccessMode == OPEN4DENY_RW )
 | 
						|
                        dfile4updateHeader( data, 1, 1 ) ;
 | 
						|
                  #endif
 | 
						|
                  if ( data->doDate == 1 )
 | 
						|
                  {
 | 
						|
                     u4yymmdd( &data->yy ) ;
 | 
						|
                     data->doDate = 0 ;
 | 
						|
                  }
 | 
						|
               #endif
 | 
						|
 | 
						|
               rc = file4unlock( &data->file, L4LOCK_POS, 1L ) ;  /* unlock append byte*/
 | 
						|
               if ( rc < 0 )
 | 
						|
                  return error4stack( data->c4, (short)rc, E91102 ) ;
 | 
						|
               prevLock = 0L ;
 | 
						|
               for ( lock = 0 ; rc == 0 ; )
 | 
						|
               {
 | 
						|
                  lock = (LOCK4 *)l4next( &data->lockedRecords, lock ) ;
 | 
						|
                  if ( lock == 0 )
 | 
						|
                  {
 | 
						|
                     rc = dfile4unlockRange( data, prevLock + 1L, -1L ) ;
 | 
						|
                     break;
 | 
						|
                  }
 | 
						|
                  else
 | 
						|
                  {
 | 
						|
                     rc = dfile4unlockRange( data, prevLock + 1L, lock->id.recNum - prevLock - 1L ) ;
 | 
						|
                     if ( rc == 0 )
 | 
						|
                        prevLock = lock->id.recNum ;
 | 
						|
                  }
 | 
						|
               }
 | 
						|
               if (rc != 0)
 | 
						|
                  return(rc);
 | 
						|
 | 
						|
               data->fileServerLock =  0 ;
 | 
						|
               data->fileClientLock =  0 ;
 | 
						|
               data->numRecs = -1 ;
 | 
						|
            }
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
      if ( error4code( data->c4 ) < 0 )
 | 
						|
         return error4code( data->c4 ) ;
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4INDEX_OFF
 | 
						|
int dfile4unlockIndex( DATA4FILE *data, const long serverId )
 | 
						|
{
 | 
						|
   #ifdef S4OFF_MULTI
 | 
						|
      return 0 ;
 | 
						|
   #else
 | 
						|
      int rc ;
 | 
						|
      #ifdef N4OTHER
 | 
						|
         TAG4FILE *tagOn ;
 | 
						|
      #else
 | 
						|
         INDEX4FILE *indexOn ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( data == 0 || serverId == 0 )
 | 
						|
            return error4( 0, e4parm, E91102 ) ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         if ( data->indexLocked == 0 )
 | 
						|
            return 0 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      /* if the data file is locked, then delay unlocking index if lock off */
 | 
						|
      if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
         if ( data->fileServerLock == serverId )
 | 
						|
             return 0 ;
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         data->indexLocked = 0 ;
 | 
						|
 | 
						|
         for ( tagOn = 0 ;; )
 | 
						|
         {
 | 
						|
            tagOn = dfile4tagNext( data, tagOn ) ;
 | 
						|
            if ( tagOn == 0 )
 | 
						|
            {
 | 
						|
               rc = error4code( data->c4 ) ;
 | 
						|
               if ( rc < 0 )
 | 
						|
                  return rc ;
 | 
						|
               return 0 ;
 | 
						|
            }
 | 
						|
            rc = tfile4unlock( tagOn, serverId ) ;
 | 
						|
            if ( rc < 0 )
 | 
						|
               return rc ;
 | 
						|
         }
 | 
						|
      #else
 | 
						|
         for ( indexOn = 0 ;; )
 | 
						|
         {
 | 
						|
            indexOn = (INDEX4FILE *)l4next(&data->indexes,indexOn) ;
 | 
						|
            if ( indexOn == 0 )
 | 
						|
            {
 | 
						|
               rc = error4code( data->c4 ) ;
 | 
						|
               if ( rc < 0 )
 | 
						|
                  return rc ;
 | 
						|
               return 0 ;
 | 
						|
            }
 | 
						|
            index4unlock( indexOn, serverId ) ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
int S4FUNCTION dfile4unlockRecord( DATA4FILE *data, const long clientId, const long serverId, const long rec )
 | 
						|
{
 | 
						|
   #ifndef S4CLIENT
 | 
						|
      LOCK4 *lock, *lockNext ;
 | 
						|
 | 
						|
      for ( lock = (LOCK4 *)l4first( &data->lockedRecords ) ; lock != 0 ; )
 | 
						|
      {
 | 
						|
         lockNext = (LOCK4 *)l4next( &data->lockedRecords, lock ) ;
 | 
						|
 | 
						|
         if ( lock->id.serverId == serverId && ( clientId == 0 || lock->id.clientId == clientId ) &&
 | 
						|
              lock->id.recNum == rec )
 | 
						|
         {
 | 
						|
            #ifdef N4OTHER
 | 
						|
               if ( file4unlock( &data->file, L4LOCK_POS + rec, 1L ) < 0 )
 | 
						|
                  return -1 ;
 | 
						|
            #endif
 | 
						|
            #ifdef S4MDX
 | 
						|
               if ( file4unlock( &data->file, L4LOCK_POS - rec -1L, 1L ) < 0 )
 | 
						|
                  return -1 ;
 | 
						|
            #endif
 | 
						|
            #ifdef S4FOX
 | 
						|
               if ( ( data->hasMdxMemo ) || data->version == 0x30 )
 | 
						|
               {
 | 
						|
                  if ( file4unlock( &data->file, L4LOCK_POS - rec, 1L ) < 0 )
 | 
						|
                     return -1 ;
 | 
						|
               }
 | 
						|
               else
 | 
						|
                  if ( file4unlock( &data->file, L4LOCK_POS_OLD + dfile4recordPosition( data, rec ), 1L ) < 0 )
 | 
						|
                     return -1 ;
 | 
						|
            #endif
 | 
						|
            l4remove( &data->lockedRecords, lock ) ;
 | 
						|
            mem4free( data->c4->lockMemory, lock ) ;
 | 
						|
            break ;
 | 
						|
         }
 | 
						|
         lock = lockNext ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int dfile4unlockRecords( DATA4FILE *data, const long clientId, const long serverId )
 | 
						|
{
 | 
						|
   #ifndef S4OFF_MULTI
 | 
						|
      LOCK4 *lock, *lockNext ;
 | 
						|
      int rc ;
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( data == 0 || serverId == 0 )
 | 
						|
            return error4( 0, e4parm, E91102 ) ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
         return 0 ;
 | 
						|
 | 
						|
      for ( lock = (LOCK4 *)l4first( &data->lockedRecords ) ; lock != 0 ; )
 | 
						|
      {
 | 
						|
         lockNext = (LOCK4 *)l4next( &data->lockedRecords, lock ) ;
 | 
						|
 | 
						|
         if ( lock->id.serverId == serverId && ( clientId == 0 || lock->id.clientId == clientId ) )
 | 
						|
         {
 | 
						|
            #ifndef S4CLIENT
 | 
						|
               #ifdef N4OTHER
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS + lock->id.recNum, 1L ) ;
 | 
						|
               #endif
 | 
						|
               #ifdef S4MDX
 | 
						|
                  rc = file4unlock( &data->file, L4LOCK_POS - lock->id.recNum -1L, 1L ) ;
 | 
						|
               #endif
 | 
						|
               #ifdef S4FOX
 | 
						|
                  if ( data->hasMdxMemo || data->version == 0x30 )
 | 
						|
                     rc = file4unlock( &data->file, L4LOCK_POS - lock->id.recNum, 1L ) ;
 | 
						|
                  else
 | 
						|
                     rc = file4unlock( &data->file, L4LOCK_POS_OLD + dfile4recordPosition( data, lock->id.recNum ), 1L ) ;
 | 
						|
               #endif
 | 
						|
               if ( rc < 0 )
 | 
						|
                  return error4stack( data->c4, (short)rc, E91102 ) ;
 | 
						|
            #endif
 | 
						|
            l4remove( &data->lockedRecords, lock ) ;
 | 
						|
            mem4free( data->c4->lockMemory, lock ) ;
 | 
						|
         }
 | 
						|
         lock = lockNext ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
int dfile4unlockData( DATA4FILE *data, const long clientId, const long serverId )
 | 
						|
{
 | 
						|
   #ifndef S4OFF_MULTI
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( data == 0 )
 | 
						|
            return error4( 0, e4parm_null, E91102 ) ;
 | 
						|
      #endif
 | 
						|
      if ( code4unlockAuto( data->c4 ) == LOCK4OFF )
 | 
						|
         return 0 ;
 | 
						|
 | 
						|
      dfile4unlockFile( data, clientId, serverId ) ;
 | 
						|
      dfile4unlockAppend( data, clientId, serverId ) ;
 | 
						|
      dfile4unlockRecords( data, clientId, serverId ) ;
 | 
						|
      if ( error4code( data->c4 ) < 0 )
 | 
						|
         return error4code( data->c4 ) ;
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#endif  /* S4CLIENT */
 | 
						|
#endif  /* S4OFF_MULTI */
 |