File: //lib/susshi/exec/Susshi/DB.pm
package Susshi::DB;
use warnings;
use strict;
use DBI;
sub new {
my $class = shift;
my %args = @_;
my $self = {};
foreach my $key ( qw (username userpassword databasehost databasename) ) {
$self->{$key} = delete $args{$key} or die "Missing mandatory option $key";
}
$self->{databasesocket} = delete $args{databasesocket};
$self->{tablefilter} = delete $args{tablefilter} // '';
return bless $self, $class;
}
sub _get_dsn {
my $self = shift;
if (! $self->{_dsn}) {
$self->{_dsn} = sprintf 'dbi:mysql:database=%s;hostname=%s',
$self->{databasename}, $self->{databasehost};
$self->{_dsn} .= ';mysql_socket=' . $self->{databasesocket} if $self->{databasesocket};
}
return $self->{_dsn};
}
sub _get_dbh {
my $self = shift;
if (! $self->{_dbh}) {
$self->{_dbh} = DBI->connect (
$self->_get_dsn,
$self->{username},
$self->{userpassword},
{ RaiseError => 0, PrintError => 0, }
) or die $DBI::errstr . "\n";
}
return $self->{_dbh};
}
sub drop_tables {
my $self = shift;
my ($tbls) = @_;
die unless ref $tbls eq 'ARRAY';
my $dbh = $self->_get_dbh;
foreach my $tbl (@$tbls) {
$dbh->do('DROP TABLE ' . $dbh->quote_identifier($tbl));
}
}
sub get_mysql_args {
my $self = shift;
my @mysql_args=(
'--host=' . $self->{databasehost},
'--user=' . $self->{username},
'--password=' . $self->{userpassword},
$self->{databasename},
);
push @mysql_args, '--socket=' . $self->{databasesocket} if $self->{databasesocket};
return @mysql_args;
}
sub get_tables {
my $self = shift;
my $size = 0;
my @tables = ();
my $prefix = $self->{tablefilter};
my $dbh = $self->_get_dbh;
my $query = 'SHOW TABLE STATUS';
if ($prefix) {
$query .= ' LIKE ' . $dbh->quote($prefix . '%');
}
my $sth = $dbh->prepare($query);
$sth->execute;
while (my $t = $sth->fetchrow_hashref()) {
$size += $t->{Index_length} + $t->{Data_length};
push @tables, $t->{Name};
}
return $size, \@tables;
}
1;