/*



    ========== licence begin  GPL
    Copyright (c) 2000-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



*/
/*PRETTY*/
/* updcol , Jochen Hartmann */

#include <ctype.h>

float get_npages () ;
float get_opages () ;

#include <stdio.h>

FILE	*fp;
FILE	*f;
int		silent = 0 ;

void	wrong_usage () ;
void	update_npages () ;
void	DelSysUpdStat () ;
void	WriteUpdcolDate () ;


main (argc,argv)
char	**argv ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
#define KNL_IDENTIFIER_LEN 64
#define KNL_IDENTIFIER_LEN_C 65
	/* PTS 1001027 */
    char    tabname [KNL_IDENTIFIER_LEN_C] , tabnameo [KNL_IDENTIFIER_LEN_C ] ;
    char    col [1000] ;
    char    outline [1000] ;
    char    stmt [1000] ;
    char    columnname [KNL_IDENTIFIER_LEN_C] ;
	/* PTS 1001027 */
    char    tablename [KNL_IDENTIFIER_LEN_C] ;
    int	    it , icol ;
	/* PTS 1001027 */
    char    ExplicitTabname [KNL_IDENTIFIER_LEN_C];
    int	    indcnt ;
    EXEC SQL END DECLARE SECTION ;

    int     i , c = 1 , k ;
    int     check = 1 ;
    int     uncond = 0 ;
    int     execute = 1 ;
    int	    ExplicitTable = 0 ;
	int		EstimateSample = 0, SampleRate = 0 ; /* PTS 1109836 */
	char	SampleString [60] ;
    int	    OnlyOneTabname = 0 ;
    int     ShowVersion = 0 ;
    int	    TablesInFile = 0 ;
    char    TabFile [80] ;
    char    version [30] ;
    int	    Rel6 = 1 ;
    int	    cs ;
    int	    SysUpdStat ;
	/* ADIS 1000775 */
    int	    min_indcnt = 0 ;
    int	    fnumber = 0 ;
    char    filename [100] ;

    sprintf (version, "updcol V2.3, 12.2.2003") ;

    for (i=1; i < argc ; i++)
    {
        if (argv[i][0] == '-')
            switch (argv[i][1])
			{
                case 'u' : uncond = 1 ;
					break ;
				case 'n' : execute = 0 ;
	                   break ;
                case 'V' : printf ( "%s\n", version) ;
					ShowVersion = 1 ;
					break ;
				case 'e' :
					EstimateSample = 1 ;
					if ( ( i+1 < argc ) && (argv [i+1][0] != '-') )
						SampleRate = atoi ( argv [++i] ) ;
					break ;
				case 't' : ExplicitTable = 1 ;
					OnlyOneTabname = 1 ;
					strcpy ( ExplicitTabname , argv [i+1] ) ;
					for ( k = 0 ; ExplicitTabname[k] ; k++ )
						ExplicitTabname[k] = toupper(ExplicitTabname[k]);
					i++ ;
					break ;
                case 'f' : TablesInFile = 1 ;
	                   ExplicitTable = 1 ;
					   strcpy ( TabFile , argv [++i] ) ;
					   break ;
				case 'I' : min_indcnt = -1 ;
					break ;
				case 's' : silent = 1 ;
					fnumber = atoi ( argv [++i] );
					break ;
                default  : wrong_usage() ;
			}
    }

    if ( TablesInFile + OnlyOneTabname == 2 )
	wrong_usage () ;

    if ( silent )
        sprintf ( filename , "updcol%d.prt" , fnumber ) ;
    else
	    strcpy ( filename , "updcol.prt" ) ;

    if ( EstimateSample )
	{	
		/* PTS 1109836 */
		if ( SampleRate <= 0 )
    		strcpy  ( SampleString , " ESTIMATE") ;
        else
     	  if ( SampleRate <= 100 )
    		sprintf ( SampleString , " ESTIMATE SAMPLE %d PERCENT" , SampleRate ) ;
		  else
    		sprintf ( SampleString , " ESTIMATE SAMPLE %d ROWS" , SampleRate ) ;
	}
	else
		SampleString [0] = (char) 0 ;

    if ( (fp = fopen (filename , "w+")) == 0)
    {
		fprintf (stderr, "FILE OPEN ERROR : update.prt \n");
		exit (4);
    }

    fprintf (fp,  "%s\n", version);

    if ( execute && !ShowVersion )
    {
        if ( ! silent) printf ("EXECUTE = YES\n");
        fprintf (fp, "EXECUTE = YES\n");
    }
    else
    {
        printf ("EXECUTE = NO\n\n");
        printf ("look at file %s detail\n\n",filename);
        fprintf (fp, "EXECUTE = NO\n");
    }

    if ( ShowVersion && ( ( uncond ) == 0 ) )
		exit (0) ;

    if ( TablesInFile )
    {
		if ( ( f = fopen ( TabFile , "r" ) ) == NULL )
        {
			perror ("Open Table File (Option -f)") ;
			exit (4) ;
        }
    }

    EXEC SQL CONNECT;
    if ( sqlca.sqlcode )
    {
        fprintf ( stderr , "ERROR in CONNECT : sqlerr = %d\n" , sqlca.sqlcode ) ;
        fprintf ( fp , "ERROR in CONNECT : sqlerr = %d\n" , sqlca.sqlcode ) ;
        exit (99) ;
    }

    EXEC SQL CREATE TABLE SQD$UDAT
        ( UKIND		CHAR (10) KEY ,	
	  UDATE         CHAR (10) ,
	  UTIME		CHAR (10) ) ;

    if ( sqlca.sqlcode == 0 )
    {
	EXEC SQL COMMIT WORK ;
    }

	/* PTS 1001027 */

    EXEC SQL CREATE TABLE SQD$TPAGES
	( TABNAME 	char (64) key ,
	  TDATE		char (10) ,
	  PAGS		fixed (10) ) ;

    if ( sqlca.sqlcode == 0 )
    {
        uncond = 1 ;
        EXEC SQL COMMIT WORK ;
    }

    if ( ExplicitTable )
    {
	/* PTS 1001027 */
        EXEC SQL CREATE TABLE TEMP.JOC$EXPLTAB
	    ( TABLENAME     char (64) ) ;
	
	if ( sqlca.sqlcode == 0 )
	{
	    EXEC SQL COMMIT WORK ;
	}
    }

    /* PTS 1001027 */
	EXEC SQL CREATE TABLE TEMP.KEY_INDEX
	( TABLENAME 	char (64) KEY ,
	  COLUMNNAME	char (64) KEY ) DYNAMIC ;

    EXEC SQL CREATE TABLE TEMP.JOC$INDEXES
	( TABLENAME 	char (64) KEY ,
	  INDEXNAME 	char (64) KEY ) DYNAMIC ;


    if ( sqlca.sqlcode == -3014 ) /* maybe its 3.1.2 */
    {
     	Rel6 = 0 ;

        EXEC SQL ROLLBACK ;

		/* PTS 1001027 */

        EXEC SQL CREATE TABLE TEMP.KEY_INDEX
            ( TABLENAME     char (64) KEY ,
              COLUMNNAME    char (64) KEY ) ;

        EXEC SQL CREATE TABLE TEMP.JOC$INDEXES
	    ( TABLENAME 	char (64) KEY ,
	      INDEXNAME 	char (64) KEY ) ;
    }

    if ( sqlca.sqlcode == 0 )
    {
	     EXEC SQL COMMIT WORK ;
    }
    else
    {
	    fprintf ( stderr , "Cannot create temp table , sqlcode = %d\n" ,
		 sqlca.sqlcode ) ;
	    fprintf ( fp, "Cannot create temp table , sqlcode = %d\n" ,
		 sqlca.sqlcode ) ;

        EXEC SQL ROLLBACK RELEASE ;
	    return (1) ;
    }

    if ( ! silent) printf ("Collecting data, patience please ...\n" ) ;

    strcpy ( tabnameo , "..." ) ;

    if ( ! ExplicitTable )
    {
        EXEC SQL INSERT TEMP.KEY_INDEX
	    ( SELECT tablename , columnname
	    FROM INDEXCOLUMNS where owner in (USER, USERGROUP) ) IGNORE DUPLICATES ;

        EXEC SQL INSERT TEMP.JOC$INDEXES
	    ( SELECT tablename , indexname
            FROM INDEXCOLUMNS where owner in (USER, USERGROUP) ) IGNORE DUPLICATES ;
    }
    else
    {
	    if ( OnlyOneTabname )
	    {
	    EXEC SQL INSERT TEMP.JOC$EXPLTAB Values ( :ExplicitTabname ) ;
        }
	    else
	    {
	        if ( FillExplTab () == 0 )
	        {
		         fprintf (stderr , "Empty input file\n");
		         EXEC SQL COMMIT WORK RELEASE ;
		         return (1) ;
	        }
	    }

        EXEC SQL INSERT TEMP.KEY_INDEX
	    ( SELECT tablename , columnname
	        FROM INDEXCOLUMNS where owner in (USER, USERGROUP) and tablename IN
		    ( SELECT TABLENAME FROM TEMP.JOC$EXPLTAB ) )
	    IGNORE DUPLICATES ;

        EXEC SQL INSERT TEMP.JOC$INDEXES
	    ( SELECT tablename , indexname
            FROM INDEXCOLUMNS where owner in (USER, USERGROUP) and tablename IN
		    ( SELECT TABLENAME FROM TEMP.JOC$EXPLTAB ) )
	    IGNORE DUPLICATES ;
    }

    EXEC SQL SELECT  JOC$TABLE (tablename,owner,type) FROM SHOW_TABLE ;

    if ( ! ExplicitTable )
    {
        EXEC SQL SELECT JOC$TTAB ( tablename ) from JOC$TABLE
	    WHERE OWNER in (USER, USERGROUP)
            AND TYPE = 'TABLE'
	    AND TABLENAME NOT LIKE 'JOC$%' ;
    }
    else
    {
        EXEC SQL SELECT JOC$TTAB ( tablename ) from JOC$TABLE
	    WHERE OWNER in (USER, USERGROUP)
            AND TYPE = 'TABLE'
	    AND TABLENAME IN
		    ( SELECT TABLENAME FROM TEMP.JOC$EXPLTAB ) ;
    }


    if ( sqlca.sqlcode == 0 )
        EXEC SQL COMMIT WORK ;

    if ( sqlca.sqlcode == 0 )
    while ( 1 )
    {
	EXEC SQL FETCH JOC$TTAB INTO :tablename :it ;

	if ( sqlca.sqlcode ) break ;

    sprintf ( stmt , "SELECT COLUMNNAME FROM DOMAIN.COLUMNS WHERE OWNER in (USER, USERGROUP) AND TABLENAME = \'%s\' AND COLUMNNAME <> 'SYSKEY' AND KEYPOS > 0 ORDER BY KEYPOS" , tablename ) ;

	EXEC SQL EXECUTE IMMEDIATE :stmt ;

    if ( sqlca.sqlcode == 0 )
      while ( 1 )
        {
	    EXEC SQL FETCH INTO :columnname ;
	
	    if ( sqlca.sqlcode ) break ;

	    EXEC SQL INSERT TEMP.KEY_INDEX VALUES ( :tablename , :columnname ) ;

	    if ( sqlca.sqlcode == 0 )
    		EXEC SQL COMMIT WORK ;
	}

    }

    if ( Rel6 )
    {
	EXEC SQL
	    SELECT JOC$SUPD ( tablename , columnname )
	    FROM SYS_UPDSTATISTICS
		WHERE OWNER in (USER, USERGROUP)
	        AND tablename IN ( SELECT TABLENAME FROM JOC$TTAB ) ;

        if ( sqlca.sqlcode == 0 )
        {
	    SysUpdStat = 1 ;

	    EXEC SQL
	      INSERT TEMP.KEY_INDEX
		( SELECT tablename , columnname FROM JOC$SUPD )
		IGNORE DUPLICATES ;
	}
    }

    EXEC SQL CLOSE JOC$TABLE ;
    EXEC SQL CLOSE JOC$TTAB ;

    EXEC SQL COMMIT ;

    EXEC SQL SELECT JOC$T ( tablename , columnname )
        FROM TEMP.KEY_INDEX
        ORDER BY tablename , columnname ;

    if ( sqlca.sqlcode == 100 )
    {
        fprintf ( stderr , "Nothing done (ok)\n" ) ;
        fprintf ( fp , "Nothing done (ok)\n" ) ;
        fclose (fp);
        EXEC SQL COMMIT WORK RELEASE ;
        return (0) ;
    }
    else if ( sqlca.sqlcode )
    {
        fprintf ( stderr , "ERROR in SELECT : sqlerr = %d\n" , sqlca.sqlcode ) ;
        fprintf ( fp , "ERROR in SELECT : sqlerr = %d\n" , sqlca.sqlcode ) ;
        exit (99) ;
    }

    while ( 1 )
    {
        int ferr ;

        EXEC SQL FETCH JOC$T INTO :tabname :it , :col :icol ;

        if ( ferr = sqlca.sqlcode )
	        break ;
        else
        {
            if ( strcmp ( tabname , tabnameo ) )
            {
                if ( strcmp ( tabnameo , "..." ) )
	            {
/* ADIS 1002052 */
                    strcat ( outline , "\") FOR \"" ) ; /* PTS 1115447 */
                    strcat ( outline , tabnameo ) ;
                    strcat ( outline , "\"" ) ;
					strcat ( outline , SampleString ) ;
    		        if ( ( cs = check_stat ( SysUpdStat , tabnameo ) ) || uncond )
	                {
		                if ( ! silent) printf ( "%s , sqlcode = " , outline ) ;
		                fprintf ( fp, "%s , sqlcode = " , outline ) ;
	                    fflush ( stdout ) ;
		                if ( execute )
		                {
			                 if ( silent )
							     printf ("%s\n" , tabnameo ) ;
 	                         EXEC SQL EXECUTE IMMEDIATE :outline ;	
		                     if ( ! silent)
							     printf ( "%d\n" , sqlca.sqlcode ) ;
		                     fprintf ( fp, "%d\n" , sqlca.sqlcode ) ;
			                 if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
			                     exit (99) ;
			                 if ( sqlca.sqlcode == 0 )
		                         update_npages ( tabnameo ) ;
		                     if ( sqlca.sqlcode == 0 && cs == 2 )
		                         DelSysUpdStat ( tabnameo );
/* ADIS 1001276 */
							 if ( sqlca.sqlcode == 0 )
								 EXEC SQL COMMIT ;
	                     }		
		                 else
		                 {
		                     if ( ! silent) printf ( "%d\n" , 0 ) ;
		                     fprintf ( fp, "%d\n" , 0) ;
		                 }

		                 EXEC SQL SELECT COUNT ( DISTINCT INDEXNAME )
			                  INTO :indcnt
                              FROM TEMP.JOC$INDEXES
		                      WHERE TABLENAME = :tabnameo ;
/* ADIS 1000775 */
		                 if ( indcnt > min_indcnt )
		                 {
/* ADIS 1002052 */
			                  sprintf (outline , "UPDATE STAT \"%s\" %s" , tabnameo , SampleString) ;
		                      if ( ! silent)
							      printf ( "UPDATE STAT TABLE \"%s\" %s, sqlcode = " , tabnameo , SampleString ) ;
		                      fprintf ( fp, "UPDATE STAT TABLE \"%s\" %s, sqlcode = " , tabnameo , SampleString) ;
				
				              fflush ( stdout ) ;
			                  if ( execute )
			                  {
			                       EXEC SQL EXECUTE IMMEDIATE :outline ;
                                   if ( ! silent)
				                       printf ( "%d\n" , sqlca.sqlcode ) ;
                                   fprintf ( fp, "%d\n" , sqlca.sqlcode ) ;
			                       if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
			                            exit (99) ;
 /* ADIS 1001276 */
									if ( sqlca.sqlcode == 0 )
										 EXEC SQL COMMIT ;

			                  }
			                  else
		                      {
		                          if ( ! silent) printf ( "%d\n" , 0 ) ;
		                          fprintf ( fp, "%d\n" , 0) ;
		                      }
		                  }	
		              }
    		          EXEC SQL COMMIT WORK ;
		              check = 1 ;
	              }
	              sprintf ( outline , "UPDATE STAT COLUMN (\"%s" , col ) ;  /* PTS 1115447 */
	              strcpy ( tabnameo , tabname ) ;
	              c = 1 ;
              }
              else
              {
		          strcat ( outline , "\",\"" ) ;  /* PTS 1115447 */
		          strcat ( outline , col ) ;
              }
          }
    }
