From: lpsolit%gmail.com <> Date: Fri, 8 Jul 2005 04:15:20 +0000 (+0000) Subject: Bug 299212: "already locked" errors should be more informative - Patch by Frédéric... X-Git-Tag: bugzilla-2.20rc1~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=230976efc0233c7157f6b6a3919e5eb885dbe4a7;p=thirdparty%2Fbugzilla.git Bug 299212: "already locked" errors should be more informative - Patch by Frédéric Buclin r=glob a=justdave --- diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index 832034a97b..3472a351d2 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -64,7 +64,7 @@ sub new { # all class local variables stored in DBI derived class needs to have # a prefix 'private_'. See DBI documentation. - $self->{private_bz_tables_locked} = 0; + $self->{private_bz_tables_locked} = ""; bless ($self, $class); @@ -159,13 +159,15 @@ sub sql_group_by { sub bz_lock_tables { my ($self, @tables) = @_; + my $list = join(', ', @tables); # Check first if there was no lock before if ($self->{private_bz_tables_locked}) { - ThrowCodeError("already_locked"); + ThrowCodeError("already_locked", { current => $self->{private_bz_tables_locked}, + new => $list }); } else { - $self->do('LOCK TABLE ' . join(', ', @tables)); + $self->do('LOCK TABLE ' . $list); - $self->{private_bz_tables_locked} = 1; + $self->{private_bz_tables_locked} = $list; } } @@ -180,7 +182,7 @@ sub bz_unlock_tables { } else { $self->do("UNLOCK TABLES"); - $self->{private_bz_tables_locked} = 0; + $self->{private_bz_tables_locked} = ""; } } diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm index a83b75bd92..97473e564f 100644 --- a/Bugzilla/DB/Pg.pm +++ b/Bugzilla/DB/Pg.pm @@ -70,7 +70,7 @@ sub new { # all class local variables stored in DBI derived class needs to have # a prefix 'private_'. See DBI documentation. - $self->{private_bz_tables_locked} = 0; + $self->{private_bz_tables_locked} = ""; bless ($self, $class); @@ -147,9 +147,11 @@ sub sql_string_concat { sub bz_lock_tables { my ($self, @tables) = @_; + my $list = join(', ', @tables); # Check first if there was no lock before if ($self->{private_bz_tables_locked}) { - ThrowCodeError("already_locked"); + ThrowCodeError("already_locked", { current => $self->{private_bz_tables_locked}, + new => $list }); } else { my %read_tables; my %write_tables; @@ -175,7 +177,7 @@ sub bz_lock_tables { ' IN ROW SHARE MODE') if keys %read_tables; Bugzilla->dbh->do('LOCK TABLE ' . join(', ', keys %write_tables) . ' IN ROW EXCLUSIVE MODE') if keys %write_tables; - $self->{private_bz_tables_locked} = 1; + $self->{private_bz_tables_locked} = $list; } } @@ -188,7 +190,7 @@ sub bz_unlock_tables { return if $abort; ThrowCodeError("no_matching_lock"); } else { - $self->{private_bz_tables_locked} = 0; + $self->{private_bz_tables_locked} = ""; # End transaction, tables will be unlocked automatically if ($abort) { $self->bz_rollback_transaction(); diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index d54163bd84..fd3f8fb200 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -258,7 +258,9 @@ Attempted to end transaction without starting one first. [% ELSIF error == "already_locked" %] - Attempted to lock a table without releasing previous lock first. + Attempted to lock a table without releasing previous lock first: +

Tables already locked:
[% current FILTER html %] +

Tables requesting locking:
[% new FILTER html %] [% ELSIF error == "no_matching_lock" %] Attempted to unlock tables without locking them first.