home *** CD-ROM | disk | FTP | other *** search
-
- /* d4skip.c (c)Copyright Sequiter Software Inc., 1987-1990. All rights reserved.
-
- Locates and reads the record.
- Returns
- 0 Success
- 1 BOF
- 3 EOF
- -1 Error
- -2 No Record to Skip From
- */
-
- #include "d4all.h"
- #include "u4error.h"
-
- extern BASE *v4base ;
- extern INDEX *v4index ;
- extern int v4cur_base, v4lock_wait ;
-
- static int position_index( int, long ) ;
- static int d4skip_seq( BASE *, long ) ;
- static int d4skip_index( BASE *, long ) ;
-
-
- /* Skip Sequentially. */
-
- static int d4skip_seq( BASE *base_ptr, long num_skip )
- {
- int rc, rc2 ;
- long new_rec, count ;
-
- count = d4reccount() ;
- if ( count <= 0L )
- {
- base_ptr->rec_num = 1L ;
- base_ptr->eof = base_ptr->bof = 1 ;
- d4blank() ;
- if ( num_skip >= 0L )
- return 3 ;
- else
- return 1 ;
- }
-
- rc = base_ptr->bof = base_ptr->eof = 0 ;
- new_rec = base_ptr->rec_num + num_skip ;
-
- if ( new_rec < 1L )
- {
- base_ptr->bof = 1 ;
- new_rec = 1L ;
- rc = 1 ;
- }
-
- if ( new_rec > count )
- {
- base_ptr->rec_num = count +1L ;
- base_ptr->eof = 1 ;
- d4blank() ;
- return 3 ;
- }
-
- if ( (rc2 = d4read(new_rec)) < 0 ) return rc2 ;
-
- return rc ;
- }
-
-
- /* Skip with an Index. */
-
- static int d4skip_index( BASE *base_ptr, long num_skip )
- {
- int index_ref, rc ;
- long skipped ;
-
- index_ref = base_ptr->current_index ;
-
- if ( base_ptr->eof )
- {
- if ( num_skip >= 0 )
- {
- d4blank() ;
- return 3 ;
- }
-
- base_ptr->eof = 0 ;
- if ( (rc = d4bottom()) < 0 ) return rc ;
- if ( rc == 3 ) return 1 ;
- num_skip++ ;
- }
-
- if ( num_skip == 0 ) return( 0 ) ;
- base_ptr->bof = 0 ;
-
- if ( (rc = position_index( index_ref, base_ptr->rec_num)) < 0) return rc ;
-
- skipped = i4skip( index_ref, num_skip) ;
-
- if ( skipped == num_skip )
- return( d4read( i4key(base_ptr->current_index)->rec_num ) ) ;
- if ( skipped == -num_skip && skipped != 0 )
- return( -1 ) ; /* Error */
-
- if ( num_skip < 0)
- {
- /* BOF */
- rc = d4top() ;
- base_ptr->bof = 1 ;
-
- if ( rc >= 0 )
- return( 1) ;
- else
- return( rc ) ;
- }
- else
- {
- /* EOF */
- base_ptr->rec_num = d4reccount()+1 ;
- base_ptr->eof = 1 ;
- d4blank() ;
- return( 3 ) ;
- }
- }
-
-
- static int position_index( int index_ref, long rec_num )
- {
- KEY *key_ptr ;
- char *eval_ptr ;
- int rc ;
-
- if ( (key_ptr = i4key(index_ref)) != (KEY *) 0)
- if ( key_ptr->rec_num == rec_num)
- {
- if ( (rc = i4lock( index_ref, v4lock_wait)) < 0) return rc ;
-
- if ( (key_ptr = i4key(index_ref)) != (KEY *) 0)
- if ( key_ptr->rec_num == rec_num) return 0 ;
- }
-
- /* The Index File Needs to be Repositioned. */
- if ( (rc = d4read( rec_num)) < 0) return rc ;
-
- if ( (eval_ptr = i4eval( index_ref)) == (char *) 0) return -1 ;
- if ( (rc = i4go( index_ref, eval_ptr, rec_num)) < 0) return -1;
- if ( rc != 0 ) return -3 ;
-
- return 0 ;
- }
-
-
- int d4skip( long num_skip )
- {
- BASE *base_ptr ;
-
- if ( v4cur_base < 0 )
- {
- u4error( E_D_MISSING, (char *) 0 ) ;
- return( -1 ) ;
- }
-
- base_ptr = v4base + v4cur_base ;
- if ( d4changed( base_ptr ) < 0 ) return -1 ;
-
- if ( base_ptr->current_index >= 0 )
- return( d4skip_index( base_ptr, num_skip ) ) ;
- else
- return( d4skip_seq( base_ptr, num_skip ) ) ;
- }
-