]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 602165: Change sql_interval to sql_date_math, in preparation for
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 7 Oct 2010 10:58:28 +0000 (03:58 -0700)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 7 Oct 2010 10:58:28 +0000 (03:58 -0700)
MS-SQL and SQLite support.

12 files changed:
Bugzilla/Auth/Persist/Cookie.pm
Bugzilla/DB.pm
Bugzilla/DB/Mysql.pm
Bugzilla/DB/Oracle.pm
Bugzilla/DB/Pg.pm
Bugzilla/Token.pm
Bugzilla/User.pm
contrib/sendunsentbugmail.pl
duplicates.cgi
sanitycheck.cgi
userprefs.cgi
whine.pl

index 232212075878870da8b01c1cfe7e9f8a83916de8..57fa9624e6ce016c16908593d0a9dc870a9ecd71 100644 (file)
@@ -69,8 +69,9 @@ sub persist_login {
 
     # Issuing a new cookie is a good time to clean up the old
     # cookies.
-    $dbh->do("DELETE FROM logincookies WHERE lastused < LOCALTIMESTAMP(0) - "
-             . $dbh->sql_interval(MAX_LOGINCOOKIE_AGE, 'DAY'));
+    $dbh->do("DELETE FROM logincookies WHERE lastused < "
+             . $dbh->sql_date_math('LOCALTIMESTAMP(0)', '-',
+                                   MAX_LOGINCOOKIE_AGE, 'DAY'));
 
     $dbh->bz_commit_transaction();
 
index 6f1d3e6de7768b817df5824e3d5f0abb358bc0fe..27644fba57621b94271327bd3ee3d5ccafc26d7e 100644 (file)
@@ -307,7 +307,7 @@ EOT
 
 # List of abstract methods we are checking the derived class implements
 our @_abstract_methods = qw(new sql_regexp sql_not_regexp sql_limit sql_to_days
-                            sql_date_format sql_interval bz_explain
+                            sql_date_format sql_date_math bz_explain
                             sql_group_concat);
 
 # This overridden import method will check implementation of inherited classes
@@ -1904,13 +1904,13 @@ Formatted SQL for date formatting (scalar)
 
 =back
 
-=item C<sql_interval>
+=item C<sql_date_math>
 
 =over
 
 =item B<Description>
 
-Outputs proper SQL syntax for a time interval function.
+Outputs proper SQL syntax for adding some amount of time to a date.
 
 Abstract method, should be overridden by database specific code.
 
@@ -1918,15 +1918,28 @@ Abstract method, should be overridden by database specific code.
 
 =over
 
-=item C<$interval> - the time interval requested (e.g. '30') (integer)
+=item C<$date>
 
-=item C<$units> - the units the interval is in (e.g. 'MINUTE') (string)
+C<string> The date being added to or subtracted from.
+
+=item C<$operator>
+
+C<string> Either C<-> or C<+>, depending on whether you're subtracting
+or adding.
+
+=item C<$interval>
+
+C<integer> The time interval you're adding or subtracting (e.g. C<30>)
+
+=item C<$units> 
+
+C<string> the units the interval is in (e.g. 'MINUTE')
 
 =back
 
 =item B<Returns>
 
-Formatted SQL for interval function (scalar)
+Formatted SQL for adding or subtracting a date and some amount of time (scalar)
 
 =back
 
index 1829bc450dbd2660b9409e6a249410c9fda12b71..7b7e4e9b94e191844f1e6135eafae9fcffd410f8 100644 (file)
@@ -226,10 +226,10 @@ sub sql_date_format {
     return "DATE_FORMAT($date, " . $self->quote($format) . ")";
 }
 
-sub sql_interval {
-    my ($self, $interval, $units) = @_;
+sub sql_date_math {
+    my ($self, $date, $operator, $interval, $units) = @_;
     
-    return "INTERVAL $interval $units";
+    return "$date $operator INTERVAL $interval $units";
 }
 
 sub sql_iposition {
index a7ac6e93e0a7378f335db3e8cc647dce9bc65ba3..9fdacf24c0164b9a03d00ca63b412f60a3734767 100644 (file)
@@ -197,13 +197,15 @@ sub sql_date_format {
     return "TO_CHAR($date, " . $self->quote($format) . ")";
 }
 
-sub sql_interval {
-    my ($self, $interval, $units) = @_;
+sub sql_date_math {
+    my ($self, $date, $operator, $interval, $units) = @_;
+    my $time_sql;
     if ($units =~ /YEAR|MONTH/i) {
-        return "NUMTOYMINTERVAL($interval,'$units')";
+        $time_sql = "NUMTOYMINTERVAL($interval,'$units')";
     } else{
-        return "NUMTODSINTERVAL($interval,'$units')";
+        $time_sql = "NUMTODSINTERVAL($interval,'$units')";
     }
+   return "$date $operator $time_sql";
 }
 
 sub sql_position {
index 0373fb1ce0501afbb52d07d3f5b79f763614a7b8..c1c656a69c2cee30074c1a7c162eaa8c9a03664a 100644 (file)
@@ -177,10 +177,10 @@ sub sql_date_format {
     return "TO_CHAR($date, " . $self->quote($format) . ")";
 }
 
-sub sql_interval {
-    my ($self, $interval, $units) = @_;
+sub sql_date_math {
+    my ($self, $date, $operator, $interval, $units) = @_;
     
-    return "$interval * INTERVAL '1 $units'";
+    return "$date $operator $interval * INTERVAL '1 $units'";
 }
 
 sub sql_string_concat {
index 06e95bb501e89da319995d79574ae8125ccc511d..e15991f370d489ac06a88a9b4e4798c2c897ad11 100644 (file)
@@ -63,13 +63,14 @@ sub issue_new_user_account_token {
     # But to prevent using this way to mailbomb an email address, make sure
     # the last request is at least 10 minutes old before sending a new email.
 
-    my $pending_requests =
-        $dbh->selectrow_array('SELECT COUNT(*)
-                                 FROM tokens
-                                WHERE tokentype = ?
-                                  AND ' . $dbh->sql_istrcmp('eventdata', '?') . '
-                                  AND issuedate > NOW() - ' . $dbh->sql_interval(10, 'MINUTE'),
-                               undef, ('account', $login_name));
+    my $pending_requests = $dbh->selectrow_array(
+        'SELECT COUNT(*)
+           FROM tokens
+          WHERE tokentype = ?
+                AND ' . $dbh->sql_istrcmp('eventdata', '?') . '
+                AND issuedate > '
+                    . $dbh->sql_date_math('NOW()', '-', 10, 'MINUTE'),
+        undef, ('account', $login_name));
 
     ThrowUserError('too_soon_for_new_token', {'type' => 'account'}) if $pending_requests;
 
@@ -131,13 +132,12 @@ sub IssuePasswordToken {
     my $user = shift;
     my $dbh = Bugzilla->dbh;
 
-    my $too_soon =
-        $dbh->selectrow_array('SELECT 1 FROM tokens
-                                WHERE userid = ?
-                                  AND tokentype = ?
-                                  AND issuedate > NOW() - ' .
-                                      $dbh->sql_interval(10, 'MINUTE'),
-                                undef, ($user->id, 'password'));
+    my $too_soon = $dbh->selectrow_array(
+        'SELECT 1 FROM tokens
+          WHERE userid = ? AND tokentype = ?
+                AND issuedate > ' 
+                    . $dbh->sql_date_math('NOW()', '-', 10, 'MINUTE'),
+        undef, ($user->id, 'password'));
 
     ThrowUserError('too_soon_for_new_token', {'type' => 'password'}) if $too_soon;
 
index 595964bf9dba8c1ab4e7c9d67f7c24c0c7bfe693..8f056dca68c90510f4bebd42a3ef7796f05ecb28 100644 (file)
@@ -1791,12 +1791,13 @@ sub clear_login_failures {
 sub account_ip_login_failures {
     my $self = shift;
     my $dbh = Bugzilla->dbh;
-    my $time = $dbh->sql_interval(LOGIN_LOCKOUT_INTERVAL, 'MINUTE');
+    my $time = $dbh->sql_date_math('LOCALTIMESTAMP(0)', '-', 
+                                   LOGIN_LOCKOUT_INTERVAL, 'MINUTE');
     my $ip_addr = remote_ip();
     trick_taint($ip_addr);
     $self->{account_ip_login_failures} ||= Bugzilla->dbh->selectall_arrayref(
         "SELECT login_time, ip_addr, user_id FROM login_failure
-          WHERE user_id = ? AND login_time > LOCALTIMESTAMP(0) - $time
+          WHERE user_id = ? AND login_time > $time
                 AND ip_addr = ?
        ORDER BY login_time", {Slice => {}}, $self->id, $ip_addr);
     return $self->{account_ip_login_failures};
index ec92a97a06d1e7546f05919e15ce97e9e12f877d..6ddbd2e4c0a7afb187c813520d88c84afbcf8fe9 100755 (executable)
@@ -35,7 +35,8 @@ my $list = $dbh->selectcol_arrayref(
         'SELECT bug_id FROM bugs 
           WHERE lastdiffed IS NULL
              OR lastdiffed < delta_ts 
-            AND delta_ts < NOW() - ' . $dbh->sql_interval(30, 'MINUTE') .
+            AND delta_ts < ' 
+                . $dbh->sql_date_math('NOW()', '-', 30, 'MINUTE') .
      ' ORDER BY bug_id');
 
 if (scalar(@$list) > 0) {
index 2a52742c64ffe621854a76b963454f46529d6ae1..798599ed0d825e74e75b1cdd462b46b3b15d7da0 100755 (executable)
@@ -181,8 +181,8 @@ my %since_dups = @{$dbh->selectcol_arrayref(
        FROM duplicates INNER JOIN bugs_activity 
                        ON bugs_activity.bug_id = duplicates.dupe 
       WHERE added = 'DUPLICATE' AND fieldid = ? 
-            AND bug_when >= LOCALTIMESTAMP(0) - "
-                . $dbh->sql_interval('?', 'DAY') .
+            AND bug_when >= "
+                . $dbh->sql_date_math('LOCALTIMESTAMP(0)', '-', '?', 'DAY') .
  " GROUP BY dupe_of", {Columns=>[1,2]},
     $reso_field_id, $changedsince)};
 add_indirect_dups(\%since_dups, \%dupe_relation);
index 63872bd499789677cd65ab5cf7ec5d39b139c562..a4f9832b0b0acf05951da1472508dca1ffef2070 100755 (executable)
@@ -229,14 +229,14 @@ if ($cgi->param('rescanallBugMail')) {
     require Bugzilla::BugMail;
 
     Status('send_bugmail_start');
-    my $time = $dbh->sql_interval(30, 'MINUTE');
+    my $time = $dbh->sql_date_math('NOW()', '-', 30, 'MINUTE');
 
     my $list = $dbh->selectcol_arrayref(qq{
                                         SELECT bug_id
                                           FROM bugs 
                                          WHERE (lastdiffed IS NULL
                                                 OR lastdiffed < delta_ts)
-                                           AND delta_ts < now() - $time
+                                           AND delta_ts < $time
                                       ORDER BY bug_id});
 
     Status('send_bugmail_status', {bug_count => scalar(@$list)});
@@ -857,12 +857,12 @@ BugCheck("bugs
 
 Status('unsent_bugmail_check');
 
-my $time = $dbh->sql_interval(30, 'MINUTE');
+my $time = $dbh->sql_date_math('NOW()', '-', 30, 'MINUTE');
 my $badbugs = $dbh->selectcol_arrayref(qq{
                     SELECT bug_id 
                       FROM bugs 
                      WHERE (lastdiffed IS NULL OR lastdiffed < delta_ts)
-                       AND delta_ts < now() - $time
+                       AND delta_ts < $time
                   ORDER BY bug_id});
 
 
index d15bcd13a8a05f6b030fcb529d39882a804efe13..68c7d27489ccf9d240f24a26f58674c0f205f325 100755 (executable)
@@ -57,8 +57,9 @@ sub DoAccount {
        Bugzilla::Token::CleanTokenTable();
 
         my @token = $dbh->selectrow_array(
-            "SELECT tokentype, issuedate + " .
-                    $dbh->sql_interval(MAX_TOKEN_AGE, 'DAY') . ", eventdata
+            "SELECT tokentype, " .
+                    $dbh->sql_date_math('issuedate', '+', MAX_TOKEN_AGE, 'DAY')
+                    . ", eventdata
                FROM tokens
               WHERE userid = ?
                 AND tokentype LIKE 'email%'
index 3932f854c0a912584b7ca2d5aa2de510343f7421..872061fb65a21620cf2e863cfb048538d6c4de0e 100755 (executable)
--- a/whine.pl
+++ b/whine.pl
@@ -150,20 +150,22 @@ while (my ($schedule_id, $day, $time) = $sched_h->fetchrow_array) {
         # A time greater than now means it still has to run today
         elsif ($time >= $now_hour) {
             # set it to today + number of hours
-            $sth = $dbh->prepare("UPDATE whine_schedules " .
-                                 "SET run_next = CURRENT_DATE + " .
-                                 $dbh->sql_interval('?', 'HOUR') .
-                                 " WHERE id = ?");
+            $sth = $dbh->prepare(
+                "UPDATE whine_schedules " .
+                   "SET run_next = " .
+                        $dbh->sql_date_math('CURRENT_DATE', '+', '?', 'HOUR') .
+                " WHERE id = ?");
             $sth->execute($time, $schedule_id);
         }
         # the target time is less than the current time
         else { # set it for the next applicable day
             $day = &get_next_date($day);
+            my $run_next = $dbh->sql_date_math('(' 
+                . $dbh->sql_date_math('CURRENT_DATE', '+', '?', 'DAY')
+                . ')', '+', '?', 'HOUR');
             $sth = $dbh->prepare("UPDATE whine_schedules " .
-                                 "SET run_next = (CURRENT_DATE + " .
-                                 $dbh->sql_interval('?', 'DAY') . ") + " .
-                                 $dbh->sql_interval('?', 'HOUR') .
-                                 " WHERE id = ?");
+                                    "SET run_next = $run_next
+                                   WHERE id = ?");
             $sth->execute($day, $time, $schedule_id);
         }
 
@@ -176,11 +178,12 @@ while (my ($schedule_id, $day, $time) = $sched_h->fetchrow_array) {
         # midnight
         my $target_time = ($time =~ /^\d+$/) ? $time : 0;
 
+       my $run_next = $dbh->sql_date_math('(' 
+            . $dbh->sql_date_math('CURRENT_DATE', '+', '?', 'DAY') 
+            . ')', '+', '?', 'HOUR');
         $sth = $dbh->prepare("UPDATE whine_schedules " .
-                             "SET run_next = (CURRENT_DATE + " .
-                             $dbh->sql_interval('?', 'DAY') . ") + " .
-                             $dbh->sql_interval('?', 'HOUR') .
-                             " WHERE id = ?");
+                                "SET run_next = $run_next
+                               WHERE id = ?");
         $sth->execute($target_date, $target_time, $schedule_id);
     }
 }
@@ -584,21 +587,22 @@ sub reset_timer {
         my $target_time = ($run_time =~ /^\d+$/) ? $run_time : 0;
 
         my $nextdate = &get_next_date($run_day);
-
+        my $run_next = $dbh->sql_date_math('('
+            . $dbh->sql_date_math('CURRENT_DATE', '+', '?', 'DAY')
+            . ')', '+', '?', 'HOUR');
         $sth = $dbh->prepare("UPDATE whine_schedules " .
-                             "SET run_next = (CURRENT_DATE + " .
-                             $dbh->sql_interval('?', 'DAY') . ") + " .
-                             $dbh->sql_interval('?', 'HOUR') .
-                             " WHERE id = ?");
+                                "SET run_next = $run_next
+                               WHERE id = ?");
         $sth->execute($nextdate, $target_time, $schedule_id);
         return;
     }
 
     if ($minute_offset > 0) {
         # Scheduling is done in terms of whole minutes.
-        my $next_run = $dbh->selectrow_array('SELECT NOW() + ' .
-                                             $dbh->sql_interval('?', 'MINUTE'),
-                                             undef, $minute_offset);
+        
+        my $next_run = $dbh->selectrow_array(
+            'SELECT ' . $dbh->sql_date_math('NOW()', '+', '?', 'MINUTE'),
+            undef, $minute_offset);
         $next_run = format_time($next_run, "%Y-%m-%d %R");
 
         $sth = $dbh->prepare("UPDATE whine_schedules " .