which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			418 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			418 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* t4index2.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved.
 | 
						|
 | 
						|
   1.  Checks to make sure dBASE Function 'RECNO()' is working while indexing.
 | 
						|
   */
 | 
						|
 | 
						|
#include  "d4all.h"
 | 
						|
#ifdef __TURBOC__
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#include  "t4test.h"
 | 
						|
 | 
						|
#ifndef S4INDEX_OFF
 | 
						|
 | 
						|
static FIELD4INFO test_fields[] =
 | 
						|
{
 | 
						|
{ "C" , 'C' , 100, 0 },
 | 
						|
{ "CN", 'C' , 10, 0 },
 | 
						|
{ "D", 'D', 8, 0 },
 | 
						|
{ "M", 'M',10, 0 },
 | 
						|
{ "N", 'N', 7, 2 },
 | 
						|
{ 0,  0, 0, 0 },
 | 
						|
} ;
 | 
						|
 | 
						|
static TAG4INFO tag_info[] =
 | 
						|
{
 | 
						|
  /* name, expression, filter, unique,descending */
 | 
						|
{ "C_TAG",  "C", 0, 0, 0 },
 | 
						|
{ "CN_TAG", "VAL(CN)", 0, 0, 0 },
 | 
						|
{ "N_TAG",  "N", "", 0, 0 },
 | 
						|
{ "D_TAG",  "D", 0, 0, 0 },
 | 
						|
{ 0,0,0,0,0 },
 | 
						|
} ;
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
static TAG4INFO tag_info2[] =
 | 
						|
{
 | 
						|
{ "C_TAG2", "C", 0, r4unique_continue, 0 },
 | 
						|
{ 0,0,0,0,0 },
 | 
						|
} ;
 | 
						|
#endif
 | 
						|
 | 
						|
CODE4 cb ;
 | 
						|
DATA4 *database ;
 | 
						|
FIELD4 *c_field, *n_field, *m_field, *d_field, *cn_field ;
 | 
						|
 | 
						|
