.ad 8
.bm 8
.fm 4
.bt $Copyright (c) 1995-2004 SAP AG$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $SQL$Project Distributed Database System$vni55c$
.tt 2 $$$
.tt 3 $$$1995-08-01$
***********************************************************
.nf

.nf


    ========== licence begin  GPL
    Copyright (c) 1995-2004 SAP AG

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    ========== licence end

.fo


.fo
.nf
.sp
Module  :
=========
.sp
Purpose :
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :

.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :

.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :

.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  : 
.sp
.cp 3
Created : 1995-08-01
.sp
.cp 3
\Version : 1995-08-01
.sp
.cp 3
\Release :      Date :
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification: mpveri (Steuerprogramm fuer multiples Verify)

.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:

.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:

.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :

#include <stdlib.h>
#include <stdio.h>


#ifdef WIN32
	#include <windows.h>
	#include <io.h>

	#ifdef PC_COMPILED
		#include <vox00c.h>
	#endif
#else
	#include <unistd.h>
	#include <sys/wait.h>
#endif

#include <signal.h>
#include <sys/types.h>
#include <errno.h>


#ifdef WIN32
#define sleep(d)	Sleep(1000*(d))

#define	F_OK		0
#define	W_OK		2
#define	R_OK		4
#define	RW_OK		6

#endif

int WaitForEndOfVerifyProgs ( unsigned i );
void usage();
void CatResultFilesAndDelete ( unsigned i );
int DelFiles ( unsigned i );
void KillAllProcs ( int );
int StartVerifyProgs ( int i, int verify );

int		grc	= 0 ;
int		killed = 0 ;
int		R3 = 0 ;

void    MakeSapEntry ( int grc) ;
#ifdef WIN32
typedef DWORD	TPID;		// Declaration of a common process-id type
#define	TPID_ERROR		0L
TPID	pids[50] ;
#else
int		pids [50] ;
#endif

char	dbroot [100] ;
char	*dbr ;
int		updcol = 0 ;
int		verify = 0 ;
char	*uncond = " " ;
char	*estimate = " " ;
int		bestimate = 0 ;
int		buncond = 0 ;

EXEC SQL BEGIN DECLARE SECTION ;

#define KNL_IDENTIFIER_LEN 64
#define KNL_IDENTIFIER_LEN_C 65

char    startdate [11] ;
char    starttime [7] ;
char	*c2 ;
char	savidc [7] ;
int		savidc_indicator ;
int		savidi ;
EXEC SQL END DECLARE SECTION ;

/* PTS 1109836 */
#define SAMPLES_TO_SET_DEFAULT 20000
/* --------------------------------------- */

/* --------------------------------------- */
static void CPCErrorHandling( char *Stmt,
							  char *Action,
							  int  CPCErrorCode)
{
	if ( CPCErrorCode != 0 )
	{
		printf("CMD: '%s'\n", Stmt);
		printf("Error %d during action: '%s'\n", CPCErrorCode, Action);
        printf("Program aborts ...\n");
		exit(1);
	}
}
/* --------------------------------------- */

static void BuildSelectFromDomainDotTablesCmd ( char *ToSelect,
		  									    char *SampleCondition ,
												char *SampleStrategy,
												int  SamplesToSet,
											    char *SelectCmd )
{
	sprintf ( SelectCmd, "SELECT %s FROM DOMAIN.TABLES "\
           	             "WHERE OWNER in (USER, USERGROUP) AND "\
                         "( TYPE = 'TABLE' ) AND "\  
                         "( SAMPLE_%s IS NULL OR SAMPLE_%s %s %d) AND "\
                         "TABLENAME NOT LIKE 'JOC$'",
                         ToSelect, SampleStrategy, SampleStrategy, SampleCondition, SamplesToSet );

}

