Use different query for SQLite databases.

- Fix: Avoid errors with SQLite database.

Closes #35.
This commit is contained in:
Daniel Kraus
2017-10-16 20:16:33 +02:00
parent f1df4e29f0
commit 9244518b26
2 changed files with 42 additions and 28 deletions

View File

@ -169,9 +169,24 @@ class Config {
*/ */
public $sameNamespace; public $sameNamespace;
/**
* Caches the global $wgDBtype variable.
* @var string $dbType;
*/
private $dbType;
public $enableConsoleOutput; public $enableConsoleOutput;
public $enableDebugConsoleOutput; 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. * Constructs a new Config object.
* *
@ -197,6 +212,7 @@ class Config {
global $wgLinkTitlesEnableNoTargetMagicWord; global $wgLinkTitlesEnableNoTargetMagicWord;
global $wgLinkTitlesCheckRedirect; global $wgLinkTitlesCheckRedirect;
global $wgLinkTitlesSpecialPageReloadAfter; global $wgLinkTitlesSpecialPageReloadAfter;
global $wgDBtype;
$this->parseOnEdit = $wgLinkTitlesParseOnEdit; $this->parseOnEdit = $wgLinkTitlesParseOnEdit;
$this->parseOnRender = $wgLinkTitlesParseOnRender; $this->parseOnRender = $wgLinkTitlesParseOnRender;
$this->preferShortTitles = $wgLinkTitlesPreferShortTitles; $this->preferShortTitles = $wgLinkTitlesPreferShortTitles;
@ -217,5 +233,6 @@ class Config {
$this->specialPageReloadAfter = $wgLinkTitlesSpecialPageReloadAfter; $this->specialPageReloadAfter = $wgLinkTitlesSpecialPageReloadAfter;
$this->enableConsoleOutput = false; $this->enableConsoleOutput = false;
$this->enableDebugConsoleOutput = false; $this->enableDebugConsoleOutput = false;
$this->dbType = $wgDBtype;
} }
} }

View File

@ -74,6 +74,12 @@ class Targets {
private $config; 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. * The constructor is private to enforce using the singleton pattern.
* @param \Title $title * @param \Title $title
@ -129,7 +135,6 @@ class Targets {
// = 0) are returned. Since the db may be sqlite, we need a try..catch // = 0) are returned. Since the db may be sqlite, we need a try..catch
// structure because sqlite does not support the CHAR_LENGTH function. // structure because sqlite does not support the CHAR_LENGTH function.
$dbr = wfGetDB( DB_SLAVE ); $dbr = wfGetDB( DB_SLAVE );
try {
$this->queryResult = $dbr->select( $this->queryResult = $dbr->select(
'page', 'page',
array( 'page_title', 'page_namespace' , "weight" => $weightSelect), array( 'page_title', 'page_namespace' , "weight" => $weightSelect),
@ -141,22 +146,14 @@ class Targets {
) )
), ),
__METHOD__, __METHOD__,
array( 'ORDER BY' => 'weight ASC, CHAR_LENGTH(page_title) ' . $sortOrder ) array( 'ORDER BY' => 'weight ASC, ' . $this->charLength() . '(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 )
); );
} }
private function charLength() {
if ($this->charLengthFunction === null) {
$this->charLengthFunction = $this->config->sqliteDatabase() ? 'LENGTH' : 'CHAR_LENGTH';
}
return $this->charLengthFunction;
} }
} }