[prev] [thread] [next] [Date index for 2005/05/27]
--==========D85B8A0CA26A14E3A2EE========== Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline --On May 27, 2005 2:51:17 PM -0400 Perrin Harkins <perrin@xxxx.xxx> wrote: > I finally needed this to work, so here's a test that shows the failure > and a patch that fixes it. I think there are a few edge cases that need to be covered. I've attached the patch I posted last year to do this -- it certainly takes up more space, and I think it "rolls back" deflation in a few failure cases that the straightforward patch doesn't cover. I hope it helps. -- Regards, Charles Bailey < bailey _at_ newman _dot_ upenn _dot_ edu > Newman Center at the University of Pennsylvania --==========D85B8A0CA26A14E3A2EE========== Content-Type: text/x-patch; charset=utf-8; name="object_pk.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="object_pk.patch"; size=5662 diff -bBur Class-DBI-0.96/lib/Class/DBI/Relationship/HasA.pm = Class-DBI-0.96_patched/lib/Class/DBI/Relationship/HasA.pm --- Class-DBI-0.96/lib/Class/DBI/Relationship/HasA.pm Sun Apr 25 11:33:36 = 2004 +++ Class-DBI-0.96_patched/lib/Class/DBI/Relationship/HasA.pm Fri Apr 30 = 12:09:16 2004 @@ -24,6 +24,7 @@ return ( select =3D> $self->_inflator, "after_set_$column" =3D> $self->_inflator, + inflate =3D> $self->_inflator, deflate_for_create =3D> $self->_deflator(1), deflate_for_update =3D> $self->_deflator, ); diff -bBur Class-DBI-0.96/lib/Class/DBI.pm = Class-DBI-0.96_patched/lib/Class/DBI.pm --- Class-DBI-0.96/lib/Class/DBI.pm Fri Apr 30 03:22:12 2004 +++ Class-DBI-0.96_patched/lib/Class/DBI.pm Fri Jun 25 18:24:36 2004 @@ -587,7 +587,18 @@ ($class->has_real_column($col) ? $real : $temp)->{$col} =3D $self->_attrs($col); } - $self->_insert_row($real); + eval { $self->_insert_row($real); }; + my $err =3D $@; + # Restore linked objects even if insert failed + $self->call_trigger('inflate'); + if ($err) { + my $class =3D ref $self; + return $self->_croak( + "Can't insert new $class: $err", + err =3D> $err, + method =3D> 'create' + ); + } =20 my @primary_columns =3D $class->primary_columns; $self->_attribute_store( @@ -626,7 +637,6 @@ sub _insert_row { my $self =3D shift; my $data =3D shift; - eval { my @columns =3D keys %$data; my $sth =3D $self->sql_MakeNewObj( join(', ', @columns), @@ -638,15 +648,6 @@ $data->{ $primary_columns[0] } =3D $self->_auto_increment_value if @primary_columns =3D=3D 1 && !defined $data->{ $primary_columns[0] }; - }; - if ($@) { - my $class =3D ref $self; - return $self->_croak( - "Can't insert new $class: $@", - err =3D> $@, - method =3D> 'create' - ); - } return 1; } =20 @@ -776,11 +777,14 @@ $self->call_trigger('before_update'); return 1 unless my @changed_cols =3D $self->is_changed; $self->call_trigger('deflate_for_update'); - my @primary_columns =3D $self->primary_columns; my $sth =3D $self->sql_update($self->_update_line); $class->_bind_param($sth, \@changed_cols); my $rows =3D eval { $sth->execute($self->_update_vals, $self->id); }; - return $self->_croak("Can't update $self: $@", err =3D> $@) if $@; + my $err =3D $@; + # Restore linked objects even if SQL update fails + $self->call_trigger('inflate'); + return $self->_croak("Can't update $self: $err", + err =3D> $err, method =3D> 'update') if $err; =20 # enable this once new fixed DBD::SQLite is released: if (0 and $rows !=3D 1) { # should always only update one row @@ -838,6 +842,7 @@ =20 if (my @fetch_cols =3D grep !$self->_attribute_exists($_), @cols) { $self->_flesh($self->__grouper->groups_for(@fetch_cols)); + $self->call_trigger('select'); } =20 return $self->_attrs(@cols); @@ -851,7 +856,6 @@ my %row; @row{@want} =3D $self->sql_Flesh(join ", ", = @want)->select_row($self->id); $self->_attribute_store(\%row); - $self->call_trigger('select'); } return 1; } diff -bBur Class-DBI-0.96/t/10-mysql.t Class-DBI-0.96_patched/t/10-mysql.t --- Class-DBI-0.96/t/10-mysql.t Sun Apr 25 11:33:36 2004 +++ Class-DBI-0.96_patched/t/10-mysql.t Wed May 19 11:49:10 2004 @@ -9,7 +9,7 @@ eval { require 't/testlib/MyFoo.pm' }; plan skip_all =3D> "Need MySQL for this test" if $@; =20 -plan tests =3D> 64; +plan tests =3D> 68; =20 package main; =20 @@ -51,15 +51,22 @@ ok(my $l2 =3D MyStarLink->create({ film =3D> $f1, star =3D> $s2 }), "Link = 2"); ok(my $l3 =3D MyStarLink->create({ film =3D> $f2, star =3D> $s1 }), "Link = 3"); ok(my $l4 =3D MyStarLink->create({ film =3D> $f2, star =3D> $s3 }), "Link = 4"); +isa_ok($l4->film, 'MyFilm', 'has_a target is an object'); =20 -ok(my $lm1 =3D MyStarLinkMCPK->create({ film =3D> $f1, star =3D> $s1 }), +ok(my $lm1 =3D MyStarLinkMCPK->create({ film =3D> $f1, star =3D> $s1, + role =3D> 'Veronique' }), "Link MCPK 1"); -ok(my $lm2 =3D MyStarLinkMCPK->create({ film =3D> $f1, star =3D> $s2 }), +ok(my $lm2 =3D MyStarLinkMCPK->create({ film =3D> $f1, star =3D> $s2, + role =3D> 'Antek' }), "Link MCPK 2"); -ok(my $lm3 =3D MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s1 }), +ok(my $lm3 =3D MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s1, + role =3D> 'Valentine' }), "Link MCPK 3"); -ok(my $lm4 =3D MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s3 }), +ok(my $lm4 =3D MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s3, + role =3D> 'Karin' }), "Link MCPK 4"); +isa_ok($lm4->film, 'MyFilm', 'has_a target is an object'); +is($lm3->role, 'Valentine', 'select handles PK relationship'); =20 { # Warnings for scalar context? my $err =3D ""; @@ -76,6 +83,7 @@ my $lm5 =3D eval { MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s3 = }) }; ok(!$lm5, "Can't create duplicate"); ok($@ =3D~ /^Can't insert .* duplicate/i, "Duplicate create caused = exception"); +isa_ok($lm4->film, 'MyFilm', 'has_a target is still an object'); =20 # create one to delete ok(my $lm6 =3D MyStarLinkMCPK->create({ film =3D> $f2, star =3D> $s2 }), diff -bBur Class-DBI-0.96/t/testlib/MyStarLinkMCPK.pm = Class-DBI-0.96_patched/t/testlib/MyStarLinkMCPK.pm --- Class-DBI-0.96/t/testlib/MyStarLinkMCPK.pm Sun Apr 25 11:33:36 2004 +++ Class-DBI-0.96_patched/t/testlib/MyStarLinkMCPK.pm Wed May 19 11:47:19 = 2004 @@ -13,7 +13,7 @@ =20 __PACKAGE__->set_table(); __PACKAGE__->columns(Primary =3D> qw/film star/); -__PACKAGE__->columns(All =3D> qw/film star/); +__PACKAGE__->columns(All =3D> qw/film star role/); __PACKAGE__->has_a(film =3D> 'MyFilm'); __PACKAGE__->has_a(star =3D> 'MyStar'); =20 @@ -21,6 +21,7 @@ return qq{ film INTEGER NOT NULL, star INTEGER NOT NULL, + role VARCHAR(255) NOT NULL, PRIMARY KEY (film, star) }; } ## End of patch ## --==========D85B8A0CA26A14E3A2EE==========--
patch for has_a() on primary keys
|
Re: patch for has_a() on primary keys
|
Re: patch for has_a() on primary keys
|
Re: patch for has_a() on primary keys
|
Generated at 20:11 on 05 Jun 2005 by mariachi v0.52