diff options
Diffstat (limited to 'Bugzilla')
-rw-r--r-- | Bugzilla/Constants.pm | 6 | ||||
-rw-r--r-- | Bugzilla/DB.pm | 4 | ||||
-rw-r--r-- | Bugzilla/Error.pm | 3 | ||||
-rw-r--r-- | Bugzilla/Series.pm | 4 | ||||
-rw-r--r-- | Bugzilla/Token.pm | 22 | ||||
-rw-r--r-- | Bugzilla/User.pm | 9 |
6 files changed, 30 insertions, 18 deletions
diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm index 3ef3cc634..a3e16251c 100644 --- a/Bugzilla/Constants.pm +++ b/Bugzilla/Constants.pm @@ -66,6 +66,8 @@ use base qw(Exporter); DEFAULT_QUERY_NAME COMMENT_COLS + + UNLOCK_ABORT ); @Bugzilla::Constants::EXPORT_OK = qw(contenttypes); @@ -217,4 +219,8 @@ use constant DEFAULT_QUERY_NAME => '(Default query)'; # The column length for displayed (and wrapped) bug comments. use constant COMMENT_COLS => 80; +# used by Bugzilla::DB to indicate that tables are being unlocked +# because of error +use constant UNLOCK_ABORT => 1; + 1; diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index 3e3f45c66..d1ecfcb2e 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -501,8 +501,8 @@ formatted SQL command have prefix C<sql_>. All other methods have prefix C<bz_>. set even without locking tables first without raising an error to simplify error handling. Abstract method, should be overriden by database specific code. - Params: $abort = true (1) if the operation on locked tables failed - (if transactions are supported, the action will be rolled + Params: $abort = UNLOCK_ABORT (true, 1) if the operation on locked tables + failed (if transactions are supported, the action will be rolled back). False (0) or no param if the operation succeeded. Returns: none diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm index 96017f368..e86b1c41a 100644 --- a/Bugzilla/Error.pm +++ b/Bugzilla/Error.pm @@ -27,6 +27,7 @@ use base qw(Exporter); @Bugzilla::Error::EXPORT = qw(ThrowCodeError ThrowTemplateError ThrowUserError); use Bugzilla::Config; +use Bugzilla::Constants; use Bugzilla::Util; use Date::Format; @@ -37,7 +38,7 @@ sub _throw_error { $vars->{error} = $error; - Bugzilla->dbh->do("UNLOCK TABLES") if $unlock_tables; + Bugzilla->dbh->bz_unlock_tables(UNLOCK_ABORT) if $unlock_tables; # If a writable data/errorlog exists, log error details there. if (-w "data/errorlog") { diff --git a/Bugzilla/Series.pm b/Bugzilla/Series.pm index a4bd6654f..53e6fbabf 100644 --- a/Bugzilla/Series.pm +++ b/Bugzilla/Series.pm @@ -170,7 +170,7 @@ sub writeToDatabase { my $self = shift; my $dbh = Bugzilla->dbh; - $dbh->do("LOCK TABLES series_categories WRITE, series WRITE"); + $dbh->bz_lock_tables('series_categories WRITE', 'series WRITE'); my $category_id = getCategoryID($self->{'category'}); my $subcategory_id = getCategoryID($self->{'subcategory'}); @@ -210,7 +210,7 @@ sub writeToDatabase { || &::ThrowCodeError("missing_series_id", { 'series' => $self }); } - $dbh->do("UNLOCK TABLES"); + $dbh->bz_unlock_tables(); } # Check whether a series with this name, category and subcategory exists in diff --git a/Bugzilla/Token.pm b/Bugzilla/Token.pm index 90efe99bd..9caf91ab2 100644 --- a/Bugzilla/Token.pm +++ b/Bugzilla/Token.pm @@ -52,13 +52,14 @@ my $maxtokenage = 3; sub IssueEmailChangeToken { my ($userid, $old_email, $new_email) = @_; + my $dbh = Bugzilla->dbh; my $token_ts = time(); my $issuedate = time2str("%Y-%m-%d %H:%M", $token_ts); # Generate a unique token and insert it into the tokens table. # We have to lock the tokens table before generating the token, # since the database must be queried for token uniqueness. - &::SendSQL("LOCK TABLES tokens WRITE"); + $dbh->bz_lock_tables('tokens WRITE'); my $token = GenerateUniqueToken(); my $quotedtoken = &::SqlQuote($token); my $quoted_emails = &::SqlQuote($old_email . ":" . $new_email); @@ -72,7 +73,7 @@ sub IssueEmailChangeToken { tokentype , eventdata ) VALUES ( $userid , '$issuedate' , $quotedtoken , 'emailnew' , $quoted_emails )"); - &::SendSQL("UNLOCK TABLES"); + $dbh->bz_unlock_tables(); # Mail the user the token along with instructions for using it. @@ -110,6 +111,8 @@ sub IssuePasswordToken { my ($loginname) = @_; + my $dbh = Bugzilla->dbh; + # Retrieve the user's ID from the database. my $quotedloginname = &::SqlQuote($loginname); &::SendSQL("SELECT profiles.userid, tokens.issuedate FROM profiles @@ -129,13 +132,13 @@ sub IssuePasswordToken { # Generate a unique token and insert it into the tokens table. # We have to lock the tokens table before generating the token, # since the database must be queried for token uniqueness. - &::SendSQL("LOCK TABLES tokens WRITE"); + $dbh->bz_lock_tables('tokens WRITE'); my $token = GenerateUniqueToken(); my $quotedtoken = &::SqlQuote($token); my $quotedipaddr = &::SqlQuote($::ENV{'REMOTE_ADDR'}); &::SendSQL("INSERT INTO tokens ( userid , issuedate , token , tokentype , eventdata ) VALUES ( $userid , NOW() , $quotedtoken , 'password' , $quotedipaddr )"); - &::SendSQL("UNLOCK TABLES"); + $dbh->bz_unlock_tables(); # Mail the user the token along with instructions for using it. @@ -158,10 +161,11 @@ sub IssuePasswordToken { sub CleanTokenTable { - &::SendSQL("LOCK TABLES tokens WRITE"); + my $dbh = Bugzilla->dbh; + $dbh->bz_lock_tables('tokens WRITE'); &::SendSQL("DELETE FROM tokens WHERE TO_DAYS(NOW()) - TO_DAYS(issuedate) >= " . $maxtokenage); - &::SendSQL("UNLOCK TABLES"); + $dbh->bz_unlock_tables(); } @@ -198,6 +202,8 @@ sub Cancel { my ($token, $cancelaction) = @_; + my $dbh = Bugzilla->dbh; + # Quote the token for inclusion in SQL statements. my $quotedtoken = &::SqlQuote($token); @@ -232,9 +238,9 @@ sub Cancel { Bugzilla::BugMail::MessageToMTA($message); # Delete the token from the database. - &::SendSQL("LOCK TABLES tokens WRITE"); + $dbh->bz_lock_tables('tokens WRITE'); &::SendSQL("DELETE FROM tokens WHERE token = $quotedtoken"); - &::SendSQL("UNLOCK TABLES"); + $dbh->bz_unlock_tables(); } sub DeletePasswordTokens { diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm index 8f5f6a762..67b79f168 100644 --- a/Bugzilla/User.pm +++ b/Bugzilla/User.pm @@ -384,10 +384,9 @@ sub derive_groups { my $sth; - $dbh->do(q{LOCK TABLES profiles WRITE, - user_group_map WRITE, - group_group_map READ, - groups READ}) unless $already_locked; + $dbh->bz_lock_tables('profiles WRITE', 'user_group_map WRITE', + 'group_group_map READ', + 'groups READ') unless $already_locked; # avoid races, we are only up to date as of the BEGINNING of this process my $time = $dbh->selectrow_array("SELECT NOW()"); @@ -459,7 +458,7 @@ sub derive_groups { undef, $time, $id); - $dbh->do("UNLOCK TABLES") unless $already_locked; + $dbh->bz_unlock_tables() unless $already_locked; } sub can_bless { |