home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c160 / 1.ddi / SOURCE / D4APPEND.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-19  |  4.1 KB  |  164 lines

  1.  
  2. /*  (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     d4append()
  5. */
  6.  
  7. #include "p4misc.h"
  8. #include "d4all.h"
  9. #include "u4error.h"
  10.  
  11. #ifndef UNIX
  12. #include <io.h>
  13. #endif
  14.  
  15. extern BASE  *v4base ;
  16. extern INDEX *v4index ;
  17.  
  18. extern int    v4cur_base ;
  19. extern int    v4unique_error ;
  20. extern int    v4lock_wait ;
  21.  
  22.  
  23. int d4append()
  24. {
  25.    int    index_on, rc ;
  26.    char  *key_ptr, conv_buffer[34] ;
  27.    long   rec_num ;
  28.    BASE  *base_ptr  ;
  29.    INDEX *index_ptr ;
  30.    BASE_BUF  *buf ;
  31.  
  32.    if ( v4cur_base < 0 ) 
  33.    {
  34.       u4error( E_D_MISSING, (char *) 0 ) ; 
  35.       return( -1 ) ;
  36.    }
  37.  
  38.    base_ptr  =  v4base +  v4cur_base ;
  39.    base_ptr->bof =  base_ptr->eof =  0 ;
  40.    base_ptr->buffer_changed = 0 ;
  41.  
  42.    /* Lock Record Count Bytes */
  43.    if ( ! d4locked(0L) )
  44.    {
  45.       if ( d4unlock(-1L) < 0)  return -1 ;
  46.       if ( (rc = d4lock( 0L,v4lock_wait)) < 0 )  return rc ;  
  47.    }
  48.    base_ptr->rec_num =  rec_num  =  d4reccount()+1 ;
  49.  
  50.    #ifndef SMALL
  51.    for ( index_on = base_ptr->index_ref; index_on >= 0; index_on = index_ptr->prev )
  52.    {
  53.       index_ptr =  v4index+ index_on ;
  54.  
  55.       key_ptr =  i4eval(index_on) ;
  56.       if ( key_ptr == (char *) 0)  return( -1 ) ;
  57.  
  58.       if ( (rc = i4add( index_on, key_ptr, rec_num)) != 0)
  59.       {
  60.          if ( rc == 3 )  continue ;
  61.          if ( rc == 2 )
  62.      {
  63.         u4error( E_I_DATE, i4name(index_on), (char *) 0 ) ;
  64.         return -1 ;
  65.      }
  66.      if ( rc < 0 )  return rc ;
  67.  
  68.      /* Duplicate Index File Key */
  69.      if ( v4unique_error == 0 )  continue ;
  70.  
  71.          u4error( E_UNIQUE, i4name(index_on), (char *) 0 ) ;
  72.  
  73.      /* Error -  Record Should not be Added;  Remove keys already added. */
  74.          for ( index_on = index_ptr->next; index_on >= 0; index_on = index_ptr->next )
  75.      {
  76.         index_ptr =  v4index + index_on ;
  77.             key_ptr =  i4eval(index_on) ;
  78.             if ( key_ptr == (char *) 0)  return( -1 ) ;
  79.  
  80.         if ( i4remove( index_on, key_ptr, rec_num) < 0 )
  81.            return -1 ;
  82.      }
  83.      return -3 ;
  84.       }
  85.    }
  86.    #endif
  87.  
  88.    base_ptr->num_recs =  rec_num ;
  89.  
  90.    #ifndef SMALL
  91.    if ( base_ptr->buf_status > 1 )
  92.    {
  93.       int  i_buf ;
  94.  
  95.       i_buf =  (int) ((rec_num / base_ptr->rec_per_buf) % base_ptr->n_bufs) ;
  96.       buf =  base_ptr->bufs+ i_buf ;
  97.  
  98.       if ( rec_num == buf->end_rec+1L  &&
  99.        rec_num/base_ptr->rec_per_buf == buf->start_rec/base_ptr->rec_per_buf )
  100.          buf->end_rec++ ;     /* Can be appended to the buffer. */
  101.       else
  102.       {
  103.      if ( base_ptr->file_lock == 1 )
  104.      {
  105.             /* File Locked. */
  106.             if ( d4buf_flush( base_ptr, i_buf) < 0 )  return -1 ;
  107.      }
  108.      else
  109.          {
  110.             int  prev_buf ;
  111.  
  112.             prev_buf = i_buf-1 ;
  113.             if ( prev_buf < 0 )  prev_buf =  base_ptr->n_bufs-1 ;
  114.  
  115.         if ( d4buf_clear( base_ptr, i_buf) < 0 )  return -1 ;
  116.         if ( d4buf_clear( base_ptr, prev_buf) < 0 )  return -1 ;
  117.          }
  118.  
  119.          buf->start_rec =  buf->end_rec =  rec_num ;
  120.       }
  121.  
  122.       if ( ! buf->changed )
  123.       {
  124.          buf->changed =  1 ;
  125.          base_ptr->change_list =  h4add((char **) &base_ptr->bufs,
  126.                                         base_ptr->change_list, i_buf, 0 ) ;
  127.       }
  128.  
  129.       /* 'buf->start_rec' and 'buf->end_rec' now contain 'rec_num'. */
  130.       u4huge_cpy( base_ptr->buf_ptr + i_buf*base_ptr->bytes_per_buf +
  131.               (rec_num-buf->start_rec) * base_ptr->buffer_len,
  132.            (void H_PTR) base_ptr->buffer, (long) base_ptr->buffer_len ) ;
  133.  
  134.       return 0 ;
  135.    }
  136.    #endif
  137.  
  138.    /* Write the Record. */
  139.    if ( d4lseek(rec_num) < 0 )  return -1 ;
  140.    base_ptr->buffer[base_ptr->buffer_len]  =  (char) 0x1A ;
  141.    rc=write(base_ptr->file_hand, base_ptr->buffer, base_ptr->buffer_len+1);
  142.    base_ptr->buffer[base_ptr->buffer_len]  =  0 ;
  143.    if ( rc != base_ptr->buffer_len+1 )
  144.    {
  145.       c4ltoa( rec_num, conv_buffer, 10 ) ;
  146.       conv_buffer[10] = '\000' ;
  147.       u4error( E_WRITE, base_ptr->name, "Record Number:", conv_buffer, (char *) 0 ) ;
  148.       return( -1) ;
  149.    }
  150.  
  151.    return( 0) ;
  152. }
  153.  
  154. int  d4append_blank()
  155. {
  156.    BASE *base_ptr ;
  157.  
  158.    base_ptr =  d4ptr() ;
  159.    if ( d4changed(base_ptr) < 0 )  return -1 ;
  160.  
  161.    d4blank() ;
  162.    return( d4append() ) ;
  163. }
  164.