package App::MonM::Checkit::DBI; # $Id: DBI.pm 78 2019-07-07 19:48:16Z abalama $
use strict;
use utf8;
=encoding utf-8
=head1 NAME
App::MonM::Checkit::DBI - Checkit DBI subclass
=head1 VIRSION
Version 1.00
=head1 SYNOPSIS
Enable yes
Type dbi
DSN DBI:mysql:database=DBNAME;host=127.0.0.1
SQL "SELECT 'OK' AS OK FROM DUAL" # By default
User USER
Password PASSWORD
Timeout 15 # Connect and request timeout, secs
Set RaiseError 0
Set PrintError 0
Set mysql_enable_utf8 0
# . . .
=head1 DESCRIPTION
Checkit DBI subclass
=head2 check
Checkit method.
This is backend method of L
Returns:
=over 4
=item B
The DBH error code ($dbh->err)
=item B
The merged response content
=item B
OK or ERROR value, see "status"
=item B
DSN of DBI connection
=item B
0 if error occured; 1 if no errors found
=back
=head1 HISTORY
See C file
=head1 TO DO
See C file
=head1 BUGS
* none noted
=head1 SEE ALSO
L
=head1 AUTHOR
Serż Minus (Sergey Lepenkov) L Eabalama@cpan.orgE
=head1 COPYRIGHT
Copyright (C) 1998-2019 D&D Corporation. All Rights Reserved
=head1 LICENSE
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
See C file and L
=cut
use vars qw/$VERSION/;
$VERSION = '1.00';
use CTK::DBI;
use CTK::ConfGenUtil;
use App::MonM::Util qw/set2attr/;
use constant {
DEFAULT_DSN => "dbi:Sponge:",
DEFAULT_TIMEOUT => 0,
DEFAULT_SQL => "SELECT 'OK' AS OK FROM DUAL",
};
sub check {
my $self = shift;
my $type = $self->type;
return $self->maybe::next::method() unless $type && $type eq 'dbi';
# Init
my $dsn = value($self->config, 'dsn') || DEFAULT_DSN;
$self->source($dsn);
my $timeout = value($self->config, 'timeout') || DEFAULT_TIMEOUT;
my $attr = set2attr($self->config);
my $sql = value($self->config, 'sql') // value($self->config, 'content') // DEFAULT_SQL;
my $user = value($self->config, 'user');
my $password = value($self->config, 'password');
# DB
my $db = new CTK::DBI(
-dsn => $dsn,
-debug => 0,
-username => $user,
-password => $password,
-attr => $attr,
$timeout ? (
-timeout_connect => $timeout,
-timeout_request => $timeout,
) : (),
);
my $dbh = $db->connect if $db;
# Connect
my @resa = ();
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");
} else {
my $sth = $db->execute($sql);
$error = $dbh->errstr();
if ($sth) {
@resa = $sth->fetchrow_array;
$sth->finish;
}
}
# Result
my $result = join("", @resa) // '';
$self->content($result);
my $status = (defined($error) && length($error)) ? 0 : 1;
$self->status($status);
$self->error($error) if defined($error) && length($error);
$self->code($dbh ? $dbh->err || 0 : 0);
$self->message($self->status ? "OK" : "ERROR");
return;
}
1;
__END__