/* --------------------------------------- */
static int AlterTableSampleRows20000(char *Param,
									 int   SampleValToSet)
{
	int rc = 0 ;
	int NumTabsFound = 0 ;
    char *SampleCondition = strcmp(Param,"-R") == 0 ? "<>" : "<" ;
	char *SampleStrategy  = SampleValToSet <= 100 ? "PERCENT" : "ROWS" ;

    EXEC SQL BEGIN DECLARE SECTION ;
	int  NumTablesToModify;
    char TableToModify [KNL_IDENTIFIER_LEN_C] ;
    char Cmd [ 1024 ] ;
    EXEC SQL END DECLARE SECTION ;

    BuildSelectFromDomainDotTablesCmd( "count(*)", SampleCondition, SampleStrategy, SampleValToSet, Cmd ) ;

    EXEC SQL CONNECT;
    CPCErrorHandling( "EXEC SQL CONNECT", "CONNECT", rc = sqlca.sqlcode ) ;

    EXEC SQL PREPARE PREP_SEL_FROM_DOM FROM :Cmd;
	CPCErrorHandling( Cmd, "PREPARE", rc = sqlca.sqlcode ) ;
    EXEC SQL DECLARE SEL_FROM_DOM CURSOR FOR PREP_SEL_FROM_DOM;
	CPCErrorHandling( Cmd, "DECLARE", rc = sqlca.sqlcode ) ;
    EXEC SQL OPEN SEL_FROM_DOM ;
	CPCErrorHandling( Cmd, "OPEN CURSOR", rc = sqlca.sqlcode ) ;
	EXEC SQL FETCH SEL_FROM_DOM INTO :NumTablesToModify ;  
	CPCErrorHandling( Cmd, "FETCH INTO NumTablesToModify", rc = sqlca.sqlcode ) ;
    printf("Tables to modify: %d\n", NumTablesToModify );
    EXEC SQL CLOSE SEL_FROM_DOM ;
	CPCErrorHandling( Cmd, "CLOSE CURSOR ", rc = sqlca.sqlcode ) ;

	if ( NumTablesToModify == 0 )
		return(0);

	BuildSelectFromDomainDotTablesCmd( "TABLENAME", SampleCondition, SampleStrategy, SampleValToSet, Cmd ) ;
    EXEC SQL PREPARE PREP_SEL_FROM_DOM FROM :Cmd;
	CPCErrorHandling( Cmd, "PREPARE", rc = sqlca.sqlcode ) ;
    EXEC SQL DECLARE SEL_FROM_DOM CURSOR FOR PREP_SEL_FROM_DOM;
	CPCErrorHandling( Cmd, "DECLARE", rc = sqlca.sqlcode ) ;
    EXEC SQL OPEN SEL_FROM_DOM ;
	CPCErrorHandling( Cmd, "OPEN CURSOR", rc = sqlca.sqlcode ) ;
    
    if ( rc != 0 && rc != 100 )
      fprintf ( stderr, "ERROR: %s\nSQL error %d\n" , Cmd, rc);

    while ( rc == 0 ) 
    {
		EXEC SQL FETCH SEL_FROM_DOM INTO :TableToModify ;  

		if ( ( rc = sqlca.sqlcode ) == 0 )
		{
            NumTabsFound++;
			sprintf(Cmd, "ALTER TABLE \"%s\" SAMPLE %d %s", TableToModify, SampleValToSet, SampleStrategy ) ;
			printf("%3d / %3d: '%s'\n",NumTabsFound, NumTablesToModify, Cmd );
    		EXEC SQL EXECUTE IMMEDIATE :Cmd;
    		rc = sqlca.sqlcode ; 
        	if ( rc != 0 && rc != 100 )
              fprintf ( stderr, "ERROR: ALTER TABLE '%s' ...: SQL error %d\n" , 
			                     TableToModify, rc) ;
		}
		else
    	  if ( rc != 100 )
              fprintf ( stderr, "ERROR: FETCH INTO: SQL error %d \n" , rc) ;
    }
    EXEC SQL CLOSE SEL_FROM_DOM ;
    rc = sqlca.sqlcode ; 

	if ( rc == 100 )
      if ( NumTabsFound > 0 ) 
		printf("%d tables altered successfully", NumTabsFound);
      else
		printf("sample rows of all tables already set to %d %s.\n", SampleValToSet, SampleStrategy);

	EXEC SQL COMMIT WORK RELEASE ;
    rc = sqlca.sqlcode ; 

    return ( rc != 100 ? rc : 0 ) ;
}

/* --------------------------------------- */