/* ADIS 1002052 */
    strcat ( outline , "\") FOR \"" ) ; /* PTS 1115447 */
    strcat ( outline , tabnameo ) ;
    strcat ( outline , "\"" ) ;
	strcat ( outline , SampleString ) ;
    if ( ( cs = check_stat ( SysUpdStat , tabnameo ) ) || uncond )
    {
        if ( ! silent) printf ( "%s , sqlcode = " , outline ) ;
        fprintf ( fp, "%s , sqlcode = " , outline ) ;
        fflush ( stdout ) ;
	    if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
	        exit (99) ;
	    if ( execute )
	    {
	        printf ( "%s\n" , tabnameo ) ;
            EXEC SQL EXECUTE IMMEDIATE :outline ;	
            if ( ! silent)
		        printf ( "%d\n" , sqlca.sqlcode ) ;
            fprintf ( fp, "%d\n" , sqlca.sqlcode ) ;
            if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
	            exit (99) ;
            if ( sqlca.sqlcode == 0 && cs == 2 )
                DelSysUpdStat ( tabnameo );
/* ADIS 1001276 */
			if ( sqlca.sqlcode == 0 )
				 EXEC SQL COMMIT ;

	    }
        else
        {
            if ( ! silent) printf ( "%d\n" , 0 ) ;
                fprintf ( fp, "%d\n" , 0) ;
	    }
	    EXEC SQL SELECT COUNT ( DISTINCT INDEXNAME )
	        INTO :indcnt
            FROM TEMP.JOC$INDEXES
	        WHERE TABLENAME = :tabnameo ;

	    if ( indcnt > min_indcnt )
	    {
/* ADIS 1002052 */
	        sprintf (outline , "UPDATE STAT \"%s\" %s" , tabnameo , SampleString ) ;
	        if ( ! silent)
		        printf ( "UPDATE STAT TABLE \"%s\" %s, sqlcode = " , tabnameo , SampleString) ;
	        fprintf ( fp, "UPDATE STAT TABLE \"%s\" %s, sqlcode = " , tabnameo , SampleString ) ;
            fflush ( stdout ) ;
	        if ( execute )
	        {
	            EXEC SQL EXECUTE IMMEDIATE :outline ;
                if ( ! silent) printf ( "%d\n" , sqlca.sqlcode ) ;
                    fprintf ( fp, "%d\n" , sqlca.sqlcode ) ;
		        if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
			        exit (99) ;
 /* ADIS 1001276 */
				if ( sqlca.sqlcode == 0 )
					 EXEC SQL COMMIT ;
        }
            else
            {
                if ( ! silent) printf ( "%d\n" , 0 ) ;
                fprintf ( fp, "%d\n" , 0) ;
	        }
	    }	
	    if ( execute )
            update_npages ( tabnameo ) ;
 /* ADIS 1001276 */
		if ( sqlca.sqlcode == 0 )
			 EXEC SQL COMMIT ;
    }

    if ( execute )
        WriteUpdcolDate ((uncond&&!ExplicitTable) ? "all" : "partial" ) ;

    EXEC SQL COMMIT WORK RELEASE ;
    fclose (fp);
    return (0) ;

}

