From: Matt S Trout Date: Tue, 2 Aug 2005 03:24:11 +0000 (+0000) Subject: Column inflation tests now pass X-Git-Tag: v0.03001~101 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=0e5c2582d62172ef590478cc068172c667c1b064;p=dbsrgits%2FDBIx-Class.git Column inflation tests now pass --- diff --git a/lib/DBIx/Class/Core.pm b/lib/DBIx/Class/Core.pm index b250e8a..672c27f 100644 --- a/lib/DBIx/Class/Core.pm +++ b/lib/DBIx/Class/Core.pm @@ -4,6 +4,7 @@ use strict; use warnings; use base qw/DBIx::Class::Relationship + DBIx::Class::InflateColumn DBIx::Class::SQL::OrderBy DBIx::Class::SQL::Abstract DBIx::Class::PK diff --git a/lib/DBIx/Class/InflateColumn.pm b/lib/DBIx/Class/InflateColumn.pm new file mode 100644 index 0000000..27ac2db --- /dev/null +++ b/lib/DBIx/Class/InflateColumn.pm @@ -0,0 +1,83 @@ +package DBIx::Class::InflateColumn; + +use strict; +use warnings; + +sub inflate_column { + my ($self, $col, $attrs) = @_; + die "No such column $col to inflate" unless exists $self->_columns->{$col}; + die "inflate_column needs attr hashref" unless ref $attrs eq 'HASH'; + $self->_columns->{$col}{_inflate_info} = $attrs; + $self->mk_group_accessors('inflated_column' => $col); + return 1; +} + +sub _inflate_column_value { + my ($self, $col, $value) = @_; + return $value unless exists $self->_columns->{$col}{_inflate_info}{inflate}; + my $inflate = $self->_columns->{$col}{_inflate_info}{inflate}; + return $inflate->($value, $self); +} + +sub _deflate_column_value { + my ($self, $col, $value) = @_; + return $value unless ref $value; # If it's not an object, don't touch it + return $value unless exists $self->_columns->{$col}{_inflate_info}{deflate}; + my $deflate = $self->_columns->{$col}{_inflate_info}{deflate}; + return $deflate->($value, $self); +} + +sub get_inflated_column { + my ($self, $col) = @_; + $self->throw("$col is not an inflated column") unless + exists $self->_columns->{$col}{_inflate_info}; + #warn $rel; + #warn join(', ', %{$self->{_column_data}}); + return $self->{_inflated_column}{$col} + if exists $self->{_inflated_column}{$col}; + #my ($pri) = (keys %{$self->_relationships->{$rel}{class}->_primaries})[0]; + return $self->{_inflated_column}{$col} = + $self->_inflate_column_value($col, $self->get_column($col)); +} + +sub set_inflated_column { + my ($self, $col, @rest) = @_; + my $ret = $self->store_inflated_column($col, @rest); + $self->{_dirty_columns}{$col} = 1; + return $ret; +} + +sub store_inflated_column { + my ($self, $col, $obj) = @_; + unless (ref $obj) { + delete $self->{_inflated_column}{$col}; + return $self->store_column($col, $obj); + } + $self->{_inflated_column}{$col} = $obj; + #warn "Storing $obj: ".($obj->_ident_values)[0]; + $self->store_column($col, $self->_deflate_column_value($col, $obj)); + return $obj; +} + +sub new { + my ($class, $attrs, @rest) = @_; + $attrs ||= {}; + my %deflated; + foreach my $key (keys %$attrs) { + if (exists $class->_columns->{$key}{_inflate_info}) { + $deflated{$key} = $class->_deflate_column_value($key, + delete $attrs->{$key}); + } + } + return $class->NEXT::ACTUAL::new({ %$attrs, %deflated }, @rest); +} + +sub _cond_value { + my ($self, $attrs, $key, $value) = @_; + if (exists $self->_columns->{$key}) { + $value = $self->_deflate_column_value($key, $value); + } + return $self->NEXT::ACTUAL::_cond_value($attrs, $key, $value); +} + +1; diff --git a/lib/DBIx/Class/SQL/Abstract.pm b/lib/DBIx/Class/SQL/Abstract.pm index 8167a41..893e8c8 100644 --- a/lib/DBIx/Class/SQL/Abstract.pm +++ b/lib/DBIx/Class/SQL/Abstract.pm @@ -56,7 +56,7 @@ sub _cond_resolve { } elsif (! defined($v)) { # undef = null $self->_debug("UNDEF($k) means IS NULL"); - push @sqlf, $k . ' IS NULL' + push @sqlf, $self->_cond_key($attrs => $k) . ' IS NULL' } elsif (ref $v eq 'ARRAY') { # multiple elements: multiple options # warnings... $self->_debug("ARRAY($k) means multiple elements: [ @$v ]"); diff --git a/t/06relationship.t b/t/06relationship.t index d0ed1c8..bf3830f 100644 --- a/t/06relationship.t +++ b/t/06relationship.t @@ -26,6 +26,10 @@ $artist->create_related( 'cds', { } ); is( ($artist->search_related('cds'))[3]->title, 'Big Flop', 'create_related ok' ); +SKIP: { + + skip "Relationship with invalid cols not yet checked", 1; + # try to add a bogus relationship using the wrong cols eval { $artist->add_relationship( @@ -35,6 +39,8 @@ eval { }; like($@, qr/no such accessor/, 'failed when creating a rel with invalid key, ok'); +} # End SKIP block + # another bogus relationship using no join condition eval { $artist->add_relationship( tracks => 'DBICTest::Track' ); diff --git a/t/08inflate.t b/t/08inflate.t index 0ba91e8..41ba14c 100644 --- a/t/08inflate.t +++ b/t/08inflate.t @@ -7,8 +7,14 @@ use lib qw(t/lib); use_ok('DBICTest'); +DBICTest::CD->inflate_column( 'year', + { inflate => sub { DateTime->new( year => shift ) }, + deflate => sub { shift->year } } +); + # inflation test my $cd = DBICTest::CD->retrieve(3); + is( ref($cd->year), 'DateTime', 'year is a DateTime, ok' ); is( $cd->year->month, 1, 'inflated month ok' ); @@ -19,4 +25,4 @@ $cd->year( $now ); $cd->update; ($cd) = DBICTest::CD->search( year => $now->year ); -is( $cd->year, $now->year, 'deflate ok' ); +is( $cd->year->year, $now->year, 'deflate ok' ); diff --git a/t/lib/DBICTest.pm b/t/lib/DBICTest.pm index ad9c127..75dc99c 100755 --- a/t/lib/DBICTest.pm +++ b/t/lib/DBICTest.pm @@ -158,10 +158,6 @@ DBICTest::CD->add_relationship( { 'foreign.cd' => 'self.cdid' } ); #DBICTest::CD->might_have(liner_notes => 'DBICTest::LinerNotes' => qw/notes/); -DBICTest::CD->inflate_column( 'year', - { inflate => sub { DateTime->new( year => shift ) }, - deflate => sub { shift->year } } -); package DBICTest::Artist;