[Dbix-class] FilterColumn deleting entries when set twice
Matthew Somerville
matthew at mysociety.org
Thu Jun 11 23:11:36 GMT 2015
Hi,
The code I quote below gives the following output, with DBIx::Class 0.082820:
Extra is: 123
Local object extra is: 456
Refetched extra is: 456
Local object extra is: 101112
Use of uninitialized value $n in multiplication (*) at test.pl line 16.
Refetched extra is: 0
ie. if you set a filtered column more than once before saving it, the
data is lost when saved. I'm not entirely sure, but this appears to be
due to the change made in
https://github.com/dbsrgits/dbix-class/commit/dc6dadae6 where
set_filtered_column deletes the data if the column is already marked
as changed.
The problem does not occur with DBIx::Class 0.08209, which I had
installed elsewhere; sorry I haven't had time to install the version
just prior to that commit to check. Hope that's helpful.
ATB,
Matthew
-----------------------------
package DB::Problem;
use strict;
use warnings;
use DBIx::Class::FilterColumn;
use base 'DBIx::Class::Core';
__PACKAGE__->load_components("FilterColumn");
__PACKAGE__->table("problem");
__PACKAGE__->add_columns(
"id", { data_type => "integer" },
"extra", { data_type => "text", is_nullable => 1 },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->filter_column(
'extra' => {
filter_from_storage => sub { my ($self, $n) = @_; return $n * 2; },
filter_to_storage => sub { my ($self, $n) = @_; return $n / 2; },
}
);
package DB;
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_classes(qw(Problem));
package main;
use Data::Dumper;
my $schema = DB->connect('dbi:SQLite:test.db');
# Create an object
$schema->resultset('Problem')->delete_all;
$schema->resultset('Problem')->create({extra => 123});
my $p = $schema->resultset('Problem')->single;
print "Extra is: ", $p->extra, "\n";
# Update it once
$p->extra(456);
print "Local object extra is: ", $p->extra, "\n";
$p->update;
$p = $schema->resultset('Problem')->single;
print "Refetched extra is: ", $p->extra, "\n";
# Update it twice
$p->extra(789);
$p->extra(101112);
print "Local object extra is: ", $p->extra, "\n";
$p->update;
$p = $schema->resultset('Problem')->single;
print "Refetched extra is: ", $p->extra, "\n";
More information about the DBIx-Class
mailing list