home *** CD-ROM | disk | FTP | other *** search
-
- /* i4unlock.c (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- Unlocks an index file or all the index files corresponding to the
- current database.
- */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
-
- #include <errno.h>
-
- #ifndef UNIX
- #include <io.h>
- #endif
-
- extern INDEX *v4index ;
- extern BLOCK *v4block ;
-
- #ifdef LOG
- extern void logger( char *, char *) ;
- #endif
-
- #ifdef DO_ERRNO
- extern int errno ;
- #endif
-
- int i4unlock( int index_ref )
- {
- int rc, block_on, h_size ;
- INDEX *index_ptr ;
-
- if ( index_ref >= 0)
- {
- index_ptr = v4index + index_ref ;
-
- /* First, flush the buffers to disk. */
- for( block_on = index_ptr->block_ref; block_on >= 0; block_on = v4block[block_on].prev )
- if ( v4block[block_on].wrt ) b4write( index_ref, block_on ) ;
- for( block_on = index_ptr->block_last; block_on >= 0; block_on = v4block[block_on].prev )
- if ( v4block[block_on].wrt ) b4write( index_ref, block_on ) ;
-
- if ( index_ptr->lock )
- {
- if ( index_ptr->version != index_ptr->old_version )
- {
- index_ptr->old_version = index_ptr->version ;
- lseek( index_ptr->file_hand, (long) 0, 0) ;
- #ifdef CLIPPER
- h_size = (int) ((char *)(v4index+1) - (char *)&v4index->sign) ;
- rc = write( index_ptr->file_hand, (char *)&index_ptr->sign, h_size ) ;
- #else
- h_size = (int) ((char *)(v4index+1) - (char *)&v4index->root) ;
- rc = write( index_ptr->file_hand, (char *)&index_ptr->root, h_size ) ;
- #endif
- if ( rc != (int) h_size )
- {
- u4error( E_WRITE, index_ptr->name, (char *) 0 ) ;
- return -1 ;
- }
- }
- #ifdef LOG
- logger( i4name(index_ref), "Index Unlock" ) ;
- #endif
- rc = u4unlock( index_ptr->file_hand, LOCK_START, 1L ) ;
- #ifdef ZORTECH
- if (rc != 0 )
- #else
- if (rc != 0 && errno != EINVAL)
- #endif
- {
- u4error( E_UNLOCK, index_ptr->name, (char *) 0) ;
- return( -1) ;
- }
-
- index_ptr->lock = 0 ;
- }
- }
- else
- {
- int index_on ;
-
- index_on = d4ptr()->index_ref ;
- while ( index_on >= 0)
- {
- if ( i4unlock(index_on) < 0) return( -1) ;
- index_on = v4index[index_on].prev ;
- }
- }
-
- return( 0) ;
- }
-