[Dbix-class] Bug in DBIx::Class v0.06999_03

Cory Watson jheephat at gmail.com
Tue Jun 27 22:39:45 CEST 2006


On 6/27/06, Matt S Trout <dbix-class at trout.me.uk> wrote:
> Jonas wrote:
> > Hi,
> >
> > I think the new dbic dev version has a bug.
> > With dbic 0.06003 this peace of code
> >
> > $model->schema->txn_do( sub {
> >             for my $attrs ( map $self->_relationship_attrs($table,
> > $_), $table->relationships ) {
> >                 if ($attrs->{type} eq 'many_to_many') {
> >                     $item->delete_related($attrs->{rel_name}, {
> > $attrs->{foreign_col} => $item->id });
> >                     for my $id ($c->req->param( $attrs->{rel_name} )) {
> >                         next unless $id;
> >                         $item->create_related($attrs->{rel_name}, {
> >                             $attrs->{foreign_col}    => $item->id,
> >                             $attrs->{other_self_col} => $id,
> >                         });
> >                     }
> >                 } elsif ($attrs->{type} eq 'has_many') {
> >                     $item->search_related($attrs->{rel_name}, {
> >                         $attrs->{foreign_col} => $item->id,
> >                         $attrs->{self_col} => { -not_in => [
> > $c->req->param( $attrs->{rel_name} ) ] },
> >                     })->delete;
> >                     $item->search_related($attrs->{rel_name}, {
> >                         $attrs->{self_col} => [ grep $_,
> > $c->req->param( $attrs->{rel_name} ) ]
> >                     })->update({ $attrs->{foreign_col} => $item->id });
> >                 }
> >             }
> >             $item->update;
> > });
> >
> > returns the next sql statments:
> >
> > BEGIN WORK
> > DELETE FROM dvd WHERE ( ( ( id NOT IN ( ? ) AND owner = ? ) ) ) (`5', `1')
> > UPDATE dvd SET owner = ? WHERE ( ( ( ( ( id = ? ) ) ) ) ) (`1', `5')
> > DELETE FROM user_role WHERE ( ( ( user = ? ) ) ) (`1')
> > INSERT INTO user_role (role, user) VALUES (?, ?) (`2', `1')
> > DELETE FROM dvd WHERE ( ( ( current_owner = ? AND id NOT IN ( ? ) ) )
> > ) (`1', `5')
> > UPDATE dvd SET current_owner = ? WHERE ( ( ( ( ( id = ? ) ) ) ) ) (`1', `5')
> > COMMIT
> >
> > But with dbic v0.06999_03 the returned statements are:
> >
> > DELETE FROM dvd WHERE ( ( ( id NOT IN ( ? ) AND owner = ? ) AND (
> > owner = ? ) ) ): '5', '1', '1'
> > UPDATE dvd SET owner = ? WHERE ( ( ( ( ( id = ? ) ) ) AND ( owner = ?
> > ) ) ): '1', '5', '1'
> > DELETE FROM user_role WHERE ( ( ( user = ? ) AND ( user = ? ) ) ): '1', '1'
> > INSERT INTO user_role (role, user) VALUES (?, ?): '2', '1'
> > DELETE FROM dvd WHERE ( ( ( current_owner = ? AND id NOT IN ( ? ) )
> > AND ( current_owner = ? ) ) ): '1', '5', '1'
> > UPDATE dvd SET current_owner = ? WHERE ( ( ( ( ( id = ? ) ) ) AND (
> > current_owner = ? ) ) ): '1', '5', '1'
> >
> > Note the repetition of fields in the where clause and the absence of
> > "BEGIN WORK" and "COMMIT" staments.
> >
> > The dvd table has 2 fields that are FK's of the user table. Maybe that
> > is confusing dbic.
>
> Aha, got it.
>
> the absence of BEGIN WORK / COMMIT is due to a change in the logging; that'll
> be fixed in -current shortly.

ROLLBACK was absent as well.  All are fixed in -current.  My mistake.

-- 
Cory 'G' Watson
http://www.onemogin.com



More information about the Dbix-class mailing list