145 if ( is_dir( $dir ) ) {
146 if ( !is_readable( $dir ) ) {
147 return Status::newFatal(
'config-sqlite-dir-unwritable', $dir );
151 if ( !is_writable( dirname( $dir ) ) ) {
153 if ( $webserverGroup !==
null ) {
154 return Status::newFatal(
155 'config-sqlite-parent-unwritable-group',
156 $dir, dirname( $dir ), basename( $dir ),
161 'config-sqlite-parent-unwritable-nogroup',
162 $dir, dirname( $dir ), basename( $dir )
225 $dir = $this->getVar(
'wgSQLiteDataDir' );
227 # Sanity check (Only available in web installation). We checked this before but maybe someone
228 # deleted the data dir between then and now
229 $dir_status = self::checkDataDir( $dir );
230 if ( $dir_status->isGood() ) {
232 $res = self::createDataDir( $dir );
233 if ( !
$res->isGood() ) {
240 $db = $this->getVar(
'wgDBname' );
242 # Make the main and cache stub DB files
243 $status = Status::newGood();
244 $status->merge( $this->makeStubDBFile( $dir, $db ) );
245 $status->merge( $this->makeStubDBFile( $dir,
"wikicache" ) );
246 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_l10n_cache" ) );
247 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_jobqueue" ) );
248 if ( !$status->isOK() ) {
252 # Nuke the unused settings for clarity
253 $this->setVar(
'wgDBserver',
'' );
254 $this->setVar(
'wgDBuser',
'' );
255 $this->setVar(
'wgDBpassword',
'' );
256 $this->setupSchemaVars();
258 # Create the l10n cache DB
260 $conn = Database::factory(
261 'sqlite', [
'dbname' =>
"{$db}_l10n_cache",
'dbDirectory' => $dir ] );
262 # @todo: don't duplicate l10n_cache definition, though it's very simple
265 CREATE TABLE l10n_cache (
266 lc_lang BLOB NOT NULL,
267 lc_key TEXT NOT NULL,
268 lc_value BLOB NOT NULL,
269 PRIMARY KEY (lc_lang, lc_key)
272 $conn->query( $sql, __METHOD__ );
273 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
274 $conn->close( __METHOD__ );
276 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
279 # Create the job queue DB
281 $conn = Database::factory(
282 'sqlite', [
'dbname' =>
"{$db}_jobqueue",
'dbDirectory' => $dir ] );
283 # @todo: don't duplicate job definition, though it's very static
287 job_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
288 job_cmd BLOB NOT NULL
default '',
289 job_namespace INTEGER NOT NULL,
290 job_title TEXT NOT NULL,
291 job_timestamp BLOB NULL
default NULL,
292 job_params BLOB NOT NULL,
293 job_random integer NOT NULL
default 0,
294 job_attempts integer NOT NULL
default 0,
295 job_token BLOB NOT NULL
default '',
296 job_token_timestamp BLOB NULL
default NULL,
297 job_sha1 BLOB NOT NULL
default ''
299 CREATE INDEX job_sha1 ON job (job_sha1);
300 CREATE INDEX job_cmd_token ON job (job_cmd,job_token,job_random);
301 CREATE INDEX job_cmd_token_id ON job (job_cmd,job_token,job_id);
302 CREATE INDEX job_cmd ON job (job_cmd, job_namespace, job_title, job_params);
303 CREATE INDEX job_timestamp ON job (job_timestamp);
305 $conn->query( $sql, __METHOD__ );
306 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
307 $conn->close( __METHOD__ );
309 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
313 return $this->getConnection();
358 $module = DatabaseSqlite::getFulltextSearchModule();
359 $searchIndexSql = (string)$this->db->selectField(
360 $this->db->addIdentifierQuotes(
'sqlite_master' ),
362 [
'tbl_name' => $this->db->tableName(
'searchindex',
'raw' ) ],
365 $fts3tTable = ( stristr( $searchIndexSql,
'fts' ) !== false );
367 if ( $fts3tTable && !$module ) {
368 $status->warning(
'config-sqlite-fts3-downgrade' );
369 $this->db->sourceFile(
"$IP/maintenance/sqlite/archives/searchindex-no-fts.sql" );
370 } elseif ( !$fts3tTable && $module ==
'FTS3' ) {
371 $this->db->sourceFile(
"$IP/maintenance/sqlite/archives/searchindex-fts3.sql" );