App-MBUtiny
view release on metacpan or search on metacpan
lib/App/MBUtiny/Collector/DBI.pm view on Meta::CPAN
ORDER BY `time` DESC
LIMIT 1
DML
use constant COLLECTOR_SELECT_LASTFILE => <<'DML';
SELECT `id`, `type`, `time`, `name`, `addr`, `status`, `file`, `size`, `md5`, `sha1`, `error`, `comment`
FROM mbutiny
WHERE `name` = ?
ORDER BY `time` DESC
LIMIT 1
DML
use constant COLLECTOR_REPORT => <<'DML';
SELECT `id`, `type`, `time`, `name`, `addr`, `status`, `file`, `size`, `md5`, `sha1`, `error`, `comment`
FROM mbutiny
WHERE `time` > ?
DML
use base qw/Exporter/;
@EXPORT_OK = qw/
COLLECTOR_DB_FILENAME
COLLECTOR_DB_FILE
/;
sub COLLECTOR_DB_FILE { File::Spec->catfile(sharedstatedir(), PREFIX, COLLECTOR_DB_FILENAME) }
sub new {
my $class = shift;
my %args = @_;
unless ($args{dsn}) {
my $dda = DEFAULT_DBI_ATTR;
foreach (%$dda) {
$args{$_} //= $dda->{$_}
}
}
my $file = $args{file} || COLLECTOR_DB_FILE();
my $dsn = $args{dsn} || sprintf(DEFAULT_DSN_MASK, $file);
# DB
my $db = new CTK::DBI(
-dsn => $dsn,
-debug => 0,
-username => $args{'user'},
-password => $args{'password'},
-attr => _attr($args{'set'}),
$args{timeout} ? (
-timeout_connect => $args{timeout},
-timeout_request => $args{timeout},
) : (),
$args{user} ? () : (),
);
my $dbh = $db->connect if $db;
# SQLite
my $fnew = 0;
my $issqlite = 0;
if ($dbh && $dsn =~ /SQLite/i) {
$file = $dbh->sqlite_db_filename();
unless ($file && (-e $file) && !(-z $file)) {
touch($file);
chmod(0666, $file);
$fnew = 1;
}
$issqlite = 1;
}
my $error = "";
if (!$db) {
$error = sprintf("Can't init database \"%s\"", $dsn);
} elsif (!$dbh) {
$error = sprintf("Can't connect to database \"%s\": %s", $dsn, $DBI::errstr || "unknown error");
} elsif ($fnew) {
$db->execute(COLLECTOR_DDL);
$error = $dbh->errstr();
}
unless ($error) {
$error = sprintf("Can't init database \"%s\". Ping failed: %s",
$dsn, $dbh->errstr() || "unknown error") unless $dbh->ping;
}
my $self = bless {
file => $file,
issqlite=> $issqlite,
dsn => $dsn,
error => $error,
db => $db,
}, $class;
return $self;
}
sub error {
my $self = shift;
my $err = shift;
return $self->{error} unless defined $err;
$self->{error} = $err;
return $self->{error};
}
sub dsn {
my $self = shift;
return $self->{dsn};
}
sub is_sqlite {
my $self = shift;
return $self->{issqlite} ? 1 : 0;
}
sub add {
my $self = shift;
my %params = @_;
my $db = $self->{db};
unless ($db) {
$self->error(sprintf("Database \"%s\" connect failed", $self->dsn))
unless $self->error;
return 0;
}
$self->error("");
$db->execute(COLLECTOR_INSERT,
$params{type} || 0,
time(),
$params{name},
$params{addr} || DEFAULT_ADDR,
$params{status} || 0,
( run in 1.924 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )