154 $dir, dirname( $dir ), basename( $dir ),
224 $dir = $this->getVar(
'wgSQLiteDataDir' );
226 # Double check (Only available in web installation). We checked this before but maybe someone
227 # deleted the data dir between then and now
228 $dir_status = self::checkDataDir( $dir );
229 if ( $dir_status->isGood() ) {
230 $res = self::createDataDir( $dir );
231 if ( !$res->isGood() ) {
238 $db = $this->getVar(
'wgDBname' );
240 # Make the main and cache stub DB files
241 $status = Status::newGood();
242 $status->merge( $this->makeStubDBFile( $dir, $db ) );
243 $status->merge( $this->makeStubDBFile( $dir,
"wikicache" ) );
244 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_l10n_cache" ) );
245 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_jobqueue" ) );
246 if ( !$status->isOK() ) {
250 # Nuke the unused settings for clarity
251 $this->setVar(
'wgDBserver',
'' );
252 $this->setVar(
'wgDBuser',
'' );
253 $this->setVar(
'wgDBpassword',
'' );
254 $this->setupSchemaVars();
256 # Create the l10n cache DB
259 'sqlite', [
'dbname' =>
"{$db}_l10n_cache",
'dbDirectory' => $dir ] );
260 # @todo: don't duplicate l10n_cache definition, though it's very simple
263 CREATE TABLE l10n_cache (
264 lc_lang BLOB NOT NULL,
265 lc_key TEXT NOT NULL,
266 lc_value BLOB NOT NULL,
267 PRIMARY KEY (lc_lang, lc_key)
270 $conn->query( $sql, __METHOD__ );
271 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
272 $conn->close( __METHOD__ );
274 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
277 # Create the job queue DB
280 'sqlite', [
'dbname' =>
"{$db}_jobqueue",
'dbDirectory' => $dir ] );
281 # @todo: don't duplicate job definition, though it's very static
285 job_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
286 job_cmd BLOB NOT NULL
default '',
287 job_namespace INTEGER NOT NULL,
288 job_title TEXT NOT NULL,
289 job_timestamp BLOB NULL
default NULL,
290 job_params BLOB NOT NULL,
291 job_random integer NOT NULL
default 0,
292 job_attempts integer NOT NULL
default 0,
293 job_token BLOB NOT NULL
default '',
294 job_token_timestamp BLOB NULL
default NULL,
295 job_sha1 BLOB NOT NULL
default ''
297 CREATE INDEX job_sha1 ON job (job_sha1);
298 CREATE INDEX job_cmd_token ON job (job_cmd,job_token,job_random);
299 CREATE INDEX job_cmd_token_id ON job (job_cmd,job_token,job_id);
300 CREATE INDEX job_cmd ON job (job_cmd, job_namespace, job_title, job_params);
301 CREATE INDEX job_timestamp ON job (job_timestamp);
303 $conn->query( $sql, __METHOD__ );
304 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
305 $conn->close( __METHOD__ );
307 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
311 return $this->getConnection();
363 $module = DatabaseSqlite::getFulltextSearchModule();
364 $searchIndexSql = (string)$this->db->newSelectQueryBuilder()
366 ->from( $this->db->addIdentifierQuotes(
'sqlite_master' ) )
367 ->where( [
'tbl_name' => $this->db->tableName(
'searchindex',
'raw' ) ] )
368 ->caller( __METHOD__ )->fetchField();
369 $fts3tTable = ( stristr( $searchIndexSql,
'fts' ) !== false );
371 if ( $fts3tTable && !$module ) {
372 $status->warning(
'config-sqlite-fts3-downgrade' );
373 $this->db->sourceFile(
"$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
374 } elseif ( !$fts3tTable && $module ==
'FTS3' ) {
375 $this->db->sourceFile(
"$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );