our
$VERSION
=
"0.012537"
;
__PACKAGE__->mk_accessors(
qw(
trace
keep_meta_frozen
serializer_obj
)
);
sub
_init_trace { (
split
(/=/,
$ENV
{DBI_GOFER_TRACE}||0))[0] }
sub
new {
my
(
$class
,
$args
) =
@_
;
$args
->{trace} ||=
$class
->_init_trace;
$args
->{serializer_obj} ||= DBI::Gofer::Serializer::Storable->new();
my
$self
=
bless
{},
$class
;
$self
->
$_
(
$args
->{
$_
} )
for
keys
%$args
;
$self
->trace_msg(
"$class->new({ @{[ %$args ]} })\n"
)
if
$self
->trace;
return
$self
;
}
my
$packet_header_text
=
"GoFER1:"
;
my
$packet_header_regex
=
qr/^GoFER(\d+):/
;
sub
_freeze_data {
my
(
$self
,
$data
,
$serializer
,
$skip_trace
) =
@_
;
my
$frozen
=
eval
{
$self
->_dump(
"freezing $self->{trace} "
.
ref
(
$data
),
$data
)
if
!
$skip_trace
and
$self
->trace;
local
$data
->{meta};
$serializer
||=
$self
->{serializer_obj};
my
(
$data
,
$deserializer_class
) =
$serializer
->serialize(
$data
);
$packet_header_text
.
$data
;
};
if
($@) {
chomp
$@;
die
"Error freezing "
.
ref
(
$data
).
" object: $@"
;
}
$data
->{meta}{frozen} =
$frozen
if
$self
->keep_meta_frozen;
return
$frozen
;
}
*freeze_request
= \
&_freeze_data
;
*freeze_response
= \
&_freeze_data
;
sub
_thaw_data {
my
(
$self
,
$frozen_data
,
$serializer
,
$skip_trace
) =
@_
;
my
$data
;
eval
{
(
my
$frozen
=
$frozen_data
) =~ s/
$packet_header_regex
//o
or
die
"does not have gofer header\n"
;
my
(
$t_version
) = $1;
$serializer
||=
$self
->{serializer_obj};
$data
=
$serializer
->deserialize(
$frozen
);
die
ref
(
$serializer
).
"->deserialize didn't return a reference"
unless
ref
$data
;
$data
->{_transport}{version} =
$t_version
;
$data
->{meta}{frozen} =
$frozen_data
if
$self
->keep_meta_frozen;
};
if
($@) {
chomp
(
my
$err
= $@);
$err
=~ s{ at \S+?/Storable.pm \(autosplit into \S+?/Storable/thaw.al\) line \d+(, \S+ line \d+)?}{};
my
$msg
=
sprintf
"Error thawing: %s (data=%s)"
,
$err
, DBI::neat(
$frozen_data
,50);
Carp::cluck(
"$msg, pid $$ stack trace follows:"
);
die
$msg
;
}
$self
->_dump(
"thawing $self->{trace} "
.
ref
(
$data
),
$data
)
if
!
$skip_trace
and
$self
->trace;
return
$data
;
}
*thaw_request
= \
&_thaw_data
;
*thaw_response
= \
&_thaw_data
;
sub
_dump {
my
(
$self
,
$label
,
$data
) =
@_
;
local
$data
->{meta}{frozen}
if
$data
->{meta} &&
$data
->{meta}{frozen};
my
$trace_level
=
$self
->trace;
my
$summary
;
if
(
$trace_level
>= 4) {
local
$Data::Dumper::Indent
= 1;
local
$Data::Dumper::Terse
= 1;
local
$Data::Dumper::Useqq
= 0;
local
$Data::Dumper::Sortkeys
= 1;
local
$Data::Dumper::Quotekeys
= 0;
local
$Data::Dumper::Deparse
= 0;
local
$Data::Dumper::Purity
= 0;
$summary
= Data::Dumper::Dumper(
$data
);
}
elsif
(
$trace_level
>= 2) {
$summary
=
eval
{
$data
->summary_as_text } || $@ ||
"no summary available\n"
;
}
else
{
$summary
=
eval
{
$data
->outline_as_text.
"\n"
} || $@ ||
"no summary available\n"
;
}
$self
->trace_msg(
"$label: $summary"
);
}
sub
trace_msg {
my
(
$self
,
$msg
,
$min_level
) =
@_
;
$min_level
= 1
unless
defined
$min_level
;
$min_level
= 0
if
$self
->trace >=
$min_level
;
return
DBI->trace_msg(
"gofer "
.
$msg
,
$min_level
);
}
1;