home *** CD-ROM | disk | FTP | other *** search
-
- /* d4skip.c (c)Copyright Sequiter Software Inc., 1987, 1988, 1989. All rights reserved.
-
- Locates and reads the record.
- Returns
- 0 Success
- 1 BOF
- 3 EOF
- -1 Error
- */
-
- #include "d4base.h"
- #include "u4error.h"
- #include <string.h>
-
- extern BASE *v4base ;
- extern INDEX *v4index ;
- extern int v4cur_base ;
-
-
- d4skip( num_skip )
- long num_skip ;
- {
- BASE *base_ptr ;
- char *eval_ptr ;
- int index_ref, rc, do_repos ;
- long skipped ;
-
- if ( v4cur_base < 0 )
- {
- u4error( E_D_MISSING, (char *) 0 ) ;
- return( -1 ) ;
- }
-
- base_ptr = v4base + v4cur_base ;
- index_ref = base_ptr->current_index ;
-
- if ( base_ptr->rec_num <= 0 )
- {
- if ( base_ptr->rec_num == 0 )
- {
- if( (rc = d4top()) < 0) return( -1 ) ;
- if ( rc == 3) return( 3 ) ;
- }
- else
- {
- /* EOF - Position to the Bottom */
- if( (rc = d4bottom()) < 0) return( -1 ) ;
- if ( rc == 3 ) return 3 ;
- num_skip++ ;
- }
- }
-
- if ( num_skip == 0 ) return( 0 ) ;
-
- if (index_ref < 0)
- {
- base_ptr->rec_num += num_skip ;
- if ( base_ptr->rec_num >= 1 && base_ptr->rec_num <= d4reccount() )
- return( d4go( base_ptr->rec_num ) ) ;
- }
- else
- {
- /* Make sure its initial position is correct. */
- do_repos = 0 ;
- if ( b4key(index_ref) == (KEY *) 0 )
- do_repos = 1 ;
- else
- if ( b4key(index_ref)->rec_num != base_ptr->rec_num )
- do_repos = 1 ;
- if ( do_repos )
- {
- /* Lock Index File Before Locking Database */
- if ( i4lock(index_ref,1) < 0) return -1 ;
-
- if ( d4go( base_ptr->rec_num ) < 0 ) return( -1 ) ;
- eval_ptr = i4eval( index_ref ) ;
- rc = i4go( index_ref, eval_ptr, base_ptr->rec_num ) ;
- if ( rc < 0 ) return( -1 ) ;
- if ( rc != 0 )
- {
- char buffer[64], rec_buffer[10] ;
- c4key( eval_ptr, buffer, i4type(index_ref) ) ;
- c4ltoa( base_ptr->rec_num, rec_buffer, 7 ) ;
- rec_buffer[7] = '\0' ;
- u4error( E_I_MISSING, v4index[index_ref].name,
- "Key:", buffer,
- "Record Number:", rec_buffer, (char *) 0 ) ;
- return( -1 ) ;
- }
- }
-
- skipped = i4skip( index_ref, num_skip) ;
- if ( skipped == num_skip )
- return( d4go( b4key(base_ptr->current_index)->rec_num ) ) ;
- if ( skipped == -num_skip && skipped != 0 )
- return( -1 ) ; /* Error */
- }
-
- if ( num_skip < 0)
- {
- /* BOF */
- rc = d4top() ;
- if ( rc == 0 )
- return( 1) ;
- else
- return( rc ) ;
- }
- else
- {
- /* EOF */
- base_ptr->rec_num = -1 ;
- memset( base_ptr->buffer, (int) ' ', (size_t) base_ptr->buffer_len ) ;
- return( 3 ) ;
- }
- }
-
-