#!/usr/bin/perl -w
IS_TTY SCREENWIDTH
OK DONE ERROR SKIPPED PASSED FAILED UNKNOWN PROBLEM
/
;
DSN
=>
"dbi:Sponge:"
,
SQL
=>
"SELECT 'OK' AS STATUS FROM DUAL"
,
DBI_ATTRIBUTES
=> [
"PrintError = 0"
,
],
};
$SIG
{INT} =
sub
{
die
"ABORTED\n"
; };
$| = 1;
my
$options
= {};
Getopt::Long::Configure(
"bundling"
);
GetOptions(
$options
,
"help|usage|h"
,
"longhelp|H|?"
,
"dsn|n=s"
,
"sid|orasid|s=s"
,
"user|username|login|u=s"
,
"password|passwd|pass|p=s"
,
"sql|query|q=s"
,
"attr|attribute|a=s@"
,
) || pod2usage(
-exitval
=> 1,
-verbose
=> 0,
-output
=> \
*STDERR
);
pod2usage(
-exitval
=> 0,
-verbose
=> 1)
if
$options
->{help};
pod2usage(
-exitval
=> 0,
-verbose
=> 2)
if
$options
->{longhelp};
my
$sw
= (SCREENWIDTH() - 9);
my
$status
= 1;
sub
_start {
my
$s
=
shift
//
''
;
my
$l
=
length
(
$s
);
return
$s
.(
$l
<
$sw
?(
'.'
x(
$sw
-
$l
)):
''
).
' '
}
my
$ctk
= CTK->new();
my
$sid
=
$options
->{sid} ||
""
;
my
$default_dsn
=
sprintf
(
"DBI:Oracle:%s"
,
$sid
)
if
$sid
;
my
$dsn
=
$options
->{dsn} ||
$default_dsn
|| DSN;
my
$user
=
$options
->{user} //
''
;
my
$password
=
$options
->{password} //
''
;
my
$sql
=
$options
->{sql} || SQL;
my
$attr_src
=
$options
->{attr} || DBI_ATTRIBUTES;
my
$attr
= [];
foreach
my
$v
(
@$attr_src
) {
$v
=~ s/\=/ /;
push
@$attr
,
$v
;
}
START:
printf
(
"START TRANSACTION [$$] {TimeStamp: %s}\n"
,
$ctk
->tms);
print
_start(
sprintf
(
"> 1/7 Connecting to \"%s\""
,
$dsn
));
my
$ora
= DBI->
connect
(
$dsn
,
$user
,
$password
, set2attr(
$attr
));
if
(
$ora
) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$DBI::errstr
,
"\n"
;
$status
= 0;
goto
FINISH;
}
print
_start(
sprintf
(
"> 2/7 SQL preparing \"%s\""
, variant_stf(
$sql
, 50)));
my
$sth
=
$ora
->prepare(
$sql
);
if
(!
$ora
->err) {
if
(
$sth
) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
printf
STDERR
"Can't prepare SQL: %s\n"
,
$sql
;
$status
= 0;
goto
FINISH;
}
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$ora
->errstr,
"\n"
if
$ora
->errstr;
$status
= 0;
goto
FINISH;
}
print
_start(
"> 3/7 SQL executing"
);
my
$rv
=
$sth
->execute();
if
(!
$ora
->err) {
if
(
$rv
) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
printf
STDERR
"Can't execute SQL: %s\n"
,
$sql
;
$status
= 0;
goto
FINISH;
}
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$ora
->errstr,
"\n"
if
$ora
->errstr;
$status
= 0;
goto
FINISH;
}
print
_start(
"> 4/7 Result fetching"
);
my
$result
=
$sth
->fetchrow_hashref;
if
(!
$ora
->err) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$ora
->errstr,
"\n"
if
$ora
->errstr;
$status
= 0;
goto
FINISH;
}
print
_start(
"> 5/7 Finishing"
);
$sth
->finish;
if
(!
$ora
->err) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
}
else
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$ora
->errstr,
"\n"
if
$ora
->errstr;
$status
= 0;
goto
FINISH;
}
print
_start(
"> 6/7 Disconnecting"
);
$ora
->disconnect or
do
{
print
IS_TTY ? red(FAILED) : FAILED,
"\n"
;
print
STDERR
$ora
->errstr,
"\n"
if
$ora
->errstr;
$status
= 0;
goto
FINISH;
};
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
print
_start(
"> 7/7 Show content"
);
if
(
defined
(
$result
)) {
if
(
length
(
$result
) && !
ref
(
$result
)) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
printf
(
"-----BEGIN RESPONSE CONTENT-----\n%s\n-----END RESPONSE CONTENT-----\n"
,
$result
)
}
elsif
(
length
(
$result
) &&
ref
(
$result
)) {
print
IS_TTY ? green(PASSED) : PASSED,
"\n"
;
printf
(
"-----BEGIN RESPONSE CONTENT-----\n%s\n-----END RESPONSE CONTENT-----\n"
, explain(
$result
))
}
else
{
print
IS_TTY ? yellow(SKIPPED) : SKIPPED,
"\n"
;
}
}
else
{
print
IS_TTY ? yellow(SKIPPED) : SKIPPED,
"\n"
;
}
FINISH:
printf
(
"FINISH TRANSACTION [$$] {TimeStamp: %s} WITH STATUS = %s\n"
,
$ctk
->tms,
$status
? OK : ERROR);
exit
(
$status
? 0 : 1);