float get_npages ( t )
char	*t ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    char    *tabname ;
    int     pages ;
    char    line [200] ;
    EXEC SQL END DECLARE SECTION ;

    tabname = t ;
#ifdef old
    sprintf (line , "SHOW (JOC$S) STAT PAGES %s",tabname ) ;

    EXEC SQL EXECUTE IMMEDIATE :line ;

    EXEC SQL SELECT value INTO :pages FROM JOC$S ;
#endif

/* ADIS 10001252 */

	EXEC SQL SELECT numeric_value INTO :pages FROM PAGES
		WHERE TABLENAME = :tabname ;

    return ( (float) pages ) ;
}

float get_opages ( t1 )
char	*t1 ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    float  pages1 ;
    int    ipages ;
    char *tabname1 ;
    EXEC SQL END DECLARE SECTION ;

    tabname1 = t1 ;

    EXEC SQL
        SELECT pags INTO :pages1 :ipages
        FROM sqd$tpages WHERE tabname = :tabname1;

    return ( ( sqlca.sqlcode == 100 || ipages ) ? 0 : pages1 ) ;
}

void update_npages ( tn )
char	*tn ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    float   p ;
    char    *tabn ;
    EXEC SQL END DECLARE SECTION ;

    tabn = tn ;

    EXEC SQL DELETE SQD$TPAGES WHERE tabname = :tabn ;

    p = get_npages ( tabn ) ;

    EXEC SQL INSERT SQD$TPAGES VALUES ( :tabn , DATE , :p ) ;
}

