home *** CD-ROM | disk | FTP | other *** search
-
- /* (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- d4append()
- */
-
- #include "p4misc.h"
- #include "d4all.h"
- #include "u4error.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 d4append()
- {
- int index_on, rc ;
- char *key_ptr, conv_buffer[34] ;
- long rec_num ;
- BASE *base_ptr ;
- INDEX *index_ptr ;
- BASE_BUF *buf ;
-
- if ( v4cur_base < 0 )
- {
- u4error( E_D_MISSING, (char *) 0 ) ;
- return( -1 ) ;
- }
-
- base_ptr = v4base + v4cur_base ;
- base_ptr->bof = base_ptr->eof = 0 ;
- base_ptr->buffer_changed = 0 ;
-
- /* Lock Record Count Bytes */
- if ( ! d4locked(0L) )
- {
- if ( d4unlock(-1L) < 0) return -1 ;
- if ( (rc = d4lock( 0L,v4lock_wait)) < 0 ) return rc ;
- }
- base_ptr->rec_num = rec_num = d4reccount()+1 ;
-
- #ifndef SMALL
- 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 ) ;
-
- if ( (rc = i4add( index_on, key_ptr, rec_num)) != 0)
- {
- if ( rc == 3 ) continue ;
- if ( rc == 2 )
- {
- u4error( E_I_DATE, i4name(index_on), (char *) 0 ) ;
- return -1 ;
- }
- if ( rc < 0 ) return rc ;
-
- /* Duplicate Index File Key */
- if ( v4unique_error == 0 ) continue ;
-
- u4error( E_UNIQUE, i4name(index_on), (char *) 0 ) ;
-
- /* Error - Record Should not be Added; Remove keys already added. */
- 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 ;
- }
- return -3 ;
- }
- }
- #endif
-
- base_ptr->num_recs = rec_num ;
-
- #ifndef SMALL
- if ( base_ptr->buf_status > 1 )
- {
- int i_buf ;
-
- i_buf = (int) ((rec_num / base_ptr->rec_per_buf) % base_ptr->n_bufs) ;
- buf = base_ptr->bufs+ i_buf ;
-
- if ( rec_num == buf->end_rec+1L &&
- rec_num/base_ptr->rec_per_buf == buf->start_rec/base_ptr->rec_per_buf )
- buf->end_rec++ ; /* Can be appended to the buffer. */
- else
- {
- if ( base_ptr->file_lock == 1 )
- {
- /* File Locked. */
- if ( d4buf_flush( base_ptr, i_buf) < 0 ) return -1 ;
- }
- else
- {
- int prev_buf ;
-
- prev_buf = i_buf-1 ;
- if ( prev_buf < 0 ) prev_buf = base_ptr->n_bufs-1 ;
-
- if ( d4buf_clear( base_ptr, i_buf) < 0 ) return -1 ;
- if ( d4buf_clear( base_ptr, prev_buf) < 0 ) return -1 ;
- }
-
- buf->start_rec = buf->end_rec = rec_num ;
- }
-
- if ( ! buf->changed )
- {
- buf->changed = 1 ;
- base_ptr->change_list = h4add((char **) &base_ptr->bufs,
- base_ptr->change_list, i_buf, 0 ) ;
- }
-
- /* 'buf->start_rec' and 'buf->end_rec' now contain 'rec_num'. */
- u4huge_cpy( base_ptr->buf_ptr + i_buf*base_ptr->bytes_per_buf +
- (rec_num-buf->start_rec) * base_ptr->buffer_len,
- (void H_PTR) base_ptr->buffer, (long) base_ptr->buffer_len ) ;
-
- return 0 ;
- }
- #endif
-
- /* Write the Record. */
- if ( d4lseek(rec_num) < 0 ) return -1 ;
- base_ptr->buffer[base_ptr->buffer_len] = (char) 0x1A ;
- rc=write(base_ptr->file_hand, base_ptr->buffer, base_ptr->buffer_len+1);
- base_ptr->buffer[base_ptr->buffer_len] = 0 ;
- if ( rc != base_ptr->buffer_len+1 )
- {
- 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) ;
- }
-
- int d4append_blank()
- {
- BASE *base_ptr ;
-
- base_ptr = d4ptr() ;
- if ( d4changed(base_ptr) < 0 ) return -1 ;
-
- d4blank() ;
- return( d4append() ) ;
- }
-