#!/usr/bin/perl
# essai de diverses possibilites de Perl
# $Id: csv_in.pl,v 1.3 2003/12/05 10:39:05 herbelot Exp $

use DBI;
use strict;	# bien penser a utiliser "my" pour decalrer les variables

# programme de recuperation des donnees du tableau Excel des exigences

# structure des donnees en entree
my $line; 	# une ligne du tableau excel d'origine
my $vide; 	# premier champ vide de la ligne
my $no_ligne; 	# no de ligne ?
my $para; 	# reference du paragraphe ou l'exigence apparait
my $req_id; 	# reference de l'exigence
my $issue; 	# no de version de l'exigence
my $content; 	# paragraphe complet definissant l'exigence
my $reste; 	# reste de la ligne

# parametres de la base de donnees
my $database = "trace";
#my $host = "unx-1923.sfim.fr";
my $host = "wux-moto.sfim.fr";
my $username = "trace";
my $pw = "KKKK";
my $dbsource = "DBI:Pg:dbname=".$database.";host=".$host;

# nombre de boucles par req pour benchmark
my $test_n_boucles = 20;

# connexion a la base de donnees
my $dbh = DBI->connect($dbsource,$username,$pw,{
                   PrintError => 0,
                   AutoCommit => 1
             });
die "Unable to connect: $DBI::errstr\n" unless (defined $dbh);

# premiere requete sur la base
my $sth = $dbh->prepare(q{INSERT
	INTO exigences (no_ligne, no_para, req_id, issue, content)
	VALUES (?, ?, ?, ?, ?)}) or
  die "Unable to prep our query:".$dbh->errstr."\n";

my %seen = ();
my @uniq = ();

my $time        = localtime;
print $time,"\n";

# boucle de lecture des lignes du tableau Excel
while (defined($line = <>) ) {
	chomp $line;
	# concatenation des lignes continuation
	if ($line =~ s/\\$/\n/) {
		$line .= <>;
		redo unless eof();
	}
	# process full record in $line here
	($vide,$no_ligne,$para,$req_id,$issue,$content,$reste) = split ';',$line;

	# verification de l'unicite des req_id
	if ($seen{$req_id}) {
		;
		print $no_ligne," ",$para," ",$req_id,"\n";
	} else {
		# if we get here, we have not seen it before
		$seen{$req_id} = 1;
		push(@uniq, $req_id);
		# on lance la requete avec le bon no de req (no unique, maintenant)
		# ajout d'un test de boucle pour benchmark
		for (my $i = 1; $i <= $test_n_boucles; $i++) {
		my $new_req_id = $req_id.$i;
		my $rc =
			$sth->execute($no_ligne,$para,$new_req_id,$issue,$content) or
		  die "Unable to execute our query:".$dbh->errstr."\n";
		}

	}
}

my $time        = localtime;
print $time,"\n";

# close up shop and go home, we are done.
$sth->finish;
# ne pas oublier de commiter les modifications dans la base !!!
#$dbh->commit;
$dbh->disconnect;
