]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 749540: Avoid database deadlocks when deleting recent searches
authorByron Jones <bjones@mozilla.com>
Wed, 5 Sep 2012 07:08:56 +0000 (15:08 +0800)
committerByron Jones <bjones@mozilla.com>
Wed, 5 Sep 2012 07:08:56 +0000 (15:08 +0800)
r=dkl, a=LpSolit

Bugzilla/Search/Recent.pm

index 00b71a91df2a34d9507f714fe2208d39c347b6a4..f1dd092b26210dd7d59d20f157421e1b47a2ea0f 100644 (file)
@@ -54,12 +54,13 @@ sub create {
     my $user_id = $search->user_id;
 
     # Enforce there only being SAVE_NUM_SEARCHES per user.
-    my $min_id = $dbh->selectrow_array(
-        'SELECT id FROM profile_search WHERE user_id = ? ORDER BY id DESC '
-        . $dbh->sql_limit(1, SAVE_NUM_SEARCHES), undef, $user_id);
-    if ($min_id) {
-        $dbh->do('DELETE FROM profile_search WHERE user_id = ? AND id <= ?',
-                 undef, ($user_id, $min_id));
+    my @ids = @{ $dbh->selectcol_arrayref(
+        "SELECT id FROM profile_search WHERE user_id = ? ORDER BY id",
+        undef, $user_id) };
+    if (scalar(@ids) > SAVE_NUM_SEARCHES) {
+        splice(@ids, - SAVE_NUM_SEARCHES);
+        $dbh->do(
+            "DELETE FROM profile_search WHERE id IN (" . join(',', @ids) . ")");
     }
     $dbh->bz_commit_transaction();
     return $search;