home *** CD-ROM | disk | FTP | other *** search
-
- /* (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- d4write.c
- */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.h"
-
- #include <string.h>
- #ifndef UNIX
- #include <io.h>
- #endif
-
- extern BASE *v4base ;
- extern INDEX *v4index ;
-
- extern int v4cur_base ;
- extern int v4unique_error ;
- extern int v4lock_wait ;
-
- int d4write( long rec_num )
- {
- int index_on, rc ;
- char *key_ptr, conv_buffer[34], *buffer_ptr, key_data[MAX_KEY_SIZE+8] ;
- BASE *base_ptr ;
- INDEX *index_ptr ;
- char H_PTR h_ptr ;
-
- if ( rec_num <= 0L ) return ( d4append() ) ;
-
- if ( v4cur_base < 0 )
- {
- u4error( E_D_MISSING, (char *) 0 ) ;
- return( -1 ) ;
- }
-
- base_ptr = v4base + v4cur_base ;
- base_ptr->buffer_changed = 0 ;
-
- /* Lock the record if necessary. */
- if ( ! d4locked(rec_num) )
- {
- if ( i4unlock(-1) < 0) return -1 ;
- if ( (rc = d4lock( rec_num, v4lock_wait)) < 0 ) return rc ;
- }
-
- #ifndef SMALL
- if ( base_ptr->index_ref >= 0 )
- {
- buffer_ptr = base_ptr->buffer ;
- base_ptr->buffer = base_ptr->old_buf ;
- rc = d4read(rec_num) ;
- base_ptr->buffer = buffer_ptr ;
- if ( rc < 0 ) return rc ;
- if ( memcmp( base_ptr->buffer, base_ptr->old_buf, (size_t) base_ptr->buffer_len) == 0)
- return 0 ;
- }
-
- for ( index_on = base_ptr->index_ref; index_on >= 0; index_on = index_ptr->prev)
- {
- index_ptr = v4index+ index_on ;
-
- key_ptr = i4eval(index_on) ;
- if ( key_ptr == (char *) 0) return( -1 ) ;
-
- memcpy( key_data, key_ptr, (size_t) index_ptr->key_len ) ;
-
- base_ptr->buffer = base_ptr->old_buf ;
- key_ptr = i4eval(index_on) ;
- base_ptr->buffer = buffer_ptr ;
- if ( key_ptr == (char *) 0) return( -1 ) ;
-
- if ( memcmp( key_data, key_ptr, (size_t) index_ptr->key_len ) != 0 ||
- index_ptr->filter != (I4FILTER *) 0 )
- {
- /* Remove Old and Add New */
- if ( (rc = i4remove( index_on, key_ptr, rec_num)) < 0)
- return rc ;
- rc = i4add( index_on, key_data, rec_num ) ;
- if ( rc != 0 )
- {
- if ( rc == 3 ) continue ;
- if ( rc == 2 )
- {
- u4error( E_I_DATE, i4name(index_on), (char *) 0 ) ;
- return -1 ;
- }
- if ( rc < 0 ) return -1 ;
-
- if ( v4unique_error == 0 ) continue ;
-
- u4error( E_UNIQUE, i4name(index_on), (char *) 0 ) ;
-
- /* Unique Key Error. Undo the Write so far. */
- for ( index_on = index_ptr->next; index_on >= 0; index_on = index_ptr->next)
- {
- index_ptr = v4index + index_on ;
-
- key_ptr = i4eval(index_on) ;
- if ( key_ptr == (char *) 0) return( -1 ) ;
-
- if ( i4remove( index_on, key_ptr, rec_num) < 0 )
- return -1 ;
-
- base_ptr->buffer = base_ptr->old_buf ;
- key_ptr = i4eval(index_on) ;
- base_ptr->buffer = buffer_ptr ;
- if ( key_ptr == (char *) 0) return( -1 ) ;
-
- if ( i4add( index_on, key_data, rec_num ) < 0 ) return -1 ;
- }
- return -3 ;
- }
- }
- }
- #endif
-
- base_ptr->rec_num = rec_num ;
-
- #ifndef SMALL
- if ( base_ptr->buf_status > 1 )
- {
- if ((h_ptr = d4buf_write_pos(base_ptr, rec_num)) == (char H_PTR) 0)
- return -1 ;
- u4huge_cpy( h_ptr, (void H_PTR) base_ptr->buffer, (long) base_ptr->buffer_len) ;
-
- return 0 ;
- }
- #endif
-
- /* Write the Record. */
- if ( d4lseek(rec_num) < 0 ) return -1 ;
- if ( write( base_ptr->file_hand, base_ptr->buffer, base_ptr->buffer_len)
- != base_ptr->buffer_len )
- {
- c4ltoa( rec_num, conv_buffer, 10 ) ;
- conv_buffer[10] = '\000' ;
- u4error( E_WRITE, base_ptr->name, "Record Number:", conv_buffer, (char *) 0 ) ;
- return( -1) ;
- }
-
- return( 0) ;
- }
-