25 use Wikimedia\AtEase\AtEase;
64 $db = DatabaseSqlite::newStandaloneInstance(
':memory:' );
67 if ( DatabaseSqlite::getFulltextSearchModule() !=
'FTS3' ) {
68 $result->warning(
'config-no-fts3' );
76 $defaults = parent::getGlobalDefaults();
77 if ( !empty( $_SERVER[
'DOCUMENT_ROOT'] ) ) {
78 $path = dirname( $_SERVER[
'DOCUMENT_ROOT'] );
83 $defaults[
'wgSQLiteDataDir'] = str_replace(
94 'config-sqlite-dir', [],
95 $this->parent->getHelpBox(
'config-sqlite-dir-help' )
101 $this->parent->getHelpBox(
'config-sqlite-name-help' )
112 private static function realpath(
$path ) {
122 # Try realpath() if the directory already exists
123 $dir = self::realpath( $this->
getVar(
'wgSQLiteDataDir' ) );
124 $result = self::checkDataDir( $dir );
125 if ( $result->isOK() ) {
126 # Try expanding again in case we've just created it
127 $dir = self::realpath( $dir );
128 $this->
setVar(
'wgSQLiteDataDir', $dir );
130 # Table prefix is not used on SQLite, keep it empty
131 $this->
setVar(
'wgDBprefix',
'' );
141 private static function checkDataDir( $dir ):
Status {
142 if ( is_dir( $dir ) ) {
143 if ( !is_readable( $dir ) ) {
148 if ( !is_writable( dirname( $dir ) ) ) {
150 if ( $webserverGroup !==
null ) {
152 'config-sqlite-parent-unwritable-group',
153 $dir, dirname( $dir ), basename( $dir ),
158 'config-sqlite-parent-unwritable-nogroup',
159 $dir, dirname( $dir ), basename( $dir )
171 private static function createDataDir( $dir ):
Status {
172 if ( !is_dir( $dir ) ) {
173 AtEase::suppressWarnings();
175 AtEase::restoreWarnings();
180 # Put a .htaccess file in case the user didn't take our advice
181 file_put_contents(
"$dir/.htaccess",
"Deny from all\n" );
190 $dir = $this->getVar(
'wgSQLiteDataDir' );
191 $dbName = $this->getVar(
'wgDBname' );
193 $db = MediaWikiServices::getInstance()->getDatabaseFactory()->create(
194 'sqlite', [
'dbname' => $dbName,
'dbDirectory' => $dir ]
196 $status->value = $db;
198 $status->fatal(
'config-sqlite-connection-error', $e->getMessage() );
208 $dir = $this->getVar(
'wgSQLiteDataDir' );
209 $dbName = $this->getVar(
'wgDBname' );
211 if ( !file_exists( DatabaseSqlite::generateFileName( $dir, $dbName ) ) ) {
216 return parent::needsUpgrade();
223 $dir = $this->getVar(
'wgSQLiteDataDir' );
225 # Double check (Only available in web installation). We checked this before but maybe someone
226 # deleted the data dir between then and now
227 $dir_status = self::checkDataDir( $dir );
228 if ( $dir_status->isGood() ) {
229 $res = self::createDataDir( $dir );
230 if ( !
$res->isGood() ) {
237 $db = $this->getVar(
'wgDBname' );
239 # Make the main and cache stub DB files
241 $status->merge( $this->makeStubDBFile( $dir, $db ) );
242 $status->merge( $this->makeStubDBFile( $dir,
"wikicache" ) );
243 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_l10n_cache" ) );
244 $status->merge( $this->makeStubDBFile( $dir,
"{$db}_jobqueue" ) );
245 if ( !$status->isOK() ) {
249 # Nuke the unused settings for clarity
250 $this->setVar(
'wgDBserver',
'' );
251 $this->setVar(
'wgDBuser',
'' );
252 $this->setVar(
'wgDBpassword',
'' );
253 $this->setupSchemaVars();
255 # Create the l10n cache DB
258 'sqlite', [
'dbname' =>
"{$db}_l10n_cache",
'dbDirectory' => $dir ] );
259 # @todo: don't duplicate l10n_cache definition, though it's very simple
262 CREATE TABLE l10n_cache (
263 lc_lang BLOB NOT NULL,
264 lc_key TEXT NOT NULL,
265 lc_value BLOB NOT NULL,
266 PRIMARY KEY (lc_lang, lc_key)
269 $conn->query( $sql, __METHOD__ );
270 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
271 $conn->close( __METHOD__ );
273 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
276 # Create the job queue DB
279 'sqlite', [
'dbname' =>
"{$db}_jobqueue",
'dbDirectory' => $dir ] );
280 # @todo: don't duplicate job definition, though it's very static
284 job_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
285 job_cmd BLOB NOT NULL
default '',
286 job_namespace INTEGER NOT NULL,
287 job_title TEXT NOT NULL,
288 job_timestamp BLOB NULL
default NULL,
289 job_params BLOB NOT NULL,
290 job_random integer NOT NULL
default 0,
291 job_attempts integer NOT NULL
default 0,
292 job_token BLOB NOT NULL
default '',
293 job_token_timestamp BLOB NULL
default NULL,
294 job_sha1 BLOB NOT NULL
default ''
296 CREATE INDEX job_sha1 ON job (job_sha1);
297 CREATE INDEX job_cmd_token ON job (job_cmd,job_token,job_random);
298 CREATE INDEX job_cmd_token_id ON job (job_cmd,job_token,job_id);
299 CREATE INDEX job_cmd ON job (job_cmd, job_namespace, job_title, job_params);
300 CREATE INDEX job_timestamp ON job (job_timestamp);
302 $conn->query( $sql, __METHOD__ );
303 $conn->query(
"PRAGMA journal_mode=WAL", __METHOD__ );
304 $conn->close( __METHOD__ );
306 return Status::newFatal(
'config-sqlite-connection-error', $e->getMessage() );
310 return $this->getConnection();
319 $file = DatabaseSqlite::generateFileName( $dir, $db );
321 if ( file_exists(
$file ) ) {
322 if ( !is_writable(
$file ) ) {
328 $oldMask = umask( 0177 );
329 if ( file_put_contents(
$file,
'' ) ===
false ) {
342 $status = parent::createTables();
343 if ( $status->isGood() ) {
344 $status = parent::createManualTables();
347 return $this->setupSearchIndex( $status );
362 $module = DatabaseSqlite::getFulltextSearchModule();
363 $searchIndexSql = (string)$this->db->selectField(
364 $this->db->addIdentifierQuotes(
'sqlite_master' ),
366 [
'tbl_name' => $this->db->tableName(
'searchindex',
'raw' ) ],
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" );
389 return "# SQLite-specific settings
390 \$wgSQLiteDataDir = \"{$dir}\";
391 \$wgObjectCaches[CACHE_DB] = [
392 'class' => SqlBagOStuff::class,
393 'loggroup' => 'SQLBagOStuff',
396 'dbname' => 'wikicache',
398 'variables' => [ 'synchronous' => 'NORMAL' ],
399 'dbDirectory' => \$wgSQLiteDataDir,
400 'trxMode' => 'IMMEDIATE',
404 \$wgObjectCaches['db-replicated'] = [
405 'factory' => 'Wikimedia\ObjectFactory\ObjectFactory::getObjectFromSpec',
406 'args' => [ [ 'factory' => 'ObjectCache::getInstance', 'args' => [ CACHE_DB ] ] ]
408 \$wgLocalisationCacheConf['storeServer'] = [
410 'dbname' => \"{\$wgDBname}_l10n_cache\",
412 'variables' => [ 'synchronous' => 'NORMAL' ],
413 'dbDirectory' => \$wgSQLiteDataDir,
414 'trxMode' => 'IMMEDIATE',
417 \$wgJobTypeConf['default'] = [
418 'class' => 'JobQueueDB',
422 'dbname' => \"{\$wgDBname}_jobqueue\",
424 'variables' => [ 'synchronous' => 'NORMAL' ],
425 'dbDirectory' => \$wgSQLiteDataDir,
426 'trxMode' => 'IMMEDIATE',
430 \$wgResourceLoaderUseObjectCacheForDeps = true;";
wfMkdirParents( $dir, $mode=null, $caller=null)
Make directory, and make all parent directories if they don't exist.
if(!defined( 'MEDIAWIKI')) if(ini_get( 'mbstring.func_overload')) if(!defined( 'MW_ENTRY_POINT')) global $IP
Environment checks.
if(!defined('MW_SETUP_CALLBACK'))
The persistent session ID (if any) loaded at startup.
Base class for DBMS-specific installation helper classes.
static checkExtension( $name)
Convenience function.
setVarsFromRequest( $varNames)
Convenience function to set variables based on form data.
getVar( $var, $default=null)
Get a variable, taking local defaults into account.
getTextBox( $var, $label, $attribs=[], $helpData="")
Get a labelled text box to configure a local variable.
setVar( $name, $value)
Convenience alias for $this->parent->setVar()
static maybeGetWebserverPrimaryGroup()
On POSIX systems return the primary group of the webserver we're running under.
static escapePhpString( $string)
Returns the escaped version of a string of php code.
Class for setting up the MediaWiki database using SQLLite.
setupSearchIndex(&$status)
getGlobalDefaults()
Get a name=>value map of MW configuration globals for the default values.
makeStubDBFile( $dir, $db)
getName()
Return the internal name, e.g.
getConnectForm()
Get HTML for a web form that configures this database.
static $notMinimumVersionMessage
createManualTables()
Create database tables from scratch.
static newFatal( $message,... $parameters)
Factory function for fatal errors.
static newGood( $value=null)
Factory function for good results.
Generic operation result class Has warning/error list, boolean status and arbitrary value.
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.