diff options
Diffstat (limited to 'lib/App/Ping903/Command/dbload.pm')
-rw-r--r-- | lib/App/Ping903/Command/dbload.pm | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/App/Ping903/Command/dbload.pm b/lib/App/Ping903/Command/dbload.pm new file mode 100644 index 0000000..d7b4e20 --- /dev/null +++ b/lib/App/Ping903/Command/dbload.pm @@ -0,0 +1,95 @@ +package App::Ping903::Command::dbload; +use strict; +use warnings; +use parent 'App::Ping903::Command'; +use App::Ping903::Command ':exit_codes'; +use JSON; +use DBI; +use File::Spec; + +sub new { + my ($class, $com, $agent) = @_; + + my $self = bless $class->SUPER::new($com, $agent, + 'D|driver=s' => 'driver', + 'd|database=s' => sub { + my $self = shift; + push @{$self->{options}{connarg}}, "database=$_[1]"; + }, + 'h|host=s' => sub { + my $self = shift; + push @{$self->{options}{connarg}}, "host=$_[1]"; + }, + 'P|port=s' => sub { + my $self = shift; + push @{$self->{options}{connarg}}, "port=$_[1]"; + }, + 'u|user=s' => 'dbuser', + 'p|password=s' => 'dbpass', + 'params=s' => 'dbparams', + 'defaults-file=s' => 'defaults-file', + 't|table=s' => 'table', + 'c|column=s' => 'column', + 'q|query=s' => 'query'); + + $self->{options}{driver} = 'mysql'; + + $self; +} + +sub run { + my $self = shift; + $self->SUPER::run; + $self->usage_error("extra parameters") if @ARGV; + + my $query = $self->option('query'); + unless ($query) { + $self->usage_error("--table option must be specified") + unless $self->option('table'); + $self->usage_error("--column option must be specified") + unless $self->option('column'); + $query = qq{SELECT $self->{options}{column} FROM $self->{options}{table}}; + } + + if (my $p = $self->option('dbparams')) { + push @{$self->{options}{connarg}}, $p; + } + + unless ($self->{options}{connarg}) { + $self->usage_error('Database parameters not initialized. Please use the --database (optionally - --host and --port) option.'); + } + + if ($self->option('driver') eq 'mysql') { + unless ($self->option('defaults-file')) { + my $f = File::Spec->catfile($ENV{HOME}, '.my.cnf'); + if (-f $f) { + $self->option('defaults-file', $f); + } + } + } + if (my $p = $self->option('defaults-file')) { + push @{$self->{options}{connarg}}, ";mysql_read_default_file=$p"; + } + + my $arg = join(':', ('DBI',$self->{options}{driver}, + @{$self->{options}{connarg}})); + + my $dbh = DBI->connect($arg, $self->{options}{dbuser}, + $self->{options}{dbpass}, + { RaiseError => 0, PrintError => 1, AutoCommit => 1}) + or $self->abend(EX_FAIL, "can't connect to the database server"); + + my $res = $dbh->selectall_arrayref($query, + { RaiseError => 0, PrintError => 1 }) + or $self->abend(EX_FAIL, "query failed"); + + unless ($self->agent->set_ip_list([ map { $_->[0] } @$res ])) { + $self->abend(EX_FAIL, $self->agent->error_message); + } +} + +1; + + + + |