check_stat ( SysUpdStat , tabname )
char *tabname ;
{
    float npages , opages ;

    npages = get_npages ( tabname ) ;
    opages = get_opages ( tabname ) ;
	
    if ( ! silent)
	 printf ( "%-12s   calculated : %6d , actual : %6d\n" , tabname ,
             (int) opages , (int) npages ) ;
    fprintf ( fp, "%-12s   calculated : %6d , actual : %6d\n" , tabname ,
             (int) opages , (int) npages ) ;

    if ( SysUpdStat && CheckSysUpdStat ( tabname ) ) return (2) ;

    if ( (int) npages == (int) opages ) return (0)  ;

    if ( (int) opages == 0 && (int) npages != 0 ) return (1) ;

    if ( npages && opages && npages / opages < 1.5 && npages / opages > 0.6 )
	return (0)  ;

    return (1) ;
}

void DelSysUpdStat ( tabname )
char	*tabname ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    char	*t ;
    EXEC SQL END DECLARE SECTION ;

    t = tabname ;

    EXEC SQL DELETE SYS_UPDSTATISTICS WHERE TABLENAME = :t ;
}

CheckSysUpdStat ( tabname )
char	*tabname ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    char	*t ;
    EXEC SQL END DECLARE SECTION ;

    t = tabname ;

    EXEC SQL SELECT * FROM JOC$SUPD WHERE TABLENAME = :t ;

    return ( ! sqlca.sqlcode ) ;
}

