Author: timbo
Date: Thu Aug 16 12:08:08 2007
New Revision: 9847

Modified:
   dbi/trunk/lib/DBI/Gofer/Execute.pm
   dbi/trunk/lib/DBI/Gofer/Transport/Base.pm

Log:
Improve support for multiple serializations.
Add Data::Dumper serialization (output only).
Add arg to override serialier for a free/thaw (minor change in api)
Add way to add extra info to Gofer Execute update_stats


Modified: dbi/trunk/lib/DBI/Gofer/Execute.pm
==============================================================================
--- dbi/trunk/lib/DBI/Gofer/Execute.pm  (original)
+++ dbi/trunk/lib/DBI/Gofer/Execute.pm  Thu Aug 16 12:08:08 2007
@@ -633,7 +633,7 @@
 
 
 sub update_stats {
-    my ($self, $request, $response, $frozen_request, $frozen_response, 
$time_received) = @_;
+    my ($self, $request, $response, $frozen_request, $frozen_response, 
$time_received, $meta) = @_;
 
     my $stats = $self->{stats};
     $stats->{frozen_request_max_bytes} = length($frozen_request)
@@ -648,6 +648,7 @@
             response => $frozen_response,
             time_received => $time_received,
             duration => dbi_time()-$time_received,
+           ($meta) ? (meta => $meta) : (), # for any other info
         };
         shift @$recent_requests if @$recent_requests > $track_recent;
     }

Modified: dbi/trunk/lib/DBI/Gofer/Transport/Base.pm
==============================================================================
--- dbi/trunk/lib/DBI/Gofer/Transport/Base.pm   (original)
+++ dbi/trunk/lib/DBI/Gofer/Transport/Base.pm   Thu Aug 16 12:08:08 2007
@@ -28,43 +28,75 @@
 sub new {
     my ($class, $args) = @_;
     $args->{trace} ||= $class->_init_trace;
-    $args->{serializer_obj} ||= DBI::Gofer::Serializer->new();
+    $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;
 }
 
-{   package DBI::Gofer::Serializer;
+{   package DBI::Gofer::Serializer::Storable;
     # a very minimal subset of Data::Serializer
     use Storable qw(nfreeze thaw);
     sub new {
         return bless {} => shift;
     }
-    sub serializer {
+    sub serialize {
         my $self = shift;
         local $Storable::forgive_me = 1; # for CODE refs etc
         return nfreeze(shift);
     }
-    sub deserializer {
+    sub deserialize {
         my $self = shift;
         return thaw(shift);
     }
 }
 
+{   package DBI::Gofer::Serializer::DataDumper;
+    # a very minimal subset of Data::Serializer
+    require Data::Dumper;
+    sub new {
+        local $Data::Dumper::Indent    = 1;
+        local $Data::Dumper::Terse     = 1;
+        local $Data::Dumper::Useqq     = 0; # enabling this disables xs
+        local $Data::Dumper::Sortkeys  = 1;
+        local $Data::Dumper::Quotekeys = 0;
+        local $Data::Dumper::Deparse   = 0;
+        local $Data::Dumper::Purity    = 0;
+        return bless {
+           dumper => Data::Dumper->new([], undef),
+       } => shift;
+    }
+    sub serialize {
+        my $dumper = shift->{dumper};
+        local $Data::Dumper::Indent    = 1;
+        local $Data::Dumper::Terse     = 1;
+        local $Data::Dumper::Useqq     = 0; # enabling this disables xs
+        local $Data::Dumper::Sortkeys  = 1;
+        local $Data::Dumper::Quotekeys = 0;
+        local $Data::Dumper::Deparse   = 0;
+        local $Data::Dumper::Purity    = 0;
+        return Data::Dumper::Dumper(shift);
+    }
+    sub deserialize {
+       Carp::croak("deserialize not supported for ".__PACKAGE__);
+    }
+}
+
 
 my $packet_header_text  = "GoFER1:";
-my $packet_header_regex = qr/^GoFER(\d):/;
+my $packet_header_regex = qr/^GoFER(\d+):/;
 
 
 sub _freeze_data {
-    my ($self, $data, $skip_trace) = @_;
+    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}; # don't include _meta in serialization
-        my $data = $self->{serializer_obj}->serializer($data);
+       $serializer ||= $self->{serializer_obj};
+        my $data = $serializer->serialize($data);
 
         $packet_header_text . $data;
     };
@@ -80,14 +112,15 @@
 
 
 sub _thaw_data {
-    my ($self, $frozen_data, $skip_trace) = @_;
+    my ($self, $frozen_data, $serializer, $skip_trace) = @_;
     my $data;
     eval {
         # check for and extract our gofer header and the info it contains
         $frozen_data =~ s/$packet_header_regex//o
             or die "does not have gofer header\n";
         my ($t_version) = $1;
-        $data = $self->{serializer_obj}->deserializer($frozen_data)
+       $serializer ||= $self->{serializer_obj};
+        $data = $serializer->deserialize($frozen_data)
             and $data->{_transport}{version} = $t_version;
     };
     if ($@) {
@@ -115,7 +148,7 @@
         require Data::Dumper;
         local $Data::Dumper::Indent    = 1;
         local $Data::Dumper::Terse     = 1;
-        local $Data::Dumper::Useqq     = 1;
+        local $Data::Dumper::Useqq     = 0;
         local $Data::Dumper::Sortkeys  = 1;
         local $Data::Dumper::Quotekeys = 0;
         local $Data::Dumper::Deparse   = 0;

Reply via email to