$App::JESP::Driver::VERSION
=
'0.013'
;
has
'jesp'
=> (
is
=>
'ro'
,
isa
=>
'App::JESP'
,
required
=> 1,
weak_ref
=> 1);
sub
apply_patch{
my
(
$self
,
$patch
) =
@_
;
$log
->info(
"Applying patch "
.
$patch
->id());
if
(
my
$sql
=
$patch
->sql() ){
$log
->trace(
"Patch is SQL='$sql'"
);
return
$self
->apply_sql(
$sql
);
}
if
(
my
$script_file
=
$patch
->script_file() ){
$log
->trace(
"Patch is SCRIPT='"
.
$script_file
.
"'"
);
return
$self
->apply_script(
$script_file
);
}
}
sub
apply_script{
my
(
$self
,
$script
) =
@_
;
my
@cmd
= (
$script
);
my
$input
=
''
;
my
$on_stdout
=
sub
{
$log
->info(
@_
);
};
my
@stderr
;
my
$on_stderr
=
sub
{
$log
->
warn
(
@_
);
push
@stderr
,
@_
;
};
my
$properties
= {};
my
(
$scheme
,
$driver
,
$attr_string
,
$attr_hash
,
$driver_dsn
) = DBI->parse_dsn(
$self
->jesp()->dsn() );
ref
(
$self
)->_OdbcParse(
$driver_dsn
,
$properties
, [] );
$properties
->{user} ||=
$self
->jesp()->username();
$properties
->{password} ||=
$self
->jesp()->password();
$properties
= {
%$properties
,
%{
defined
(
$attr_hash
) ?
$attr_hash
: {} },
dsn
=>
$self
->jesp()->dsn(),
scheme
=>
$scheme
,
driver
=>
$driver
,
driver_dsn
=>
$driver_dsn
,
attr_string
=>
$attr_string
,
};
my
%EXTRA_ENV
= ();
$EXTRA_ENV
{IPCRUNDEBUG} =
'basic'
unless
(
$ENV
{AUTOMATED_TESTING} ||
$ENV
{HARNESS_ACTIVE} );
foreach
my
$key
(
keys
%{
$properties
} ){
if
(
$properties
->{
$key
} ){
$EXTRA_ENV
{
'JESP_'
.
uc
(
$key
)} =
$properties
->{
$key
};
}
}
local
%ENV
= (
%ENV
,
%EXTRA_ENV
);
IPC::Run::run( \
@cmd
, \
$input
,
$on_stdout
,
$on_stderr
) or
die
join
(
' '
,
@cmd
).
": $? : "
.
join
(
"\n"
,
@stderr
).
"\n"
;
}
sub
apply_sql{
my
(
$self
,
$sql
) =
@_
;
my
$dbh
=
$self
->jesp()->get_dbh()->();
my
$ret
=
$dbh
->
do
(
$sql
);
return
defined
(
$ret
) ?
$ret
: confess(
$dbh
->errstr() );
}
sub
_OdbcParse {
my
(
$class
,
$dsn
,
$hash
,
$args
) =
@_
;
my
(
$var
,
$val
);
if
(!
defined
(
$dsn
)) {
return
;
}
while
(
length
(
$dsn
)) {
if
(
$dsn
=~ /([^:;]*\[.*]|[^:;]*)[:;](.*)/) {
$val
= $1;
$dsn
= $2;
$val
=~ s/\[|]//g;
}
else
{
$val
=
$dsn
;
$dsn
=
''
;
}
if
(
$val
=~ /([^=]*)=(.*)/) {
$var
= $1;
$val
= $2;
if
(
$var
eq
'hostname'
||
$var
eq
'host'
) {
$hash
->{
'host'
} =
$val
;
}
elsif
(
$var
eq
'db'
||
$var
eq
'dbname'
) {
$hash
->{
'database'
} =
$val
;
}
else
{
$hash
->{
$var
} =
$val
;
}
}
else
{
foreach
$var
(
@$args
) {
if
(!
defined
(
$hash
->{
$var
})) {
$hash
->{
$var
} =
$val
;
last
;
}
}
}
}
}
__PACKAGE__->meta()->make_immutable();