FillExplTab ()
{
    int 	k ;
    int		c = 0 ;
    EXEC SQL BEGIN DECLARE SECTION ;
    char	ExplTabname [20] ;
    EXEC SQL END DECLARE SECTION ;

    while ( fgets ( ExplTabname , sizeof ExplTabname , f ) != NULL )
    {
        for ( k = 0 ; ExplTabname[k] ; k++ )
        {
           ExplTabname[k] = toupper(ExplTabname[k]);
           if ( ExplTabname [k] == '\n' )
		ExplTabname [k] = (char) 0 ;
	}
	EXEC SQL INSERT TEMP.JOC$EXPLTAB VALUES ( :ExplTabname ) ;
	c++ ;
    }
    return (c) ;
}

void WriteUpdcolDate (ci)
char	*ci ;
{
    EXEC SQL BEGIN DECLARE SECTION ;
    char	c [11] ;
    EXEC SQL END DECLARE SECTION ;

    strcpy ( c , ci ) ;

    EXEC SQL UPDATE SQD$UDAT SET UDATE = DATE, UTIME = TIME
	 WHERE UKIND = :c ;

    if ( sqlca.sqlcode == 100 )
    {
	EXEC SQL INSERT SQD$UDAT VALUES ( :c , DATE , TIME ) ;
    }
	
    if ( sqlca.sqlcode )
	printf ("Insert/Update SQD$UDAT, SQL error %d\n" , sqlca.sqlcode ) ;
    if ( sqlca.sqlcode == 700 || sqlca.sqlcode == -807 )
        exit (99) ;
}

void wrong_usage ()
{
    fprintf ( stderr , "Usage : updcol [-u|-V] [-t tab|-f file] [-e rows]\n" );
    fprintf ( stderr , "        -V        show version of this tool\n" );
    fprintf ( stderr , "        -u        update statistics unconditionally\n");
    fprintf ( stderr , "        -n        no execution, only information\n");
    fprintf ( stderr , "        -I        perform also UPDATE STAT TABLE\n");
    fprintf ( stderr , "        -e rows   estimate sample <rows> rows\n" ) ;
    fprintf ( stderr , "        -t tab    update stat. for table 'tab'\n" );
    fprintf ( stderr , "        -f file   update stat. for tables in file 'file'\n" ) ;
    exit (1) ;
}

