package DBIx::dbMan::Extension::InputCSV;
use strict;
use base 'DBIx::dbMan::Extension';
use Text::CSV_XS;
use FileHandle;
our $VERSION = '0.06';
1;
sub IDENTIFICATION { return "000001-000041-000006"; }
sub preference { return 0; }
sub known_actions { return [ qw/CSV_IN/ ]; }
sub handle_action {
my ($obj,%action) = @_;
if ($action{action} eq 'CSV_IN') {
$action{action} = 'NONE';
my $csv = new Text::CSV_XS { quote => $action{opt_quote},
eol => $action{opt_eol}, binary => 1,
sep_char => $action{opt_separator},
escape_char => $action{opt_escape},
allow_loose_escapes => $action{opt_allow_loose_escapes},
allow_loose_quotes => $action{opt_allow_loose_quotes} };
if ( ! defined $csv ) {
$obj->{ -interface }->error( 'Cannot initialize parser for CSV files.' );
return %action;
}
my $file = new FileHandle "<$action{file}";
if ( $obj->{ -interface }->is_utf8 ) {
binmode $file, ':utf8';
}
unless (defined $file) {
$obj->{-interface}->error("Can't load input CSV file $action{file}.");
return %action;
}
local $/ = $action{opt_eol};
my $now_head = 1;
while (<$file>) {
chomp;
if ($csv->parse($_)) {
my @f = $csv->fields();
if ($now_head and $action{opt_headings} == 1) {
$now_head = 0; next;
}
$now_head = 0;
my $newaction = { action => 'SQL', sql => $action{sql}, type => 'do', placeholders => \@f };
$obj->{-interface}->add_to_actionlist($newaction);
}
}
$file->close();
}
$action{processed} = 1;
return %action;
}