aboutsummaryrefslogtreecommitdiff
path: root/lib/App/Ping903/Command/dbload.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App/Ping903/Command/dbload.pm')
-rw-r--r--lib/App/Ping903/Command/dbload.pm95
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;
+
+
+
+

Return to:

Send suggestions and report system problems to the System administrator.