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

  1.  
  2. /*  (c)Copyright Sequiter Software Inc., 1987-1990.  All rights reserved.
  3.  
  4.     d4read.c
  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 int   v4cur_base ;
  17. extern int   v4lock_wait ;
  18.  
  19.  
  20. int  d4go_error( long rec_num )
  21. {
  22.    char  conv_buffer[34] ;
  23.  
  24.    c4ltoa( rec_num, conv_buffer, 10 ) ;
  25.    conv_buffer[10] = '\000' ;
  26.    u4error( E_READ, d4name(), "Record: ", conv_buffer, (char *) 0) ;
  27.    return -1 ;
  28. }
  29.  
  30.  
  31. int  v4lock_code = 1 ;
  32.  
  33. int  d4lock_code( int lock_code )
  34. {
  35.    int  old_code ;
  36.  
  37.    old_code =  v4lock_code ;
  38.    if ( lock_code >= -1  && lock_code <= 2)
  39.       v4lock_code =  lock_code ;
  40.  
  41.    return old_code ;
  42. }
  43.  
  44.  
  45. int d4read( long rec_num )
  46. {
  47.    BASE *base_ptr ;
  48.    int   rc ;
  49.  
  50.    base_ptr =  v4base +  v4cur_base ;
  51.  
  52.    #ifndef SMALL
  53.    if ( ! d4locked( rec_num ) )
  54.       /* Make sure index files are unlocked before locking a record. */
  55.       i4unlock( -1) ;  
  56.    #endif
  57.  
  58.    switch( v4lock_code )
  59.    {
  60.       case 1:
  61.          rc = d4lock( rec_num, v4lock_wait) ;
  62.          break ;
  63.  
  64.       case -1:
  65.          rc = d4lock( -1L, v4lock_wait ) ; 
  66.          break ;
  67.  
  68.       default:
  69.          rc =  0 ;
  70.    }
  71.    if ( rc < 0 )  return rc ;
  72.  
  73.    base_ptr->rec_num =    rec_num ;
  74.  
  75.    #ifndef SMALL
  76.    if ( base_ptr->buf_status > 1 )
  77.    {
  78.       char H_PTR ptr ;
  79.  
  80.       if ((ptr = d4buf_read_pos(base_ptr, rec_num)) == (char H_PTR) 0) return -1;
  81.  
  82.       /* The record is now in the buffer */
  83.       u4huge_cpy( (void H_PTR) base_ptr->buffer,  ptr,
  84.               (long) base_ptr->buffer_len ) ;
  85.    }
  86.    else
  87.    #endif
  88.    {
  89.       if ( d4lseek(rec_num) < 0 )  return -1 ;
  90.       if ( read ( base_ptr->file_hand, base_ptr->buffer, base_ptr->buffer_len)
  91.                   !=  base_ptr->buffer_len  )
  92.          return( d4go_error(rec_num) ) ;
  93.    }
  94.  
  95.    return( 0 ) ;
  96. }
  97.  
  98.