Emulate that CDBI throws out all changed columns and reloads them on
Michael G Schwern [Wed, 13 Feb 2008 05:14:09 +0000 (21:14 -0800)]
request in case the database modifies the new value (say, via a trigger)

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

index add9390..b3d18e9 100644 (file)
@@ -11,6 +11,22 @@ sub resultset_instance {
   return $rs;
 }
 
+
+# Emulate that CDBI throws out all changed columns and reloads them on 
+# request in case the database modifies the new value (say, via a trigger)
+sub update {
+    my $self = shift;
+    
+    my @dirty_columns = keys %{$self->{_dirty_columns}};
+    
+    my $ret = $self->next::method(@_);
+    
+    delete $self->{_column_data}{$_} for @dirty_columns;
+    
+    return $ret;
+}
+
+
 sub get_column {
   my ($self, $col) = @_;
   if ((ref $self) && (!exists $self->{'_column_data'}{$col})
index 69b3549..5fd18f2 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
     next;
   }
        eval "use DBD::SQLite";
-       plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 25);
+       plan $@ ? (skip_all => 'needs DBD::SQLite for testing') : (tests => 27);
 }
 
 INIT {
@@ -79,3 +79,24 @@ eval {    # Multiple false columns
 };
 ok($@, $@);
 
+
+# Test that update() throws out columns that changed
+{
+    my $l = Lazy->create({
+        this => 99,
+        that => 2,
+        oop  => 3,
+        opop => 4,
+    });
+    
+    $l->oop(32);
+    $l->update;
+
+    ok $l->db_Main->do(qq{
+        UPDATE @{[ $l->table ]}
+        SET    oop  = ?
+        WHERE  this = ?
+    }, undef, 23, $l->this);
+
+    is $l->oop, 23;
+}