main (argc,argv)
char	**argv ;
{

#ifdef WIN32
	int	iRC = 0;
#endif

    int	i ;
    int	n ;
    char line [100] ;

    /* PTS 1109836 */
	if ( ( argc == 2 || argc == 3 ) && (strcmp(argv[1],"-r") == 0 || strcmp(argv[1],"-R") == 0) )
	{
		if ( argc == 2 || ( n = atoi ( argv [2] ) ) <= 0 )
    		n = SAMPLES_TO_SET_DEFAULT ;
   		grc = AlterTableSampleRows20000(argv[1], n) ;
		return ( grc ) ;
	}

    for (i=1; i < argc-1 ; i++)
    {
        if (argv[i][0] == '-')
        switch (argv[i][1])
        {
		case 's' : updcol = 1 ;
			       break ;
        case 'v' : verify = 1 ;
                   break ;
		case 'u' : uncond = "-u";
				   buncond = 1 ;
				   break ;
		case 'e' : estimate = " -e " ;
				   bestimate = 1 ;
			       break ;
/* ADIS 1000739 */
		case '3' : R3 = 1 ;
				   break ;
		default  : usage() ;
	    }
    }

/* ADIS 1000677 + 1000908 */

	if ( verify )
		c2 = "VERIX" ;
	else if ( updcol && bestimate && buncond )
		c2 = "XPU_SUCOND" ;
	else if ( updcol && bestimate && ( buncond == 0 ) )
		c2 = "XPU_SCOND" ;
	else if ( updcol && (bestimate == 0 ) && buncond )
		c2 = "XPU_UCOND" ;
	else if ( updcol && ( bestimate == 0 ) && ( buncond == 0 ) ) 
		c2 = "XPU_COND" ;
	else
		c2 = "XPU_UNKNWN" ;

    if ( argc < 2  || ( verify + updcol ) == 0 )
    {
		usage () ;
		return (1) ;
    }

    n = atoi ( argv [argc -1] ) ;

    if ( n < 1 || n >= 50 ) 
    {
		usage () ;
		return (1) ;
    }

    signal ( SIGINT , KillAllProcs ) ;

    DelFiles (50) ;


    if ( ( dbr = getenv ( "DBROOT" ) ) == NULL )
    {
		fprintf ( stderr , "DBROOT not set, exit\n" ) ;
		return (0) ;
    }

    /* PTS 1116331 */
    EXEC SQL CONNECT;
    CPCErrorHandling( "EXEC SQL CONNECT", "CONNECT", sqlca.sqlcode ) ;

    EXEC SQLDB SELECT DATE, SUBSTR ( TIME , 3, 6 )  
	    INTO :startdate , :starttime 
	    FROM DUAL ; 
   
    if ( sqlca.sqlcode )
    {
        fprintf ( stderr , "Error in first database access, sqlcode = %d\n" ,
		sqlca.sqlcode ) ;
	    exit (99) ;
    }

    if ( verify )
	{
#ifdef WIN32
        sprintf ( line , "%s/misc/puclst -f chtlst -u %d" , dbr , n ) ;
#else
        sprintf ( line , "%s/misc/puclst -f chtlst -u %d" , dbr , n ) ;
#endif
	}
    else
	{
#ifdef WIN32
 		sprintf ( line , "%s/misc/puclst -s -f updlst %s %d" , dbr , uncond , n ) ; 
#else
 		sprintf ( line , "%s/misc/puclst -s -f updlst %s %d" , dbr , uncond , n ) ; 
#endif
	}

#ifdef WIN32
	if ( vox12_ExecCommand(line) == TPID_ERROR )
	{
		fprintf(stderr,"Can't execute command '%s'\n",line);	
		perror ("Creation of lists failed") ;
		return 1;
	}
	if ( (iRC = vox11_GetErrorCode()) != 0 )
	{
		fprintf(stderr,"Error while executing command '%s', rc=%d\n",line,iRC);	
		perror ("Creation of lists failed") ;
		return 1;
	}
#else
    if ( system (line) )
    {
		perror ("Creation of lists failed") ;
		return (1) ;
    }
#endif

    i = 0 ;

    if ( verify )
        printf ("Starting verify ...\n" ) ;
    else
        printf ("Starting updcol ...\n" ) ;

    while ( StartVerifyProgs (i,verify) ) 
    {
		i++;
		sleep(1);
    }

    WaitForEndOfVerifyProgs(i) ;

    if ( grc )
    {
        fprintf ( stderr , "Some errors occured\n" ) ;
    }
    else
    {
        fprintf ( stderr , "Finished without errors\n") ;
    }

    /* ADIS 1000739 */

	MakeSapEntry (grc) ;	

    CatResultFilesAndDelete(i) ;

    return ( grc ) ;
}
    
 
StartVerifyProgs (i,verify)
{
    char	fname [100] ;
    char	pname [100] ;
#ifdef WIN32
	TPID	frc ;
#else
	int		frc;
    int rc;
#endif


    if ( verify ) 
        sprintf ( fname , "chtlst.%d" , i ) ;
    else
		sprintf ( fname , "updlst.%d" , i ) ;

    if ( access ( fname , R_OK ) == 0 ) 
    {
		if ( verify ) 
		    sprintf ( pname , "%s/misc/pchtab" , dbr ) ;
		else
            sprintf ( pname , "%s/misc/updcol" , dbr ) ;
    }
    else if ( access ( fname , F_OK ) == -1 )
    {
        if ( i == 0 )
		    fprintf ( stderr , "Nothing to do (ok)\n" ) ;
		return 0 ;
    }
    else
    {
        perror ("Error reading internal file") ;
        return 0 ;
    }

#ifdef WIN32

	{	
		char	szCommand[255];

		if ( verify )
			sprintf(szCommand,"%s pchtab -f %s -s %d &",pname,fname,i);
		else
			sprintf(szCommand,"%s updcol -f %s %s %s -s %d &",pname,fname,estimate,"-u",i);

    	fprintf(stderr,"Start %d. %s subprocess ...\n",
		i+1,
		verify == 0 ? "updcol" : "verify");

		if ( (frc = vox12_ExecCommand(szCommand)) == TPID_ERROR )
		{
			fprintf(stderr,"Can't execute command '%s'\n",szCommand);	
			return 1;
		}
	}

#else
    if ( ( frc = fork () ) == -1 ) 
    {
	perror ("fork failed") ;
	return 0 ;
    }
    else if ( frc == 0 ) /* son */
    {
	char numb [6] ;
	sprintf ( numb , "%d" , i ) ;
	/* printf ("exec son %d\n" , getpid () ) ; */
	if ( verify )
	    rc = execlp ( pname , "pchtab" , "-f" , fname , 
		"-s" , numb , NULL ) ;
	else
	    if ( bestimate == 0 ) 
	        rc = execlp ( pname , "updcol" , "-f" , fname , 
		    "-s" , numb , "-u" , NULL ) ;
	    else
	        rc = execlp ( pname , "updcol" , "-f" , fname , 
		    "-e" , "-s" , numb , "-u" , NULL ) ; /* PTS 1109836 */
	exit (rc) ;
    }
#endif

    pids [i] = frc ;
    return 1 ;
}

