The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Text::CSV;
use oEdtk::Main;
use oEdtk::Config	qw(config_read);
use oEdtk::DBAdmin	qw(db_connect);

if ($#ARGV < 1 or $ARGV[0] =~/-h/i) {
	die "\nUsage: $0 <table> <csv> [INI_SECTION]\n"
		."\n\t\twhere INI_SECTION is a configuration section in edtk.ini\n"
		."\t\t\t(usefull to load params in Prod, Dev, or other environnement)\n\n";
	exit 1;
}

my ($table, $file) = @ARGV;
my $section = shift || "";
my $DBI = 'EDTK_DBI_PARAM';
		$DBI = 'EDTK_DBI_DSN' if ($section ne "");

open(my $fh, "<", $file) or die "ERROR: can't open $file: $!\n";
my $csv = Text::CSV->new({ sep_char => ';', binary => 1 });

my $cfg = config_read('EDTK_DB', $section);
my $dbh = db_connect($cfg, $DBI,
    { AutoCommit => 0, RaiseError => 1 });

# Set the column names.
$csv->column_names($csv->getline($fh));

eval {
	if ($dbh->{'Driver'}->{'Name'} eq 'SQLite') {
		$dbh->do("DELETE FROM $table");
	} else {
		$dbh->do("TRUNCATE TABLE $table");
	}

	while (my $row = $csv->getline_hr($fh)) {
		my $sql = "INSERT INTO $table (" . join(', ', keys(%$row)) 
				. ") VALUES (" . join(', ', ('?') x keys(%$row)) . ")";
		$dbh->do($sql, undef, values(%$row));
	}
	$dbh->commit;
};
if ($@) {
	warn "ERROR: $@\n";
	eval { $dbh->rollback };
}

$dbh->disconnect;
close($fh);