Fix to update(\%args) with inflation from test case by Peter Rabbitson
Matt S Trout [Fri, 3 Mar 2006 15:18:27 +0000 (15:18 +0000)]
lib/DBIx/Class/InflateColumn.pm
t/lib/DBICTest/Schema.pm
t/lib/sqlite.sql
t/run/08inflate.tl

index f60e112..6efbe13 100644 (file)
@@ -124,6 +124,18 @@ sub _inflated_column_op {
   return $obj;
 }
 
+sub update {
+  my ($class, $attrs, @rest) = @_;
+  $attrs ||= {};
+  foreach my $key (keys %$attrs) {
+    if (ref $attrs->{$key}
+          && exists $class->column_info($key)->{_inflate_info}) {
+      $attrs->{$key} = $class->_deflated_column($key, $attrs->{$key});
+    }
+  }
+  return $class->next::method($attrs, @rest);
+}
+
 sub new {
   my ($class, $attrs, @rest) = @_;
   $attrs ||= {};
index 2355aeb..8090e51 100644 (file)
@@ -16,6 +16,7 @@ __PACKAGE__->load_classes(qw/
     OneKey
     #dummy
     TwoKeys
+    Serialized
   /]},
   (
     'FourKeys',
index 8015b29..1ee7c21 100644 (file)
@@ -131,4 +131,12 @@ CREATE TABLE self_ref (
   name varchar NOT NULL
 );
 
+--
+-- Table: serialized
+--
+CREATE TABLE serialized (
+    id INTEGER PRIMARY KEY NOT NULL,
+    serialized text NOT NULL
+);
+
 COMMIT;
index e21a6c6..97d0778 100644 (file)
@@ -4,7 +4,7 @@ my $schema = shift;
 eval { require DateTime };
 plan skip_all => "Need DateTime for inflation tests" if $@;
 
-plan tests => 3;
+plan tests => 5;
 
 DBICTest::Schema::CD->inflate_column( 'year',
     { inflate => sub { DateTime->new( year => shift ) },
@@ -27,6 +27,34 @@ $cd->update;
 ($cd) = $schema->resultset("CD")->search( year => $now->year );
 is( $cd->year->year, $now->year, 'deflate ok' );
 
+use YAML;
+DBICTest::Schema::Serialized->inflate_column( 'serialized',
+    { inflate => sub { Load (shift) },
+      deflate => sub { die "Expecting a reference" unless (ref $_[0]); Dump (shift) } }
+);
+Class::C3->reinitialize;
+
+my $complex1 = {
+    id => 1,
+    serialized => {
+        a => 1,
+        b => 2,
+    },
+};
+
+my $complex2 = {
+    id => 1,
+    serialized => [qw/a b 1 2/],
+};
+
+my $rs = $schema->resultset('Serialized');
+
+my $entry = $rs->create($complex2);
+
+ok($entry->update ($complex1), "update with hashref deflating ok");
+
+ok($entry->update ($complex2), "update with arrayref deflating ok");
+
 }
 
 1;