WaitForEndOfVerifyProgs ( unsigned i )
{
#ifdef WIN32
	unsigned	j;

	for ( j = 0; j < i; j++ )
	{
		int		iRC;
		
		if ( vox12_WaitForProcess ( pids[j] ) != 0 )
		{
			fprintf(stderr,"Wait for %d failed, err=%d",pids[j],GetLastError,vox11_GetErrorCode());
			continue;
		}
		
		if ( (iRC = vox11_GetErrorCode()) != 0 )
		{	
			grc++ ;	
			fprintf (stderr , "Error in subprogram, status = %d\n",iRC);
		}
	}

#else
    int rc ;
    int statusp ;

    do
    {
        rc = wait (&statusp) ; 
	/* printf ("Child stopped, rc = %d, errno = %d, statusp = %x\n",
		rc,errno,statusp); */
	if (statusp != 0 && errno != ECHILD )
        {
	     grc++ ;	
	     fprintf (stderr , "Error in subprogram, status = %d\n" , statusp);
	}
    }
    while ( rc != -1 && errno != ECHILD ) ;
#endif

   /* printf ("return from wait\n") ; */

    return 0;
}

void MakeSapEntry (int errc) 
{
    EXEC SQL BEGIN DECLARE SECTION ;
    char	c [11] ;
/* ADIS 1000739 */
	int		ec ;
	char	*ameth ;
	char	*updcolcols ;
	int		Rel40 ;
    EXEC SQL END DECLARE SECTION ;

    char        sc [7] ;

	Rel40 = 0 ;
    ec = errc ; 

    EXEC SQL LOCK TABLE SDBAADAUPD IN EXCLUSIVE MODE ;

    if ( sqlca.sqlcode == -4004 || sqlca.sqlcode == -942 ) 
    {
        EXEC SQL ROLLBACK ;
    }
	else
	{

		EXEC SQL SELECT MAX ( SAVID ) 
			INTO :savidc :savidc_indicator  
			FROM SDBAADAUPD WITH LOCK EXCLUSIVE ;
  
		if ( sqlca.sqlcode == 0 )
			savidi = atoi ( savidc ) + 1 ;
		else if ( sqlca.sqlcode == 100 || savidc_indicator == -1 )
			savidi = 1 ;
		else
		{
			printf ("SELECT SDBAADAUPD: SQL error %d\n" , sqlca.sqlcode ) ;
			if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
				exit (99) ;		
		}
 
		/* ADIS 1000677 */

		sprintf ( sc , "%d" , savidi ) ;
		strcpy  ( savidc , "000000" ) ;
		strcpy  ( savidc + ( 6 - strlen ( sc ) ) , sc ) ;

		/* ADIS 1001295 + 1002019 */

		EXEC SQL
			SELECT count (*) INTO :Rel40 FROM svers 
			WHERE version LIKE '40%' ;

		if	(Rel40)
		{
			EXEC SQL
				INSERT INTO SDBAADAUPD
				VALUES ( :savidc , :c2 , 'ALL' , :startdate , :starttime ,
					DATE , substr ( TIME , 3, 6 ) , 'DONE--' , :ec ) ;
		}
#define TOO_VIEW_VALUES -1200
		if	(!Rel40 || sqlca.sqlcode == TOO_VIEW_VALUES ) /* PTS 1111634 */
		{
			if ( updcol) 
			{
				ameth = bestimate ?  "E" :"C" ;
				updcolcols = "KEY,INDEX" ;
			}
			else 
			{
				ameth = " " ;
				updcolcols = " " ;
			}

			EXEC SQL
				INSERT INTO SDBAADAUPD
					( SAVID, SAVTYP, UPDTAB, UPDCOL, BEGDAT, BEGTIM, ENDDAT, 
					ENDTIM, AMETH, SAVSTA, RETCOD )
				VALUES 
					( :savidc , :c2 , 'ALL' , 'KEY,INDEX' , :startdate , :starttime ,
					DATE , substr ( TIME , 3, 6 ) , :ameth ,  'DONE--' , :ec ) ;
		}

		if ( sqlca.sqlcode )
		{
			printf ("Insert SDBAADAUPD: SQL error %d\n" , sqlca.sqlcode ) ;
			EXEC SQL ROLLBACK ;
		}
		else
			EXEC SQL COMMIT ;

		if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
			 exit (99) ;
	}

	/* ADIS 1000839 */
	if ( ! verify && strcmp ( uncond , "-u")  == 0 )
	{
		EXEC SQL DELETE 
			FROM SQD$TPAGES
			WHERE TABNAME NOT IN
			( SELECT TABLENAME 
				FROM DOMAIN.TABLES 
				WHERE OWNER in (USER, USERGROUP) AND TYPE = 'TABLE' ) ;

		if ( sqlca.sqlcode && sqlca.sqlcode != 100) 
		{
			printf ("ERROR: DELETE FROM SQD$TPAGES ..., sqlcode = %d\n" , sqlca.sqlcode ) ;
			EXEC SQL COMMIT WORK RELEASE ;
			exit (99) ;
		}
		else
			EXEC SQL COMMIT ;
	}
}


