From 4f63e3be7dc12383d4e66bdd4db25dd6fea9abba Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Nov 2010 17:25:29 -0700 Subject: [PATCH] Fix for ticket #2804: bad non-cache fallback code for dupe checks of prolific posters The old code attempted to compare the value of the notice.created field against now() directly, which tends to explode in our current systems. now() comes up as the server/connection local timezone generally, while the created field is currently set as hardcoded UTC from the web servers. This would lead to breakage when we got a difference in seconds that's several hours off in either direction (depending on the local timezone). New code calculates a threshold by subtracting the number of seconds from the current UNIX timestamp and passing that in in correct format for a simple comparison. As a bonus, this should also be more efficient, as it should be able to follow the index on profile_id and created. --- classes/Notice.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index 60989f9bac..792d6e1316 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -524,10 +524,8 @@ class Notice extends Memcached_DataObject $notice = new Notice(); $notice->profile_id = $profile_id; $notice->content = $content; - if (common_config('db','type') == 'pgsql') - $notice->whereAdd('extract(epoch from now() - created) < ' . common_config('site', 'dupelimit')); - else - $notice->whereAdd('now() - created < ' . common_config('site', 'dupelimit')); + $threshold = common_sql_date(time() - common_config('site', 'dupelimit')); + $notice->whereAdd(sprintf("created > '%s'", $notice->escape($threshold))); $cnt = $notice->count(); return ($cnt == 0);