diff --git a/includes/Config.php b/includes/Config.php index 0940cd2..f5c77d0 100644 --- a/includes/Config.php +++ b/includes/Config.php @@ -169,9 +169,24 @@ class Config { */ public $sameNamespace; + /** + * Caches the global $wgDBtype variable. + * @var string $dbType; + */ + private $dbType; + public $enableConsoleOutput; public $enableDebugConsoleOutput; + /** + * Determines whether the MediaWiki database is SQLITE by inspecting the + * $wgDBtype variable (which is cached in $this->dbType). + * @return bool True if the database is SQLITE. + */ + public function sqliteDatabase() { + return $this->dbType === 'sqlite'; + } + /** * Constructs a new Config object. * @@ -197,6 +212,7 @@ class Config { global $wgLinkTitlesEnableNoTargetMagicWord; global $wgLinkTitlesCheckRedirect; global $wgLinkTitlesSpecialPageReloadAfter; + global $wgDBtype; $this->parseOnEdit = $wgLinkTitlesParseOnEdit; $this->parseOnRender = $wgLinkTitlesParseOnRender; $this->preferShortTitles = $wgLinkTitlesPreferShortTitles; @@ -217,5 +233,6 @@ class Config { $this->specialPageReloadAfter = $wgLinkTitlesSpecialPageReloadAfter; $this->enableConsoleOutput = false; $this->enableDebugConsoleOutput = false; + $this->dbType = $wgDBtype; } } diff --git a/includes/Targets.php b/includes/Targets.php index d129d72..e88d042 100644 --- a/includes/Targets.php +++ b/includes/Targets.php @@ -74,6 +74,12 @@ class Targets { private $config; + /** + * Stores the CHAR_LENGTH function to be used with the database connection. + * @var string $charLengthFunction + */ + private $charLengthFunction; + /** * The constructor is private to enforce using the singleton pattern. * @param \Title $title @@ -129,34 +135,25 @@ class Targets { // = 0) are returned. Since the db may be sqlite, we need a try..catch // structure because sqlite does not support the CHAR_LENGTH function. $dbr = wfGetDB( DB_SLAVE ); - try { - $this->queryResult = $dbr->select( - 'page', - array( 'page_title', 'page_namespace' , "weight" => $weightSelect), - array_filter( - array( - 'page_namespace IN ' . $namespacesClause, - 'CHAR_LENGTH(page_title) >= ' . $this->config->minimumTitleLength, - $blackList, - ) - ), - __METHOD__, - array( 'ORDER BY' => 'weight ASC, CHAR_LENGTH(page_title) ' . $sortOrder ) - ); - } catch (Exception $e) { - $this->queryResult = $dbr->select( - 'page', - array( 'page_title', 'page_namespace' , "weight" => $weightSelect ), - array_filter( - array( - 'page_namespace IN ' . $namespacesClause, - 'LENGTH(page_title) >= ' . $this->config->minimumTitleLength, - $blackList, - ) - ), - __METHOD__, - array( 'ORDER BY' => 'weight ASC, LENGTH(page_title) ' . $sortOrder ) - ); + $this->queryResult = $dbr->select( + 'page', + array( 'page_title', 'page_namespace' , "weight" => $weightSelect), + array_filter( + array( + 'page_namespace IN ' . $namespacesClause, + 'CHAR_LENGTH(page_title) >= ' . $this->config->minimumTitleLength, + $blackList, + ) + ), + __METHOD__, + array( 'ORDER BY' => 'weight ASC, ' . $this->charLength() . '(page_title) ' . $sortOrder ) + ); + } + + private function charLength() { + if ($this->charLengthFunction === null) { + $this->charLengthFunction = $this->config->sqliteDatabase() ? 'LENGTH' : 'CHAR_LENGTH'; } + return $this->charLengthFunction; } }