void usage () 
{
    fprintf ( stderr , "Usage : xpu -R|-r <sample rows> |-v|-s [-u] count\n" ) ;
    fprintf ( stderr , "            -R    :: reset sample rows to <sample rows> for ALL tables\n") ;
    fprintf ( stderr , "            -r    :: reset sample rows to <sample rows>\n") ;
    fprintf ( stderr , "                     for tables where the actual value is lower\n") ;
    fprintf ( stderr , "    <sample rows> :: sample rows to set (default: 20000,only with -r|-R)\n") ;
    fprintf ( stderr , "            -v    :: verify database\n") ;
    fprintf ( stderr , "            -s    :: statistic update\n") ;
    fprintf ( stderr , "            -e    :: sampling statistics (only with -s)\n") ;
    fprintf ( stderr , "            -u    :: unconditional (only with -s)\n") ;
	/* not printed: Option "-3": Filenames for Rooco, ADIS 1000739 */
    fprintf ( stderr , "            count :: max. number of parallel tasks (1<count<50)\n") ;
}

void CatResultFilesAndDelete ( unsigned i )
{
	char ChtabErrName [40] ;
	char UpdcolPrtName [40] ;
	char sCmd [200] ;

#ifdef WIN32
	unsigned	j;
#endif

    if  ( verify ) 
    {
/* ADIS 1000739 */
		if ( R3 )
		{
			sprintf ( ChtabErrName , "%s.chtab.err" , savidc ) ;
		}
		else 
		{
			strcpy ( ChtabErrName , "chtab.err" ) ;
		}

#ifdef WIN32

		NT_RemoveFile("chtab.prt");
		NT_RemoveFile(ChtabErrName);
		//printf ("Remove File : %s\n" , ChtabErrName ) ;
		for ( j = 0; j < i; j++ )
		{
			vox12_VExecCommand ("cmd /c type chtab%d.prt 2>NUL >>chtab.prt",j ) ;
/* ADIS 1000739 */
			sprintf (sCmd,"cmd /c type chtab%d.err 2>NUL >>%s",j,ChtabErrName ) ;
       		vox12_ExecCommand (sCmd) ;
		}
#else
		system ("cat -s chtab[0-9].prt chtab[1-4][0-9].prt > chtab.prt" ) ;
/* ADIS 1000739 */
		sprintf ( sCmd , "cat -s chtab[0-9].err chtab[1-4][0-9].err > %s" , ChtabErrName ) ;
		system ( sCmd ) ;
#endif
    }
    else
    {
/* ADIS 1000739 */
		if ( R3 )
		{
			sprintf ( UpdcolPrtName , "%s.updcol.prt" , savidc ) ;
		}
		else 
		{
			strcpy ( UpdcolPrtName , "updcol.prt" ) ;
		}

#ifdef WIN32
		NT_RemoveFile(UpdcolPrtName);
		for ( j = 0; j < i; j++ )
		{
/* ADIS 1000739 */
			sprintf ( sCmd , "cmd /c type updcol%d.prt 2>NUL >>%s",j,UpdcolPrtName ) ;
			// printf ("%s\n" , sCmd ) ;
        	vox12_ExecCommand (sCmd) ;
		}
#else
/* ADIS 1000739 */
		sprintf ( sCmd , "cat -s updcol[0-9].prt updcol[1-4][0-9].prt > %s" , UpdcolPrtName ) ;
		system ( sCmd ) ;        
#endif
    }

    DelFiles (i) ;
}

