[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