#!/usr/bin/perl
# ---------------------------------------------------------------------
# augm_taille_tab.pl
# modifie valeurs des tailles de certains parametres de creation de tables :
# a) INITIATIAL = INITIAL (1 +20 %)
# b) NEXT = 10% * INITIAL
# c) MAXEXTENTS = 255
# Note: ce programme a ete redige en PERL pour des questions de rapidite
# ---------------------------------------------------------------------

# toutes les variables d'environnement du 'ksh' appelant sont dans une pile appellee 'ENV'

$DIR        = $ENV{DIR};        # exemple : $DIR = "/ora_arch_log/blitst" ;

#$own_schema = $ENV{own_schema}; # exemple : $own_schema = "BLIDBA";
#print " -- prog : augm_taille_tab.pl -- DIR: ".$DIR." -- own_schema: ".$own_schema."\n" ;

open (INFILE,    "$DIR/indexfile_maj2.sql") || die "ouverture FIC INDEXFILE impossible: $!\n";
open (OUTFILE, "> $DIR/indexfile_maj.sql")  || die "ouverture FIC RESULTAT TRAITEMENT impossible: $!\n";

$ligne = '' ;

while( $record = <INFILE>)
{
     # -----------------------------------------------------------------------------------------------------
     # -- correction d'un bug Oracle : 
     # -- dans le fichier 'indexfile.sql', creer par "imp indexfile=XXX", 
     # -- a) les noms de tables "nom_tab",
     # -- dans les commandes <<CREATE UNIQUE INDEX "nom_idx" ON "nom_tab" ...;>>, presentes
     # -- dans ce fichier, ne sont pas prefixes par le proprietaire (OWNER) de la table
     # -- b) idem dans les commandes : <<ALTER TABLE "nom_tab1" ADD "nom_contrainte" ... REFERENCES "nom_tab2"
     # -- ou les noms de tables "nom_tab2" ne pas prexifes par le nom de leur proprietaire
     # ----------------------------------------------------------------------------------------------------

     if ( $record =~ /CREATE.*INDEX / ) # on recherche les enregistrements avec "CREATE ... INDEX "
          {
            # -- on coupe l'enregistrement de part et d'autre du mot " ON "
            ($rec_on_left , $rec_on_right  ) = split / ON /, $record , 2 ;
            #print "- rec_on_left -> ".$rec_on_left."\n" ;
            #print "- rec_on_right -> ".$rec_on_right."\n" ;

            # -- on coupe l'enregistrement de part et d'autre du mot " INDEX "
            ($rec_idx_left, $rec_idx_right ) = split / INDEX /, $record , 2 ;

            # -- on coupe la chaine '$rec_idx_right' de part et d'autre du "."
            ($own_schema  , $rec_dot_right ) = split /\./, $rec_idx_right , 2 ;

            # ---------------------------------------------------------------------------------
            # -- on obtient le proprietaire de l'index, en selectionnant la chaine de caractere
            # -- comprise entre le mot " INDEX" et le ".". Ce proprietraire servira a prefixer
            # -- le nom de la table, dans le nouvelle ordre SQL de creation de cet INDEX
            # ---------------------------------------------------------------------------------
            #print "- own_schema -> >".$own_schema."< \n" ;
            $own_schema =~ s/ //g ; # on enleve les possibles blancs dans ce nom
            $record = $rec_on_left." ON ".$own_schema.".".$rec_on_right ;
            $record =~ s/\. /\./g ; # on enleve les possibles blancs apres un "."
            #print "- record --> ".$record."\n" ;
          }

     if ( $record =~ /REFERENCES/ ) # on recherche les enregistrements avec "ALTER TABLE ... REFERENCES "
     # --------------------------------------------------------------------------------------------
     # ex. avec la commande : 
# ALTER TABLE "ECOLDBA"."TBL_CONTROL" ADD CONSTRAINT "R_35" FOREIGN KEY ("BP_CODE") REFERENCES "TBL_BUSINESS_PARTNER" ("BP_CODE") ;
     # --------------------------------------------------------------------------------------------
          {
            $rec_alt_right = $record."\n" ;
            $rec_alt_right =~ s/.*ALTER TABLE // ; # chaine 'rec_alt_right' sans 'ALTER TABLE '
            #print "- rec_alt_right --> ".$rec_alt_right."\n" ;
     
            # avec l'ex. on obtient: $rec_alt_right =
            # "ECOLDBA"."TBL_CONTROL" ADD CONSTRAINT "R_35" FOREIGN KEY ("BP_CODE") REFERENCES "TBL_BUSINESS_PARTNER" ("BP_CODE")

            # -- on coupe la chaine '$rec_alt_right' de part et d'autre du mot " REFERENCES "
            ($rec_pref_left , $rec_pref_right ) = split / REFERENCES /, $rec_alt_right , 2 ;

            #print "- rec_pref_left --> ".$rec_pref_left."\n" ;
            #print "- rec_pref_right --> ".$rec_pref_right."\n" ;
            # --------------------------------------------------------------------------------------------
            # avec l'ex. on obtient 2 chaines :
            # $rec_pref_left  :"ECOLDBA"."TBL_CONTROL" ADD CONSTRAINT "R_35" FOREIGN KEY ("BP_CODE") 
            # $rec_pref_right :"TBL_BUSINESS_PARTNER" ("BP_CODE") ;
            # --------------------------------------------------------------------------------------------

            # --------------------------------------------------------------------------------------------
            # -- on coupe la chaine '$rec_idx_right' de part et d'autre du "."
            # -- Dans l'ex., on obtient ainsi : $own_schema2 : "ECOLDBA"
            # --------------------------------------------------------------------------------------------
            ($own_schema2  , $rec_dot_right2 ) = split /\./, $rec_pref_left , 2 ;
            $own_schema2 =~ s/ //g ; # on enleve les possibles blancs dans ce nom
            #print "- own_schema2 -> >".$own_schema2."< \n" ;

            # --------------------------------------------------------------------------------------------
            # -- on reconstitue l'enregistrement :
            # -- Avec l'ex., on obtient ainsi :
# ALTER TABLE "ECOLDBA"."TBL_CONTROL" ADD CONSTRAINT "R_35" FOREIGN KEY ("BP_CODE") REFERENCES "ECOLDBA"."TBL_BUSINESS_PARTNER" ("BP_CODE") ;
            # --------------------------------------------------------------------------------------------
            $record = "ALTER TABLE ".$rec_pref_left." REFERENCES ".$own_schema2.".".$rec_pref_right ;
            $record =~ s/  / /g ; # on enleve les possibles blancs, en trop, dans cette chaine
            $record =~ s/\. /\./g ; # on enleve le possible blanc apres le '.', en trop, dans cette chaine

            #print "- record --> ".$record."\n" ;
          }

     # -- Fin de la correction du bug ---------------------------------------------------

     chomp $record ;
     if ( $record =~ /\(INITIAL / )
           {
             # -- on coupe l'enregistrement de part et d'autre du mot "(INITIAL "
             # -- on 'splite' une seule fois. On precise que le split ne peut creer que 2 chaines.
             ($rec_left, $rec_right ) = split /\(INITIAL /, $record , 2 ; 

             # -- on coupe le reste de l'enreg a droite '$rec_right' de part et d'autre du mot ") TABLESPACE "
             ($rec_right1, $rest ) = split /\).* TABLESPACE /, $rec_right, 2 ;
             
             #print "- Nouv reste de l'enreg a Gauche --> ".$rec_right1."\n"  ;

             #if ( $rec_left =~ /TBL_ART_DOC_REL/ )
             #   {
             #     print "- Reste de l'enreg a Gauche --> ".$rec_left."\n"  ;
             #     print "- Reste de l'enreg a Droite --> ".$rec_right."\n"  ;
             #     print "- Nouv reste de l'enreg a Gauche --> ".$rec_right1."\n"  ;
             #     print "- Nouveau reste de l'enreg à Droite --> ".$rest."\n" ;
             #   }

             # ---------------------------------------------------------------------------------
             # -- on coupe la variable '$rec_right1' de part et d'autre du mot " FREELISTS"
             # -- (on obtient la taille de la valeur de 'l'INITIAL' entre prenant la chaine 
             # -- obtenue comprise entre la chaine '(INITIAL " et la chaine " FREELISTS")
             # ---------------------------------------------------------------------------------
             ($val_initial, $other) = split / FREELISTS.*\)/, $rec_right1 , 2 ;
             #print "- val initial --> ".$val_initial."\n" ;
             #print "- rest --> ".$rest."\n" ;

             # -- INITIATIAL = INITIAL (1 +20 %) -----------------------------------------------
             $init = int( ( $val_initial * 1.20 ) / 1024 ) ; # augmentation et conversion
             #print "- init --> ".$init."\n" ;

             # -- NEXT = 10% * INITIAL ------------------------------
             $next = int( ($init / 10) + 2 ) ;
             #print "- next --> ".$next."\n" ;

             # -- on reconstitue l'enregistrement : 'CREATE ... (INITIAL nnnK NEXT nnnK MAXEXTENTS UNLIMITED) ... TABLESPACE ... ;'
             $record = $rec_left." \(INITIAL ".$init."K NEXT ".$next."K MAXEXTENTS UNLIMITED\) TABLESPACE ".$rest."\n" ;
             #print "- record --> ".$record."\n" ;
           }
     print OUTFILE $record."\n";
}
