From 6cb276056b6712450b25800b499d5ff4f01e5cd3 Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Wed, 24 Nov 2010 15:40:25 +0000 Subject: [PATCH] Moved switches in Special:Unusedimages and Special:Ancientpages to extract a unix timestamp from a fielf to DatabaseBase and related classes to avoid code duplication --- includes/db/Database.php | 10 ++++++++++ includes/db/DatabaseMssql.php | 4 ++++ includes/db/DatabaseMysql.php | 3 +++ includes/db/DatabaseOracle.php | 4 ++++ includes/db/DatabaseSqlite.php | 4 ++++ includes/specials/SpecialAncientpages.php | 23 +---------------------- includes/specials/SpecialUnusedimages.php | 20 +++----------------- 7 files changed, 29 insertions(+), 39 deletions(-) diff --git a/includes/db/Database.php b/includes/db/Database.php index c9a45e1715..26d4d2b7d0 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -1988,6 +1988,16 @@ abstract class DatabaseBase implements DatabaseType { return "REPLACE({$orig}, {$old}, {$new})"; } + /** + * Convert a field to an unix timestamp + * + * @param $field String: field name + * @return String: SQL statement + */ + public function unixTimestamp( $field ) { + return "EXTRACT(epoch FROM $field)"; + } + /** * Determines if the last failure was due to a deadlock * STUB diff --git a/includes/db/DatabaseMssql.php b/includes/db/DatabaseMssql.php index d525e2aacf..93c1cf2c6f 100644 --- a/includes/db/DatabaseMssql.php +++ b/includes/db/DatabaseMssql.php @@ -787,6 +787,10 @@ class DatabaseMssql extends DatabaseBase { return false; } + public function unixTimestamp( $field ) { + return "DATEDIFF(s,CONVERT(datetime,'1/1/1970'),$field)"; + } + /** * Begin a transaction, committing any previously open transaction */ diff --git a/includes/db/DatabaseMysql.php b/includes/db/DatabaseMysql.php index 10c6cf268b..c4f0f472f8 100644 --- a/includes/db/DatabaseMysql.php +++ b/includes/db/DatabaseMysql.php @@ -474,6 +474,9 @@ class DatabaseMysql extends DatabaseBase { $this->query( "SET sql_big_selects=$encValue", __METHOD__ ); } + public function unixTimestamp( $field ) { + return "UNIX_TIMESTAMP($field)"; + } /** * Determines if the last failure was due to a deadlock diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index 33e1104a56..be974d6e39 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -839,6 +839,10 @@ class DatabaseOracle extends DatabaseBase { return 'SELECT * ' . ( $all ? '':'/* UNION_UNIQUE */ ' ) . 'FROM (' . implode( $glue, $sqls ) . ')' ; } + public function unixTimestamp( $field ) { + return "((trunc($field) - to_date('19700101','YYYYMMDD')) * 86400)"; + } + function wasDeadlock() { return $this->lastErrno() == 'OCI-00060'; } diff --git a/includes/db/DatabaseSqlite.php b/includes/db/DatabaseSqlite.php index 4635d3384c..e29e1a48ff 100644 --- a/includes/db/DatabaseSqlite.php +++ b/includes/db/DatabaseSqlite.php @@ -431,6 +431,10 @@ class DatabaseSqlite extends DatabaseBase { return implode( $glue, $sqls ); } + public function unixTimestamp( $field ) { + return $field; + } + function wasDeadlock() { return $this->lastErrno() == 5; // SQLITE_BUSY } diff --git a/includes/specials/SpecialAncientpages.php b/includes/specials/SpecialAncientpages.php index 74251b7e99..2d5047d2d2 100644 --- a/includes/specials/SpecialAncientpages.php +++ b/includes/specials/SpecialAncientpages.php @@ -39,31 +39,10 @@ class AncientPagesPage extends QueryPage { function isSyndicated() { return false; } function getSQL() { - global $wgDBtype; $db = wfGetDB( DB_SLAVE ); $page = $db->tableName( 'page' ); $revision = $db->tableName( 'revision' ); - - switch ($wgDBtype) { - case 'mysql': - $epoch = 'UNIX_TIMESTAMP(rev_timestamp)'; - break; - case 'ibm_db2': - // TODO implement proper conversion to a Unix epoch - $epoch = 'rev_timestamp'; - break; - case 'oracle': - $epoch = '((trunc(rev_timestamp) - to_date(\'19700101\',\'YYYYMMDD\')) * 86400)'; - break; - case 'sqlite': - $epoch = 'rev_timestamp'; - break; - case 'mssql': - $epoch = 'DATEDIFF(s,CONVERT(datetime,\'1/1/1970\'),rev_timestamp)'; - break; - default: - $epoch = 'EXTRACT(epoch FROM rev_timestamp)'; - } + $epoch = $db->unixTimestamp( 'rev_timestamp' ); return "SELECT 'Ancientpages' as type, diff --git a/includes/specials/SpecialUnusedimages.php b/includes/specials/SpecialUnusedimages.php index 88600e5ab0..0bc1e1fdfc 100644 --- a/includes/specials/SpecialUnusedimages.php +++ b/includes/specials/SpecialUnusedimages.php @@ -40,25 +40,11 @@ class UnusedimagesPage extends ImageQueryPage { function isSyndicated() { return false; } function getSQL() { - global $wgCountCategorizedImagesAsUsed, $wgDBtype; + global $wgCountCategorizedImagesAsUsed; + $dbr = wfGetDB( DB_SLAVE ); - switch ($wgDBtype) { - case 'mysql': - $epoch = 'UNIX_TIMESTAMP(img_timestamp)'; - break; - case 'oracle': - $epoch = '((trunc(img_timestamp) - to_date(\'19700101\',\'YYYYMMDD\')) * 86400)'; - break; - case 'sqlite': - $epoch = 'img_timestamp'; - break; - case 'mssql': - $epoch = 'DATEDIFF(s,CONVERT(datetime,\'1/1/1970\'),img_timestamp)'; - break; - default: - $epoch = 'EXTRACT(epoch FROM img_timestamp)'; - } + $epoch = $db->unixTimestamp( 'rev_timestamp' ); if ( $wgCountCategorizedImagesAsUsed ) { list( $page, $image, $imagelinks, $categorylinks ) = $dbr->tableNamesN( 'page', 'image', 'imagelinks', 'categorylinks' ); -- 2.20.1