campo-sirio/cb5/t4mul.c
alex a0f5e0898b This commit was generated by cvs2svn to compensate for changes in r975,
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
1995-02-06 15:33:45 +00:00

1202 lines
26 KiB
C
Executable File

/* t4mul.c (c)Copyright Sequiter Software Inc., 1990-1993. All rights reserved. */
/* Tests Code Base multi-user. */
/* Run program from exactly two workstations. */
/* OR run program from exactly one Windows station */
#include "d4all.h"
#ifdef __TURBOC__
#pragma hdrstop
#endif
#include "t4test.h"
#ifndef S4INDEX_OFF
#ifdef S4WINDOWS
/* currently just exclude conio */
#else
#ifdef S4UNIX
#ifdef S4CURSES
/* #include <curses.h> */
#else
/* #include <tinfo.h> */
#endif
#else
#include <conio.h>
#endif
#endif
#define WORK_WIDTH 10
static FIELD4INFO co_fields[] =
{
{ "COMMAND", 'C', WORK_WIDTH,0 },
{ "PARM", 'C', 8, 0 },
{ 0,0,0,0 },
} ;
static FIELD4INFO wo_fields[] =
{
{ "WORK", 'C', WORK_WIDTH,0 },
{ 0,0,0,0 },
} ;
static TAG4INFO wo_tags_one[] =
{
{ "TAG1", "WORK", 0,0,0 },
{ "TAG2", "WORK", 0,0,0 },
{ 0,0,0,0,0 },
} ;
static TAG4INFO wo_tags_two[] =
{
{ "TAG3", "WORK", 0,0,0 },
{ "TAG4", "WORK", 0,0,0 },
{ 0,0,0,0,0 },
} ;
static FIELD4INFO result_fields[] =
{
{ "RESULT", 'C', 8,0 },
{ 0,0,0,0 },
} ;
#ifdef S4LOG
static FIELD4INFO log_fields[] =
{
{ "ID", 'C', 12,0 },
{ "LOG1", 'C', 20,0 },
{ "LOG2", 'C', 20,0 },
{ 0,0,0,0 },
} ;
#endif
D4DISPLAY *disp ;
CODE4 cb;
DATA4 *co_ptr, *wo_ptr, *re_ptr ;
DATA4 *log_ptr = 0 ;
INDEX4 *w1_ptr, *w2_ptr ;
FIELD4 *command_field, *parm, *work, *result, *log_id, *logic1, *logic2 ;
char *log_id_ptr = 0 ;
char seek_str[WORK_WIDTH+1] ;
int rc ;
static int send_com( char *, char *) ;
static int int_ret( long, int ) ;
static void ch_base_locked( long,int);
static int command_sender(void) ;
static int work_doer(void) ;
static void d_lock(void) ;
static void d_seek(void) ;
static void d_skip(void) ;
static void d_write(void) ;
static void d_append(void) ;
static void d_unlock(void) ;
static void i_lock(void) ;
static void d_append_one(void) ;
static int seek_recs( long ) ;
static int write_recs( long ) ;
static int append_recs( long ) ;
static int skip_recs( long ) ;
static int result_int( int) ;
int test_multi( void ) ;
static int test_with_mem_check( void ) ;
#ifdef S4WINDOWS
/* transfer control */
static int t4sleep( long dummy )
{
if ( PeekMessage( &disp->msg, disp->hWnd, 0, 0, PM_NOREMOVE ) )
{
if ( disp->msg.message == 275 ) /* remove the timer messages */
{
if ( !GetMessage( &disp->msg, disp->hWnd, 0, 0 ) )
return 1 ;
}
else
{
if ( !GetMessage( &disp->msg, disp->hWnd, 0, 0 ) )
return 1 ;
TranslateMessage( (LPMSG)&disp->msg ) ;
if( disp->msg.message == WM_DESTROY )
return -1 ;
DispatchMessage( (LPMSG)&disp->msg ) ;
}
}
return 0 ;
}
#else
static int t4sleep(long) ;
#endif
/* Number of Records per Buffer for T4MUL_WO.dbf */
#define REC_PER_BUF 2L
extern void logger( char *, char * ) ;
int first = 1 ;
int in_logger = 0 ;
void logger( char *p1, char *p2 )
{
if ( in_logger || log_ptr == 0 )
return ;
in_logger = 1 ;
if ( d4lock_file( log_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( first )
{
first = 0 ;
if ( d4zap( log_ptr, 1L, d4reccount( log_ptr ) ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
}
if ( d4append_start(log_ptr, 0) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( log_id_ptr == (char *) 0 )
f4assign( log_id, "UNKNOWN" ) ;
else
f4assign( log_id, log_id_ptr ) ;
f4assign( logic1, p1 ) ;
f4assign( logic2, p2 ) ;
if ( d4append( log_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4flush( log_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4unlock( log_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
in_logger = 0 ;
}
#ifdef S4OS2
extern unsigned far pascal DOSSLEEP ( unsigned long );
static int t4sleep( long n_ms )
{
DOSSLEEP( (unsigned long) n_ms ) ;
return 0 ;
}
#else
#ifndef S4WINDOWS
static int t4sleep( long n_ms )
{
while( n_ms-- > 0 ) ;
return 0 ;
}
#endif
#endif
int test_multi()
{
int rc ;
#ifdef S4WINDOWS
cb.lock_attempts = 1 ; /* don't lock up a Window's application */
#endif
cb.open_error = 0 ;
#ifdef N4OTHER
cb.auto_open = 0 ;
#endif
co_ptr = d4open( &cb, "T4MUL_CO" ) ;
if ( co_ptr == 0 )
{
if ( cb.error_code == r4no_open )
{
d4display_str( disp, " Creating T4MUL_CO . . . ", 1 ) ;
co_ptr = d4create( &cb, "T4MUL_CO", co_fields, 0 ) ;
if ( co_ptr == 0 )
e4severe( e4result, "t4mul.c" ) ;
}
else
e4severe( e4result, "t4mul.c" ) ;
}
command_field = d4field( co_ptr, "COMMAND" ) ;
parm = d4field( co_ptr, "PARM" ) ;
if ( command_field == 0 || parm == 0 )
e4severe( e4result, "t4mul.c" ) ;
wo_ptr = d4open( &cb, "T4MUL_WO" ) ;
if (wo_ptr == 0 )
{
if ( cb.error_code == r4no_open )
{
d4display_str( disp, " Creating T4MUL_WO . . . ", 1 ) ;
wo_ptr = d4create( &cb, "T4MUL_WO", wo_fields, 0 ) ;
if ( wo_ptr == 0 )
e4severe( e4result, "t4mul.c" ) ;
}
else
e4severe( e4result, "t4mul.c" ) ;
}
work = d4field( wo_ptr, "WORK" ) ;
if ( work == 0 )
e4severe( e4result, "t4mul.c" ) ;
re_ptr = d4open( &cb, "T4MUL_RE" ) ;
if (re_ptr == 0 )
{
if ( cb.error_code == r4no_open )
{
re_ptr = d4create( &cb, "T4MUL_RE", result_fields, 0 ) ;
if ( re_ptr == 0 )
e4severe( e4result, "t4mul.c" ) ;
d4display_str( disp, " Creating T4MUL_RE . . . ", 1 ) ;
}
else
e4severe( e4result, "t4mul.c" ) ;
}
result = d4field( re_ptr, "RESULT" ) ;
if ( result == 0 )
e4severe( e4result, "t4mul.c" ) ;
#ifdef S4LOG
if ( log_ptr = d4open( &cb, "T4MUL_LO" ) == 0 )
{
if ( cb.error_code == r4no_open )
{
d4display_str( disp, " Creating T4MUL_LO . . . ", 1 ) ;
log_ptr = d4create( &cb, "T4MUL_LO", log_fields, 0 ) ;
if ( log_ptr == 0 )
e4severe( e4result, "t4mul.c" ) ;
}
else
e4severe( e4result, "t4mul.c" ) ;
}
log_id = d4field( log_ptr, "ID" ) ;
logic1 = d4field( log_ptr, "LOG1" ) ;
logic2 = d4field( log_ptr, "LOG2" ) ;
logger( "First Log", "" ) ;
#endif
d4display_str( disp, " Databases Open. ", 1 ) ;
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( (rc = d4lock_file( wo_ptr )) < 0 )
e4severe( e4result, "t4mul.c" ) ;
#ifndef S4WINDOWS
cb.lock_attempts = -1 ;
#endif
if ( rc == r4locked )
{
log_id_ptr = "Commander" ;
d4display_str( disp, " Commander Session. ", 1 ) ;
if ( d4zap( co_ptr, 1L, d4reccount( co_ptr ) ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
for (;;)
{
if ( d4refresh( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4reccount( re_ptr ) == 0L )
break ;
if ( t4sleep( 50 ) < 0 )
return -1 ;
}
for (;;)
{
if ( d4refresh( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4reccount( re_ptr ) > 0L )
break ;
if ( d4refresh( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4reccount( co_ptr ) == 0L )
if ( send_com("UNLOCK ALL", "-1" ) )
return 1 ;
if ( t4sleep( 50 ) < 0 )
return -1 ;
}
if ( command_sender() )
return 1 ;
d4display_str( disp, " Commander Finished. ", 1 ) ;
}
else
{
log_id_ptr = "Worker " ;
d4display_str( disp, " Worker Session. ", 1 ) ;
if ( d4zap( wo_ptr, 1L, d4reccount( wo_ptr )) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4zap( re_ptr, 1L, d4reccount( re_ptr ) ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if (d4zap( co_ptr, 1L, d4reccount( co_ptr ) ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
cb.safety = 0 ;
w1_ptr = i4create( wo_ptr, "T4MUL_W1", wo_tags_one ) ;
if ( w1_ptr == 0 )
e4severe( e4result, "t4mul.c: i4create" ) ;
w2_ptr = i4create( wo_ptr, "T4MUL_W2", wo_tags_two ) ;
if ( w2_ptr == 0 )
e4severe( e4result, "t4mul.c: i4create" ) ;
cb.safety = 1 ;
if ( d4unlock( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4unlock( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( work_doer() )
return 1 ;
d4display_str( disp, " Worker Finished. ", 1 ) ;
}
if ( d4close_all( &cb ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
#ifdef L4LOCK_CHECK
if ( l4lock_check() != 0 )
e4severe( e4result, "Not everything was unlocked" ) ;
#endif
if ( cb.error_code < 0 )
e4severe( e4result, "t4mul.c: cb.error_code" ) ;
return 0 ;
}
static int send_com( char *com, char *com_parm )
{
if ( d4display_quit( disp ) ) return 1 ;
d4display_str( disp, " Sending- Command: ", 1 ) ;
d4display_str( disp, com, 0 ) ;
d4display_str( disp, " Parm: ", 1 ) ;
d4display_str( disp, com_parm, 0 ) ;
d4display_str( disp, " ", 1 ) ;
if ( d4lock_file( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4append_start( co_ptr, 0 ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
f4assign( command_field, com ) ;
f4assign( parm, com_parm ) ;
if ( d4append( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4flush( co_ptr ) != 0 )
e4severe( e4result, (char *) 0 ) ;
if ( d4unlock( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
return 0 ;
}
static int int_ret( long rec, int val )
{
if ( d4display_quit( disp ) )
return 1 ;
d4display_str( disp, " Getting Return Record . . . ", 1 ) ;
d4display_num( disp, rec, 0 ) ;
if ( d4unlock( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4refresh( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
while ( d4reccount( re_ptr ) < rec )
{
if ( t4sleep(50) < 0 )
return -1 ;
if ( d4refresh( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
}
if ( d4go( re_ptr, (long)rec ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( f4int( result ) != val )
e4severe( e4result, "t4mul.c" ) ;
if ( d4unlock( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
d4display_str( disp, " Received.", 1 ) ;
return 0 ;
}
/* Check the locks
Ran on worker data file to determine what locks another station
has put on the worker data file. This station none on the worker
data file when this routine is called.
rec_cd - That Record Should be Locked
- If zero, no specific record is locked
- If the entire file should be is locked, this must be zero
file_cd - Neg one and the whole file should be locked.
- Zero and the reccount byte should be locked.
- One and nothing is locked except perhaps a record.
*/
static void ch_base_locked( long rec_cd, int file_cd )
{
int rc ;
d4display_str( disp, " Checking Database Locks . . .", 1 ) ;
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
rc = d4lock_file( wo_ptr ) ;
if ( rc < 0 )
e4severe( e4result, "t4mul.c: d4lock_file" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( rc == r4locked )
{
if ( rec_cd == 0 && file_cd == 1 )
e4severe( e4result, "t4mul.c: Lock Error 0" ) ;
}
else
{
if (rec_cd != 0L || file_cd != 1 )
e4severe( e4result, "t4mul.c: Lock Error 1" ) ;
}
if ( (rc = d4lock_append( wo_ptr ) ) < 0 )
e4severe( e4result, "t4mul.c: d4lock_append" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
/* If record count bytes can be locked, 'worker' cannot have
the whole file locked. In addition, if the record count
bytes cannot be locked, they better not be unlocked. */
if ( rc == 0 && file_cd <= 0 || rc == r4locked && file_cd == 1 )
e4severe( e4result, "t4mul.c: Lock Error 2" ) ;
if ( d4reccount( wo_ptr ) > 0L )
{
if ( (rc = d4lock( wo_ptr, 1L)) < 0 )
e4severe( e4result, "t4mul.c: d4lock" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
/* If record one can be locked, 'worker' cannot have the whole
file locked. If they cannot be locked, they better not be locked. */
if ( rc == 0 && (file_cd == -1 || rec_cd == 1L) || rc == r4locked && file_cd != -1 && rec_cd != 1L)
e4severe( e4result, "t4mul.c: Lock Error 3" ) ;
}
if ( rec_cd > 0L )
{
/* If 'worker' has locked the record, we better not be able to lock it. */
if ( (rc = d4lock( wo_ptr, rec_cd)) < 0 )
e4severe( e4result, "t4mul.c: d4lock" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( rc == 0 )
e4severe( e4result, "t4mul: Lock Error 4" ) ;
}
#ifndef S4WINDOWS
cb.lock_attempts = -1 ;
#endif
}
static int command_sender()
{
int i ;
long count, r ;
r = 1L ;
if ( int_ret(r++, 0 ) ) return 1 ;
ch_base_locked(0L, 1) ;
/* Lock the work database, it will not be unlocked until
the index files have been created. */
d4lock_file( wo_ptr ) ;
if ( d4opt_suspend( &cb ) != 0 )
e4severe( e4result, "t4mul" ) ;
w1_ptr = i4open( wo_ptr, "T4MUL_W1" ) ;
w2_ptr = i4open( wo_ptr, "T4MUL_W2" ) ;
if ( w1_ptr == 0 || w2_ptr == 0 )
e4severe( e4result, "t4mul" ) ;
d4opt_start( &cb ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
/* Lock an array of records */
if ( send_com("LOCK 1,3,8", "0" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(1L, 1 ) ;
ch_base_locked(3L, 1 ) ;
if ( send_com("LOCK APPEN", "0" ) )
return 1;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 0) ;
if ( send_com("UNLOCK APP", "0" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 1) ;
if ( send_com("LOCK FILE", "-1" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, -1) ;
if ( send_com("UNLOCK FIL", "-1" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked( 0L, 1 ) ;
if ( send_com("I4LOCK", "" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
/* Check to make sure the index file is locked. */
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( i4lock( w1_ptr ) != (int)r4locked )
e4severe( e4result, "t4mul: Index Locking" ) ;
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( send_com("UNLOCK ALL", "-1" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 1) ;
/* Check to make sure the index file is unlocked. */
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( i4lock( w1_ptr ) != 0 )
e4severe( e4result, "t4mul: Index Locking" ) ;
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
for ( i=1; i<= 40; i++ )
{
if ( send_com("APPEND ONE", "1" ) )
return 1 ;
if ( int_ret(r++, i ) )
return 1 ;
if ( d4refresh( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
count = d4reccount( wo_ptr ) ;
if ( count != (long) i )
e4severe( e4result, "t4mul: Count" ) ;
}
if ( send_com("UNLOCK ALL", "0" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 1) ;
if ( d4check( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c " ) ;
if ( d4unlock_data( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c " ) ;
for ( i=1; i<= 40; i++ )
{
if ( d4go( wo_ptr, (long) i ) != 0 )
e4severe( e4result, "t4mul" ) ;
if ( f4long(work) != (long) i )
e4severe( e4result, "t4mul: Append Check" ) ;
}
if ( d4zap( wo_ptr, 1L, d4reccount( wo_ptr ) ) != 0 )
e4severe( e4result, "t4mul" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
if ( send_com("D4APPEND", "20" ) )
return 1 ;
append_recs(20L ) ;
if ( int_ret(r++, 0 ) )
return 1 ;
if ( d4refresh( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
if ( d4reccount( wo_ptr ) != 40 )
e4severe( e4result, "t4mul: Wrong Count" ) ;
if ( send_com("LOCK APPEN", "0" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 0) ;
if ( send_com("D4LOCK", "5" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(5L, 0 ) ;
if ( send_com("LOCK APPEN", "0" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(5L, 0) ;
if ( send_com("D4UNLOCK", "0" ) ) /* mean unlock records only */
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 0 ) ;
if ( send_com("D4LOCK", "2" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(2L, 0 ) ;
if ( send_com("D4UNLOCK", "1" ) ) /* mean unlock records only */
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 0 ) ;
if ( send_com("D4LOCK", "5" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(5L, 0 ) ;
if ( send_com("UNLOCK ALL", "-1" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, 1) ;
/* Test Dirty Read. */
if ( send_com("LOCK FILE", "-1" ) )
return 1 ;
if ( int_ret(r++, 0 ) )
return 1 ;
ch_base_locked(0L, -1) ;
cb.read_lock = 0 ;
if ( d4go( wo_ptr, 5L ) != 0 )
e4severe( e4result, "t4mul: Dirty Read" ) ;
cb.read_lock = 1 ;
if ( f4long(work) != 5L )
e4severe( e4result, "t4mul: Dirty Read 2" ) ;
/* Test Lock Wait. */
#ifndef S4WINDOWS
cb.lock_attempts = 1 ;
#endif
if ( d4go( wo_ptr, 5L ) != r4locked )
e4severe( e4result, "t4mul: Lock Wait" ) ;
#ifndef S4WINDOWS
cb.lock_attempts = -1 ;
#endif
cb.read_lock = 0 ;
if ( send_com("D4SKIP", "1" ) )
return 1 ;
skip_recs(-1L ) ;
if ( int_ret(r++, 0 ) )
return 1 ;
if ( send_com("D4WRITE", "20" ) ) /* Write Records 1 through 4 many times. */
return 1 ;
write_recs(-20L ) ; /* Write Records Backwards. */
if ( int_ret(r++, 0 ) )
return 1 ;
if ( send_com("D4WRITE", "20" ) ) /* Write Records 1 through 4 many times. */
return 1 ;
skip_recs(-1L ) ;
if ( int_ret(r++, 0 ) )
return 1 ;
if ( send_com("D4SEEK", "20" ) )
return 1 ;
skip_recs(-1L ) ;
if ( int_ret(r++, 0 ) )
return 1 ;
if ( send_com("D4SEEK", "-20" ) )
return 1 ;
write_recs( 20L ) ;
if ( int_ret(r++, 0 ) )
return 1 ;
if ( d4check( wo_ptr ) < 0 )
e4severe( e4result, "t4mul: Check 1" ) ;
if ( send_com("DONE", "" ) )
return 1 ;
return 0 ;
}
static int seek_recs( long n )
{
long i ;
long on_rec, direc ;
direc = 1L ;
if ( n < 0 )
{
direc = -1L ;
n = -n ;
}
d4display_str( disp, " Seek Number Recs: ", 1 ) ;
d4display_num( disp, n, 0 ) ;
d4display_str( disp, " Seeking Record: ", 1 ) ;
for ( i = on_rec = 1L; i<= n; i++)
{
disp->x = (int) 0 ;
d4display_str( disp, " Seeking Record: ", 0 ) ;
d4display_num( disp, on_rec, 0 ) ;
c4ltoa45( on_rec, seek_str, (int) WORK_WIDTH ) ;
seek_str[WORK_WIDTH] = 0 ;
if ( d4seek( wo_ptr, seek_str) != 0 )
e4severe( e4result, "t4mul.c: d4seek" ) ;
if ( d4recno( wo_ptr ) != on_rec )
e4severe( e4result, "t4mul: d4seek_double" ) ;
on_rec += direc ;
if ( on_rec < 1L )
on_rec = d4reccount( wo_ptr ) ;
if ( on_rec > d4reccount( wo_ptr ))
on_rec = 1L ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
}
return 0 ;
}
static int write_recs( long n )
{
long i ;
long on_rec, direc ;
direc = 1L ;
if ( n < 0 )
{
direc = -1L ;
n = -n ;
}
d4display_str( disp, " ", 1 ) ;
for ( on_rec = i=1L; i<= n; on_rec += direc, i++)
{
if ( on_rec < 1L ) on_rec = 20L ;
if ( on_rec > 20L ) on_rec = 1L ;
disp->x = (int) 0 ;
d4display_str( disp, " Iteration: ", 0 ) ;
d4display_num( disp, i, 0 ) ;
d4display_str( disp, " Record: ", 0 ) ;
d4display_num( disp, on_rec, 0 ) ;
d4display_str( disp, " ", 1 ) ;
if ( d4go( wo_ptr, on_rec ) != 0 )
e4severe( e4result, "t4mul" ) ;
f4assign_long( work, on_rec ) ;
if ( d4flush( wo_ptr ) != 0 )
e4severe( e4result, (char *) 0 ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
}
return 0 ;
}
static void d_append_one()
{
d4display_str( disp, "Append One Next", 1 ) ;
if ( d4refresh( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
if ( d4append_start( wo_ptr, 0 ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
f4assign_long( work, d4reccount(wo_ptr) + 1L) ;
if ( d4append( wo_ptr ) < 0 )
e4severe( e4result, "t4mul.c " ) ;
if ( d4flush( wo_ptr ) != 0 )
e4severe( e4result, (char *) 0 ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
result_int( (int) d4reccount( wo_ptr ) ) ;
}
static int append_recs( long n )
{
long i ;
d4display_str( disp, " Appending Total: ", 1 ) ;
d4display_num( disp, n, 0 ) ;
d4display_str( disp, " Appending: ", 1 ) ;
for ( i=1L; i<= n; i++ )
{
disp->x = (int) 0 ;
d4display_str( disp, " Appending: ", 0 ) ;
d4display_num( disp, i, 0 ) ;
if ( d4append_blank( wo_ptr ) < 0 )
e4severe( e4result, "t4mul.c " ) ;
f4assign_long( work, d4recno(wo_ptr) ) ;
if ( d4flush( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( t4sleep( 50 ) < 0 )
return -1 ;
}
if ( d4check( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c " ) ;
if ( d4unlock_data( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c " ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
return 0 ;
}
static int skip_recs( long direc )
{
d4display_str( disp, " Skipping Direction: ", 1 ) ;
d4display_num( disp, direc, 0 ) ;
if ( d4refresh( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
#ifdef S4WINDOWS
while ( d4lock_file( wo_ptr ) == r4locked ) /* until free */
if ( t4sleep(50) < 0 ) return - 1 ;
#endif
if ( direc < 0 )
{
direc = -1L ;
if ( d4bottom( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
}
else
{
direc = 1L ;
if ( d4top( wo_ptr ) != 0 )
e4severe( e4result, "t4mul" ) ;
}
d4display_str( disp, " Record On: ", 1 ) ;
for(;;)
{
disp->x = (int) 0 ;
d4display_str( disp, " Record On: ", 0 ) ;
d4display_num( disp, d4recno( wo_ptr ), 0 ) ;
if ( d4skip( wo_ptr, direc ) < 0 )
if ( !d4bof( wo_ptr ) && !d4eof( wo_ptr ) )
e4severe( e4result, "t4mul" ) ;
if ( f4long(work) != d4recno( wo_ptr ) )
if ( ! d4eof( wo_ptr ) )
e4severe( e4result, "t4mul" ) ;
if ( d4unlock( wo_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4bof( wo_ptr ) || d4eof( wo_ptr ) )
{
if ( d4recno( wo_ptr ) != 1L && d4recno( wo_ptr ) != d4reccount( wo_ptr )+1L )
e4severe( e4result, "t4mul" ) ;
return 0 ;
}
}
}
static int result_int( int i )
{
if ( d4lock_file( re_ptr ) < 0 )
e4severe( e4result, "t4mul.c " ) ;
if ( d4append_start( re_ptr, 0 ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
f4assign_int( result, i ) ;
if ( d4append( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4flush( re_ptr ) != 0 )
e4severe( e4result, (char *) 0 ) ;
if ( d4unlock( re_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
return i ;
}
static void d_lock()
{
result_int( d4lock( wo_ptr, f4long(parm) ) ) ;
}
static void d_lock_append()
{
result_int( d4lock_append( wo_ptr ) ) ;
}
static void d_lock_file()
{
result_int( d4lock_file( wo_ptr ) ) ;
}
static void d_lock_138()
{
long a[3] ;
a[0] = 1L ;
a[1] = 3L ;
a[2] = 8L ;
result_int( d4lock_group( wo_ptr, a, 3) ) ;
}
static void d_unlock()
{
result_int( d4unlock_records( wo_ptr ) ) ;
}
static void d_unlock_append()
{
result_int( d4unlock_append( wo_ptr ) ) ;
}
static void d_unlock_all()
{
result_int( d4unlock( wo_ptr ) ) ;
}
static void d_unlock_file()
{
result_int( d4unlock_file( wo_ptr ) ) ;
}
static void d_seek()
{
result_int( seek_recs( f4long(parm) )) ;
}
static void d_skip()
{
result_int( skip_recs( f4long(parm) )) ;
}
static void d_write()
{
result_int( write_recs( f4long(parm) )) ;
}
static void d_append()
{
result_int( append_recs( f4long(parm) )) ;
}
static void i_lock()
{
result_int( i4lock( w1_ptr )) ;
}
typedef struct list_st
{
char work[WORK_WIDTH+1] ;
void (*f)() ;
} LIST ;
LIST list[] =
{
{ "D4LOCK ", d_lock },
{ "LOCK APPEN", d_lock_append },
{ "LOCK FILE ", d_lock_file },
{ "LOCK 1,3,8", d_lock_138 },
{ "D4UNLOCK ", d_unlock },
{ "UNLOCK ALL", d_unlock_all },
{ "UNLOCK FIL", d_unlock_file },
{ "UNLOCK APP", d_unlock_append },
{ "D4SEEK ", d_seek },
{ "D4SKIP ", d_skip },
{ "D4WRITE ", d_write},
{ "D4APPEND ", d_append},
{ "I4LOCK ", i_lock},
{ "APPEND ONE", d_append_one},
{ "", 0 },
} ;
static int work_doer()
{
long co_rec ;
int i ;
d4opt_start( &cb ) ;
d4display_str( disp, " Received Command: ", 1 ) ;
for ( co_rec = 1L;;)
{
if ( d4display_quit( disp ) )
return 1 ;
/* Get a Command */
if ( d4refresh( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4reccount( co_ptr ) < co_rec )
{
if ( t4sleep( 50 ) < 0 )
return -1 ;
continue ;
}
if ( d4go( co_ptr, co_rec++ ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
if ( d4unlock( co_ptr ) != 0 )
e4severe( e4result, "t4mul.c" ) ;
disp->x = (int) 0 ;
d4display_str( disp, " Received Command: ", 0 ) ;
d4display_str( disp, f4str(command_field), 1 ) ;
d4display_str( disp, " Parameter: ", 0 ) ;
d4display_str( disp, f4str(parm), 1 ) ;
for ( i=0;; i++ )
{
if ( list[i].work[0] == '\0' )
{
if ( memcmp( f4ptr(command_field), "DONE", 4 ) == 0 )
return 0 ;
e4severe( e4result, "Unrecognized Command" ) ;
}
else
{
if ( strcmp( f4str(command_field), list[i].work ) == 0 )
{
#ifdef __TURBOC__
#pragma warn -pro
#endif
(*list[i].f)() ;
#ifdef __TURBOC__
#pragma warn .pro
#endif
break ;
}
}
}
}
}
static int test_with_mem_check()
{
d4init( &cb ) ;
cb.hWnd = (unsigned) disp->hWnd ;
#ifdef S4DLL
cb.hInst = (unsigned) disp->hInst ;
#endif
if ( test_multi() )
return 1 ;
d4init_undo( &cb ) ;
mem4reset() ;
#ifdef S4DEBUG
mem4check_memory() ;
#ifndef S4DLL
if ( mem4free_check(100) != 0 )
e4severe( e4result, "t4mul.c: Memory items not freed" ) ;
#endif
#endif
return 0 ;
}
#endif
int S4FUNCTION t4test( D4DISPLAY *display )
{
#ifdef S4INDEX_OFF
display->y += 2 ;
d4display_str( display, "T4MUL: REQUIRES INDEXING (S4INDEX_OFF DEFINED)", 1) ;
d4display_str( display, "", 1) ;
return 1 ;
#else
d4display_str( display, "T4MUL Test ", 1 ) ;
d4display_str( display, " ", 1 ) ;
if ( test_with_mem_check() )
e4exit( &cb ) ;
display->y += 2 ;
d4display_str( display,"T4MUL: SUCCESS", 1) ;
d4display_str( display, "", 1) ;
return 1 ;
#endif
}