static int do_test( long num_recs, D4DISPLAY *disp )
 | 
						|
{
 | 
						|
  TAG4 *c_tag, *d_tag, *n_tag, *cn_tag ;
 | 
						|
  long i_rec ;
 | 
						|
  char buf[1000] ;
 | 
						|
  int rc ;
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  INDEX4 *test_index ;
 | 
						|
#endif
 | 
						|
 | 
						|
  d4display_str( disp,  "Index Test (t4index2); ", 1 ) ;
 | 
						|
  disp->y += 2 ;
 | 
						|
  d4display_str( disp,  "        Number of Records: ", 1 ) ;
 | 
						|
  d4display_num( disp, num_recs, 0 ) ;
 | 
						|
 | 
						|
  cb.mem_size_sort_buffer = 0x800 ;
 | 
						|
  cb.safety = 0 ;
 | 
						|
 | 
						|
  database = d4create( &cb, "T4INDEX2", test_fields, tag_info ) ;
 | 
						|
  if ( database == 0 )
 | 
						|
    t4severe( t4err_data, "01" ) ;
 | 
						|
 | 
						|
  c_field = d4field( database, "C" ) ;
 | 
						|
  d_field = d4field( database, "D" ) ;
 | 
						|
  cn_field = d4field( database, "CN" ) ;
 | 
						|
  n_field = d4field( database, "N" ) ;
 | 
						|
  m_field = d4field( database, "M" ) ;
 | 
						|
 | 
						|
  if ( c_field == 0 || cn_field == 0 || d_field == 0 || n_field == 0 || m_field == 0 )
 | 
						|
    t4severe( t4err_field, "02" ) ;
 | 
						|
 | 
						|
  d4opt_start( &cb ) ;
 | 
						|
 | 
						|
  if ( d4check( database ) != 0 )
 | 
						|
    t4severe( t4err_check, "03" ) ;
 | 
						|
  e4exit_test( &cb ) ;
 | 
						|
  d4display_str( disp,  "Appending Record:   ", 1 ) ;
 | 
						|
 | 
						|
  for ( i_rec = 1L; i_rec <= num_recs; i_rec++ )
 | 
						|
  {
 | 
						|
    if ( d4display_quit( disp ) )
 | 
						|
      return 1 ;
 | 
						|
    if ( (i_rec % 25 == 0) || (i_rec == num_recs) )
 | 
						|
    {
 | 
						|
      disp->x = 0 ;
 | 
						|
      d4display_str( disp,  "Appending Record:   ", 0 ) ;
 | 
						|
      d4display_num( disp, i_rec, 0 ) ;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( d4append_start( database, 0 ) < 0 )
 | 
						|
      return -1 ;
 | 
						|
 | 
						|
    if (i_rec % 3 == 0 )
 | 
						|
      f4assign( c_field, "A" ) ;
 | 
						|
    else
 | 
						|
      f4assign( c_field, "B" ) ;
 | 
						|
 | 
						|
    f4assign_long( d_field, date4long( "19830208" ) + i_rec ) ;
 | 
						|
    f4assign_long( n_field, i_rec ) ;
 | 
						|
    f4assign_long( cn_field, i_rec ) ;
 | 
						|
    if ( i_rec > 5 )
 | 
						|
    {
 | 
						|
      c4ltoa45( i_rec, buf, -6 ) ;
 | 
						|
      f4memo_assign_n( m_field, buf, 6 ) ;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( d4append( database ) != 0 )
 | 
						|
      t4severe( t4err_append, "04" ) ;
 | 
						|
  }
 | 
						|
  disp->y += 2 ;
 | 
						|
  d4display_str( disp,  "          Checking Index File . . .", 1 ) ;
 | 
						|
 | 
						|
  if ( d4check( database ) != 0 )
 | 
						|
    t4severe( t4err_check, "05" ) ;
 | 
						|
 | 
						|
  c_tag = d4tag( database, "C_TAG" ) ;
 | 
						|
  if ( c_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "06" ) ;
 | 
						|
 | 
						|
  n_tag = d4tag_prev( database, c_tag ) ;
 | 
						|
  if ( n_tag )
 | 
						|
    t4severe( t4err_tag, "07" ) ;
 | 
						|
 | 
						|
  c_tag = d4tag( database, "C_TAG" ) ;
 | 
						|
  if ( c_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "08" ) ;
 | 
						|
 | 
						|
  d4tag_select( database, c_tag ) ;
 | 
						|
  if ( num_recs >= 3 )
 | 
						|
  {
 | 
						|
    if( d4seek( database, "B" ) != 0 )
 | 
						|
      t4severe( t4err_seek, "09" ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  cn_tag = d4tag_next( database, c_tag ) ;
 | 
						|
  if ( cn_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "10" ) ;
 | 
						|
  d4tag_select( database, cn_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "11" ) ;
 | 
						|
 | 
						|
  n_tag = d4tag_next( database, cn_tag ) ;
 | 
						|
  if ( n_tag == 0 )
 | 
						|
    t4severe( t4err_name, "12" ) ;
 | 
						|
  d4tag_select( database, n_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "13" ) ;
 | 
						|
 | 
						|
  n_tag = d4tag_next( database, cn_tag ) ;
 | 
						|
  if ( n_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "14" ) ;
 | 
						|
  d4tag_select( database, n_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "15" ) ;
 | 
						|
 | 
						|
  d_tag = d4tag_next( database, n_tag ) ;
 | 
						|
  if ( d_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "16" ) ;
 | 
						|
 | 
						|
  c_tag = d4tag_next( database, d_tag ) ;
 | 
						|
  if ( c_tag )
 | 
						|
    t4severe( t4err_tag, "17" ) ;
 | 
						|
 | 
						|
  d4tag_select( database, d_tag ) ;
 | 
						|
  rc =  d4seek( database, "19830210") ;
 | 
						|
  if ( num_recs > 1 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "18" ) ;
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
  d4display_str( disp,  "          Reindexing . . .", 1 ) ;
 | 
						|
  
 | 
						|
  if( d4reindex( database ) != 0 )
 | 
						|
    t4severe( t4err_reindex, "19" ) ;
 | 
						|
 | 
						|
  if ( d4check( database ) != 0 )
 | 
						|
    t4severe( t4err_reindex, "20" ) ;
 | 
						|
 | 
						|
  cn_tag = d4tag( database, "CN_TAG" ) ;
 | 
						|
  if ( cn_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "21" ) ;
 | 
						|
  d4tag_select( database, cn_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "22" ) ;
 | 
						|
 | 
						|
  n_tag = d4tag_next( database, cn_tag ) ;
 | 
						|
  if ( n_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "23" ) ;
 | 
						|
  d4tag_select( database, n_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "24" ) ;
 | 
						|
 | 
						|
  n_tag = d4tag_next( database, cn_tag ) ;
 | 
						|
  if ( n_tag == 0 )
 | 
						|
    t4severe( t4err_tag, "25" ) ;
 | 
						|
  d4tag_select( database, n_tag ) ;
 | 
						|
  rc =  d4seek_double( database, 2.0 ) ;
 | 
						|
  if (num_recs > 2 )
 | 
						|
    if ( rc != 0 || d4recno(database) != 2 )
 | 
						|
      t4severe( t4err_seek, "26" ) ;
 | 
						|
 | 
						|
  d4tag_select( database, 0 ) ;  /* use record number ordering */
 | 
						|
  if ( d4top( database ) < 0 )
 | 
						|
    return -1 ;
 | 
						|
 | 
						|
  for( i_rec = 1L; i_rec < num_recs/2; i_rec++ )
 | 
						|
  {
 | 
						|
    f4assign( c_field, "Z") ;
 | 
						|
    if ( d4skip( database, 1L ) < 0 )
 | 
						|
      t4severe( t4err_skip, "27" ) ;
 | 
						|
    if ( num_recs < 100 )
 | 
						|
      if ( d4check( database )  != 0 )
 | 
						|
        t4severe( t4err_check, "42" ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
 | 
						|
  d4display_str( disp,  "          Check of Index . . .", 1 ) ;
 | 
						|
  if ( d4check( database )  != 0 )
 | 
						|
    t4severe( t4err_check, "28" ) ;
 | 
						|
 | 
						|
  /* now reverse the process to make sure also works */
 | 
						|
  for( i_rec = num_recs / 2; i_rec > 0L; i_rec-- )
 | 
						|
  {
 | 
						|
    if ( d4go( database, i_rec ) < 0 )
 | 
						|
      t4severe( t4err_go, "29" ) ;
 | 
						|
    f4assign( c_field, "A" ) ;
 | 
						|
    if ( num_recs < 100 )
 | 
						|
      if ( d4check( database )  != 0 )
 | 
						|
        t4severe( t4err_check, "31" ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
 | 
						|
  d4display_str( disp,  "          Check of Index . . .", 1 ) ;
 | 
						|
  if ( d4check( database )  != 0 )
 | 
						|
    t4severe( t4err_check, "30" ) ;
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  test_index = i4create( database, "T4INDEXX", tag_info2 ) ;
 | 
						|
  if ( test_index == 0 )
 | 
						|
    t4severe( t4err_data, "31" ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  /* can't call d4check with this index since it has unique keys */
 | 
						|
  for ( i_rec = 1 ; i_rec <= num_recs ; i_rec++ )
 | 
						|
  {
 | 
						|
    if ( d4go( database, i_rec ) < 0 )
 | 
						|
      t4severe( t4err_go, "32" ) ;
 | 
						|
    f4assign_long( c_field, i_rec ) ;
 | 
						|
  }
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
 | 
						|
  d4display_str( disp,  "          Check of Index . . .", 1 ) ;
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  i4close( test_index ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  if ( d4check( database )  != 0 )
 | 
						|
    t4severe( t4err_check, "33" ) ;
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  test_index = i4open( database, "T4INDEXX" ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  for ( i_rec = 1 ; i_rec <= num_recs ; i_rec++ )
 | 
						|
  {
 | 
						|
    if ( d4go( database, i_rec ) < 0 )
 | 
						|
      t4severe( t4err_go, "34" ) ;
 | 
						|
    f4assign_long( c_field, 0 ) ;
 | 
						|
    if ( num_recs < 100 )
 | 
						|
      if ( d4check( database )  != 0 )
 | 
						|
        t4severe( t4err_check, "40" ) ;
 | 
						|
  }
 | 
						|
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  i4close( test_index ) ;
 | 
						|
#endif
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
 | 
						|
  d4display_str( disp,  "          Check of Index . . .", 1 ) ;
 | 
						|
  if ( d4check( database )  != 0 )
 | 
						|
    t4severe( t4err_check, "35" ) ;
 | 
						|
 | 
						|
  if ( d4close_all( &cb ) < 0 )
 | 
						|
    t4severe( t4err_close, "36" ) ;
 | 
						|
 | 
						|
  return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
static int  test_with_mem_check( long num_recs, D4DISPLAY *disp )
 | 
						|
{
 | 
						|
  d4init( &cb ) ;
 | 
						|
  cb.hWnd = (unsigned) disp->hWnd ;
 | 
						|
 | 
						|
  if ( do_test( num_recs, disp ) )
 | 
						|
    return 1 ;
 | 
						|
 | 
						|
#ifndef S4TEST_KEEP_FILES
 | 
						|
  u4remove( "T4INDEX2.dbf" ) ;
 | 
						|
#ifdef N4OTHER
 | 
						|
  u4remove( "T4INDEX2.CGP" ) ;
 | 
						|
#endif
 | 
						|
#ifdef S4MDX
 | 
						|
  u4remove( "T4INDEX2.mdx" ) ;
 | 
						|
#endif
 | 
						|
#ifdef S4FOX
 | 
						|
  u4remove( "T4INDEX2.cdx" ) ;
 | 
						|
  u4remove( "T4INDEX2.fpt" ) ;
 | 
						|
#else
 | 
						|
  u4remove( "T4INDEX2.dbt" ) ;
 | 
						|
#endif
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  u4remove( "C_TAG.NTX" ) ;
 | 
						|
  u4remove( "CN_TAG.NTX" ) ;
 | 
						|
  u4remove( "N_TAG.NTX" ) ;
 | 
						|
  u4remove( "D_TAG.NTX" ) ;
 | 
						|
  u4remove( "T4INDEXX.DBF" ) ;
 | 
						|
  u4remove( "T4INDEXX.CGP" ) ;
 | 
						|
  u4remove( "C_TAG2.NTX" ) ;
 | 
						|
#endif
 | 
						|
#ifdef S4NDX
 | 
						|
  u4remove( "C_TAG.NDX" ) ;
 | 
						|
  u4remove( "CN_TAG.NDX" ) ;
 | 
						|
  u4remove( "N_TAG.NDX" ) ;
 | 
						|
  u4remove( "D_TAG.NDX" ) ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
  d4init_undo(&cb) ;
 | 
						|
  mem4reset() ;
 | 
						|
 | 
						|
#ifdef S4DEBUG
 | 
						|
  mem4check_memory() ;
 | 
						|
 | 
						|
#ifndef S4DLL
 | 
						|
  if ( mem4free_check(100) != 0 )
 | 
						|
    t4severe( t4err_memory, "37" ) ;
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
  return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
int S4FUNCTION t4test( D4DISPLAY *disp )
 | 
						|
{
 | 
						|
  long num_recs ;
 | 
						|
 | 
						|
#ifdef S4INDEX_OFF
 | 
						|
  disp->y += 2 ;
 | 
						|
  d4display_str( disp, "T4INDEX2:   REQUIRES INDEXING (S4INDEX_OFF DEFINED)", 1) ;
 | 
						|
  d4display_str( disp, "", 1) ;
 | 
						|
  return 1 ;
 | 
						|
#else
 | 
						|
#ifdef S4NO_PARMS
 | 
						|
  num_recs = 500 ;
 | 
						|
#else
 | 
						|
  num_recs = atol( d4parsestring_nparm( &disp->parse_str ) ) ;
 | 
						|
  
 | 
						|
  if (num_recs == 0)
 | 
						|
    t4severe( t4err_parm, "38" ) ;
 | 
						|
#endif
 | 
						|
  
 | 
						|
#ifdef S4CLIPPER
 | 
						|
  if ( test_with_mem_check( 9, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( 21, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( 45, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
 | 
						|
  if ( test_with_mem_check( 51, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( 54, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( 90, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( 400, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
#endif
 | 
						|
  
 | 
						|
  if ( test_with_mem_check( num_recs, disp ) )
 | 
						|
    e4exit(&cb) ;
 | 
						|
 | 
						|
  disp->y += 2 ;
 | 
						|
  d4display_str( disp, "T4INDEX2:   SUCCESS", 1) ;
 | 
						|
  d4display_str( disp, "", 1) ;
 | 
						|
  return 1 ;
 | 
						|
#endif
 | 
						|
}
 |