home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c160 / 1.ddi / SOURCE / I4UNLOCK.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-22  |  2.4 KB  |  94 lines

  1.  
  2. /*  i4unlock.c    (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     Unlocks an index file or all the index files corresponding to the
  5.     current database.
  6. */
  7.  
  8. #include "p4misc.h"
  9. #include "d4all.h"
  10. #include "u4error.h"
  11.  
  12. #include <errno.h>
  13.  
  14. #ifndef UNIX
  15. #include <io.h>
  16. #endif
  17.  
  18. extern   INDEX  *v4index ;
  19. extern   BLOCK  *v4block ;
  20.  
  21. #ifdef LOG
  22.    extern void logger( char *, char *) ;
  23. #endif
  24.  
  25. #ifdef DO_ERRNO
  26. extern int  errno ;
  27. #endif
  28.  
  29. int i4unlock( int index_ref )
  30. {
  31.    int    rc, block_on, h_size ;
  32.    INDEX *index_ptr ;
  33.  
  34.    if ( index_ref >= 0)
  35.    {
  36.       index_ptr =  v4index + index_ref ;
  37.  
  38.       /* First, flush the buffers to disk. */
  39.       for( block_on = index_ptr->block_ref; block_on >= 0; block_on = v4block[block_on].prev )
  40.          if ( v4block[block_on].wrt )  b4write( index_ref, block_on ) ;
  41.       for( block_on = index_ptr->block_last; block_on >= 0; block_on = v4block[block_on].prev )
  42.          if ( v4block[block_on].wrt )  b4write( index_ref, block_on ) ;
  43.  
  44.       if ( index_ptr->lock )
  45.       {
  46.      if ( index_ptr->version != index_ptr->old_version ) 
  47.      {
  48.         index_ptr->old_version =  index_ptr->version ;
  49.             lseek( index_ptr->file_hand, (long) 0, 0) ;
  50.         #ifdef CLIPPER
  51.                h_size =  (int) ((char *)(v4index+1) - (char *)&v4index->sign) ;
  52.                rc =  write( index_ptr->file_hand, (char *)&index_ptr->sign, h_size ) ;
  53.         #else
  54.                h_size =  (int) ((char *)(v4index+1) - (char *)&v4index->root) ;
  55.                rc =  write( index_ptr->file_hand, (char *)&index_ptr->root, h_size ) ;
  56.         #endif
  57.         if ( rc != (int) h_size ) 
  58.         {
  59.            u4error( E_WRITE, index_ptr->name, (char *) 0 ) ;
  60.            return -1 ;
  61.         }
  62.          }
  63.          #ifdef LOG
  64.             logger( i4name(index_ref), "Index Unlock" ) ;
  65.          #endif
  66.      rc =  u4unlock( index_ptr->file_hand, LOCK_START, 1L ) ;
  67.          #ifdef ZORTECH
  68.         if (rc != 0 )
  69.          #else
  70.            if (rc != 0  &&  errno != EINVAL)
  71.          #endif
  72.      {
  73.         u4error( E_UNLOCK, index_ptr->name, (char *) 0) ;
  74.         return( -1) ;
  75.      }
  76.  
  77.      index_ptr->lock = 0 ;
  78.       }
  79.    }
  80.    else
  81.    {
  82.       int  index_on ;
  83.  
  84.       index_on =  d4ptr()->index_ref ;
  85.       while ( index_on >= 0)
  86.       {
  87.      if ( i4unlock(index_on) < 0) return( -1) ;
  88.      index_on =  v4index[index_on].prev ;
  89.       }
  90.    }
  91.  
  92.    return( 0) ;
  93. }
  94.