Fix create() in the same way as update() so it throws out the new values and
Michael G Schwern [Wed, 13 Feb 2008 07:41:26 +0000 (23:41 -0800)]
reloads them from the database on demand.

lib/DBIx/Class/CDBICompat/LazyLoading.pm
t/cdbi-t/04-lazy.t

index 0b6691b..e8ffbcc 100644 (file)
@@ -20,14 +20,38 @@ sub update {
     my @dirty_columns = keys %{$self->{_dirty_columns}};
     
     my $ret = $self->next::method(@_);
-    
-    delete $self->{_column_data}{$_}     for @dirty_columns;
-    delete $self->{_inflated_column}{$_} for @dirty_columns;
+    $self->_clear_column_data(@dirty_columns);
     
     return $ret;
 }
 
 
+# And again for create
+sub create {
+    my $class = shift;
+    my($data) = @_;
+    
+    my @columns = keys %$data;
+    
+    my $obj = $class->next::method(@_);
+    return $obj unless defined $obj;
+    
+    my %primary_cols = map { $_ => 1 } $class->primary_columns;
+    my @data_cols = grep !$primary_cols{$_}, @columns;
+    $obj->_clear_column_data(@data_cols);
+
+    return $obj;
+}
+
+
+sub _clear_column_data {
+    my $self = shift;
+    
+    delete $self->{_column_data}{$_}     for @_;
+    delete $self->{_inflated_column}{$_} for @_;
+}
+
+
 sub get_column {
   my ($self, $col) = @_;
   if ((ref $self) && (!exists $self->{'_column_data'}{$col})
index 1ca413c..39d3efd 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
     next;
   }
        eval "use DBD::SQLite";
-       plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 30);
+       plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 34);
 }
 
 INIT {
@@ -80,7 +80,7 @@ eval {    # Multiple false columns
 ok($@, $@);
 
 
-# Test that update() throws out columns that changed
+# Test that create() and update() throws out columns that changed
 {
     my $l = Lazy->create({
         this => 99,
@@ -88,7 +88,15 @@ ok($@, $@);
         oop  => 3,
         opop => 4,
     });
-    
+
+    ok $l->db_Main->do(qq{
+        UPDATE @{[ $l->table ]}
+        SET    oop  = ?
+        WHERE  this = ?
+    }, undef, 87, $l->this);
+
+    is $l->oop, 87;
+
     $l->oop(32);
     $l->update;
 
@@ -117,7 +125,15 @@ ok($@, $@);
         that => 2,
         orp  => 1998,
     });
+
+    ok $l->db_Main->do(qq{
+        UPDATE @{[ $l->table ]}
+        SET    orp  = ?
+        WHERE  this = ?
+    }, undef, 1987, $l->this);
     
+    is $l->orp, '1987-01-01';
+
     $l->orp(2007);
     is $l->orp, '2007-01-01';   # make sure it's inflated
     $l->update;