From: lpsolit%gmail.com <> Date: Mon, 14 Nov 2005 01:36:20 +0000 (+0000) Subject: Bug 301062: [PostgreSQL] whine.pl fails when using PostgreSQL 8.0.x - Patch by Frédér... X-Git-Tag: bugzilla-2.20.1~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b9ee6c74f8f5f3382f9fd66cc3da28cd88495ab;p=thirdparty%2Fbugzilla.git Bug 301062: [PostgreSQL] whine.pl fails when using PostgreSQL 8.0.x - Patch by Frédéric Buclin r=mkanat r=manu a=justdave --- diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm index c5f38d17bc..ec189b7eed 100644 --- a/Bugzilla/DB.pm +++ b/Bugzilla/DB.pm @@ -1140,8 +1140,8 @@ formatted SQL command have prefix C. All other methods have prefix C. Description: Outputs proper SQL syntax for a time interval function. Abstract method, should be overriden by database specific code. - Params: $interval = the time interval requested (e.g. '30 minutes') - (scalar) + Params: $interval - the time interval requested (e.g. '30') (integer) + $units - the units the interval is in (e.g. 'MINUTE') (string) Returns: formatted SQL for interval function (scalar) =item C diff --git a/Bugzilla/DB/Mysql.pm b/Bugzilla/DB/Mysql.pm index e76dc4599b..ecdf635178 100644 --- a/Bugzilla/DB/Mysql.pm +++ b/Bugzilla/DB/Mysql.pm @@ -132,9 +132,9 @@ sub sql_date_format { } sub sql_interval { - my ($self, $interval) = @_; + my ($self, $interval, $units) = @_; - return "INTERVAL $interval"; + return "INTERVAL $interval $units"; } sub sql_position { diff --git a/Bugzilla/DB/Pg.pm b/Bugzilla/DB/Pg.pm index 84631e62b7..8fc522490a 100644 --- a/Bugzilla/DB/Pg.pm +++ b/Bugzilla/DB/Pg.pm @@ -130,9 +130,9 @@ sub sql_date_format { } sub sql_interval { - my ($self, $interval) = @_; + my ($self, $interval, $units) = @_; - return "INTERVAL '$interval'"; + return "$interval * INTERVAL '1 $units'"; } sub sql_string_concat { diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 0e9a56b0f5..aa9017fe52 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -960,7 +960,7 @@ sub init { $unitinterval = 'YEAR'; } my $cutoff = "NOW() - " . - $dbh->sql_interval("$quantity $unitinterval"); + $dbh->sql_interval($quantity, $unitinterval); my $assigned_fieldid = &::GetFieldID('assigned_to'); push(@supptables, "LEFT JOIN longdescs AS comment_$table " . "ON comment_$table.who = bugs.assigned_to " . diff --git a/Bugzilla/Token.pm b/Bugzilla/Token.pm index fe72915a36..7404d61e5b 100644 --- a/Bugzilla/Token.pm +++ b/Bugzilla/Token.pm @@ -103,7 +103,7 @@ sub IssuePasswordToken { ON tokens.userid = profiles.userid AND tokens.tokentype = 'password' AND tokens.issuedate > NOW() - " . - $dbh->sql_interval('10 MINUTE') . " + $dbh->sql_interval(10, 'MINUTE') . " WHERE " . $dbh->sql_istrcmp('login_name', $quotedloginname)); my ($userid, $toosoon) = &::FetchSQLData(); diff --git a/contrib/sendunsentbugmail.pl b/contrib/sendunsentbugmail.pl index c82c0ae30c..0bd6a9b17b 100644 --- a/contrib/sendunsentbugmail.pl +++ b/contrib/sendunsentbugmail.pl @@ -33,7 +33,7 @@ my $dbh = Bugzilla->dbh; SendSQL("SELECT bug_id FROM bugs WHERE lastdiffed IS NULL OR lastdiffed < delta_ts AND delta_ts < NOW() - " - . $dbh->sql_interval('30 minute') . + . $dbh->sql_interval(30, 'MINUTE') . " ORDER BY bug_id"); my @list; while (MoreSQLData()) { diff --git a/sanitycheck.cgi b/sanitycheck.cgi index c091e1041d..aaac07bf65 100755 --- a/sanitycheck.cgi +++ b/sanitycheck.cgi @@ -150,7 +150,7 @@ if (defined $cgi->param('cleangroupsnow')) { # If any page starts taking longer than one hour to load, this interval # should be revised. SendSQL("SELECT MAX(last_changed) FROM groups WHERE last_changed < NOW() - " . - $dbh->sql_interval('1 HOUR')); + $dbh->sql_interval(1, 'HOUR')); (my $cutoff) = FetchSQLData(); Status("Cutoff is $cutoff"); SendSQL("SELECT COUNT(*) FROM user_group_map"); @@ -255,7 +255,7 @@ if (defined $cgi->param('rescanallBugMail')) { Status("OK, now attempting to send unsent mail"); SendSQL("SELECT bug_id FROM bugs WHERE (lastdiffed IS NULL OR lastdiffed < delta_ts) AND - delta_ts < now() - " . $dbh->sql_interval('30 minute') . + delta_ts < now() - " . $dbh->sql_interval(30, 'MINUTE') . " ORDER BY bug_id"); my @list; while (MoreSQLData()) { @@ -867,7 +867,7 @@ Status("Checking for unsent mail"); SendSQL("SELECT bug_id " . "FROM bugs WHERE (lastdiffed IS NULL OR lastdiffed < delta_ts) AND " . - "delta_ts < now() - " . $dbh->sql_interval('30 minute') . + "delta_ts < now() - " . $dbh->sql_interval(30, 'MINUTE') . " ORDER BY bug_id"); while (@row = FetchSQLData()) { diff --git a/userprefs.cgi b/userprefs.cgi index 9ae558fa18..8d59a34e31 100755 --- a/userprefs.cgi +++ b/userprefs.cgi @@ -49,7 +49,7 @@ sub DoAccount { $vars->{'realname'} = FetchSQLData(); if(Param('allowemailchange')) { - SendSQL("SELECT tokentype, issuedate + " . $dbh->sql_interval('3 DAY') . + SendSQL("SELECT tokentype, issuedate + " . $dbh->sql_interval(3, 'DAY') . ", eventdata FROM tokens WHERE userid = $userid diff --git a/whine.pl b/whine.pl index fea9d3da36..d8fc8ddd08 100755 --- a/whine.pl +++ b/whine.pl @@ -34,6 +34,7 @@ use Bugzilla::Constants; use Bugzilla::Search; use Bugzilla::User; use Bugzilla::BugMail; +use Bugzilla::Util; # create some handles that we'll need my $template = Bugzilla->template; @@ -170,20 +171,21 @@ 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 = CURRENT_DATE + " . + $dbh->sql_interval('?', '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 - my $nextdate = &get_next_date($day); - $sth = $dbh->prepare( "UPDATE whine_schedules " . - "SET run_next = ? + " . - $dbh->sql_interval('? HOUR') . - " WHERE id = ?"); - $sth->execute($nextdate, $time, $schedule_id); + $day = &get_next_date($day); + $sth = $dbh->prepare("UPDATE whine_schedules " . + "SET run_next = CURRENT_DATE + " . + $dbh->sql_interval('?', 'DAY') . " + " . + $dbh->sql_interval('?', 'HOUR') . + " WHERE id = ?"); + $sth->execute($day, $time, $schedule_id); } } @@ -195,10 +197,11 @@ while (my ($schedule_id, $day, $time) = $sched_h->fetchrow_array) { # midnight my $target_time = ($time =~ /^\d+$/) ? $time : 0; - $sth = $dbh->prepare( "UPDATE whine_schedules " . - "SET run_next = ? + " . - $dbh->sql_interval('? HOUR') . - " WHERE id = ?"); + $sth = $dbh->prepare("UPDATE whine_schedules " . + "SET run_next = CURRENT_DATE + " . + $dbh->sql_interval('?', 'DAY') . " + " . + $dbh->sql_interval('?', 'HOUR') . + " WHERE id = ?"); $sth->execute($target_date, $target_time, $schedule_id); } } @@ -596,23 +599,25 @@ sub reset_timer { my $nextdate = &get_next_date($run_day); - $sth = $dbh->prepare( "UPDATE whine_schedules " . - "SET run_next = ? + " . - $dbh->sql_interval('? HOUR') . - " WHERE id = ?"); + $sth = $dbh->prepare("UPDATE whine_schedules " . + "SET run_next = CURRENT_DATE + " . + $dbh->sql_interval('?', 'DAY') . " + " . + $dbh->sql_interval('?', 'HOUR') . + " WHERE id = ?"); $sth->execute($nextdate, $target_time, $schedule_id); return; } - # Scheduling is done in terms of whole minutes, so we use subtraction to - # drop the seconds from the time. 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); + $next_run = format_time($next_run, "%Y-%m-%d %R"); + $sth = $dbh->prepare("UPDATE whine_schedules " . - "SET run_next = NOW() + " . - $dbh->sql_interval('? MINUTE') . " - " . - $dbh->sql_interval('SECOND(NOW()) SECOND') . - " WHERE id = ?"); - $sth->execute($minute_offset, $schedule_id); + "SET run_next = ? WHERE id = ?"); + $sth->execute($next_run, $schedule_id); } else { # The minute offset is zero or less, which is not supposed to happen. # complain to STDERR @@ -636,7 +641,7 @@ sub null_schedule { # time a schedule should run, excluding today # # It takes a run_day argument (see check_today, above, for an explanation), -# and returns an SQL date +# and returns an integer, representing a number of days. sub get_next_date { my $day = shift; @@ -689,11 +694,5 @@ sub get_next_date { $add_days += $daysinmonth[$now_month]; } } - - # Get a date in whatever format the database will accept - $sth = $dbh->prepare("SELECT CURRENT_DATE() + " . - $dbh->sql_interval('? DAY')); - $sth->execute($add_days); - return $sth->fetch->[0]; + return $add_days; } -