DelFiles ( unsigned i ) 
{
    if ( verify )
    {
#ifdef WIN32
		unsigned	j;

		for ( j = 0; j < i; j++ )
		{
			char	szFilename[255];	

			sprintf(szFilename,"chtlst.%d",j);
			NT_RemoveFile(szFilename);
			sprintf(szFilename,"chtab%d.prt",j);
			NT_RemoveFile(szFilename);
			sprintf(szFilename,"chtab%d.err",j);
			NT_RemoveFile(szFilename);
		}	
#else
        system ("rm -f chtlst.[0-9] chtlst.[1-4][0-9]");
        system ("rm -f chtab[0-9].prt chtab[1-4][0-9].prt") ;
        system ("rm -f chtab[0-9].err chtab[1-4][0-9].err") ;
#endif
    }
    else
    {
#ifdef WIN32
		unsigned	j;

		for ( j = 0; j < i; j++ )
		{
			char	szFilename[255];	

			sprintf(szFilename,"updlst.%d",j);
			NT_RemoveFile(szFilename);
			sprintf(szFilename,"updcol%d.prt",j);
			NT_RemoveFile(szFilename);
		}	
#else
        system ("rm -f updlst.[0-9] updlst.[1-4][0-9]");
        system ("rm -f updcol[0-9].prt updcol[1-4][0-9].prt") ;
#endif
	}

	return 0;
}

void KillAllProcs ( int i )
{
    int j ;

    killed = 1 ;

    for ( j = 0 ; pids [j] ; j++ )
    {
	/* 
	printf ("Killing pid %d\n" , pids[j] ) ;
	*/
#ifdef WIN32
		TerminateProcess((HANDLE)pids[j],1);
#else
		kill ( pids[j] , SIGTERM ) ;
#endif
    }

    CatResultFilesAndDelete (i) ;
    fprintf ( stderr , "Verify killed by signal SIGINT (CTRL C)\n") ;
    exit (1) ;
}

#ifdef WIN32
int NT_RemoveFile ( char *filename )
{
        int     iRC = 0;

        if ( remove(filename)  != 0 )
                return iRC;

        return 0;
}
#endif

.CM *-END-* code ----------------------------------------
.sp 2
***********************************************************
*-PRETTY-*  statements    :           0
*-PRETTY-*  lines of code :           0
*-PRETTY-*  lines in file :           0
.pa

