*/ class SetupStore extends \Maintenance { /** * Name of the store class configured in LocalSettings.php. Stored to * be able to tell if the selected store is the currecnt default or not. * * @var string */ protected $originalStore; /** * @var MessageReporter */ protected $messageReporter; /** * @since 2.0 */ public function __construct() { parent::__construct(); } /** * @see Maintenance::addDefaultParams * * @since 2.0 */ protected function addDefaultParams() { parent::addDefaultParams(); $this->mDescription = 'Sets up the SMW storage backend currently selected in LocalSettings.php.'; $this->addOption( 'backend', 'Execute the operation for the storage backend of the given name.', false, true, 'b' ); $this->addOption( 'delete', 'Delete all SMW data, uninstall the selected storage backend.' ); $this->addOption( 'skip-optimize', 'Skipping the table optimization process (not recommended).', false ); $this->addOption( 'skip-import', 'Skipping the import process.', false ); $this->addOption( 'nochecks', 'Run the script without providing prompts. Deletion will thus happen without the need to provide any confirmation.' ); } /** * @since 3.0 * * @param MessageReporter $messageReporter */ public function setMessageReporter( MessageReporter $messageReporter ) { $this->messageReporter = $messageReporter; } /** * @see Maintenance::getDbType * * @since 3.0 */ public function getDbType() { return \Maintenance::DB_ADMIN; } /** * @since 3.0 */ public function getConnection() { return $this->getDB( DB_MASTER ); } /** * @see Maintenance::execute * * @since 2.0 */ public function execute() { if ( !Setup::isEnabled() ) { $this->reportMessage( "\nYou need to have SMW enabled in order to run the maintenance script!\n" ); exit; } StoreFactory::clear(); $this->loadGlobalFunctions(); $store = $this->getStore(); $connectionManager = ApplicationFactory::getInstance()->getConnectionManager(); // #2963 Use the Maintenance DB connection instead and the DB_ADMIN request // to allow to use the admin user/pass, if set $connectionManager->registerCallbackConnection( DB_MASTER, [ $this, 'getConnection' ] ); $store->setConnectionManager( $connectionManager ); $store->setMessageReporter( $this->getMessageReporter() ); $store->setOption( Installer::OPT_TABLE_OPTIMIZE, !$this->hasOption( 'skip-optimize' ) ); $store->setOption( Installer::OPT_IMPORT, !$this->hasOption( 'skip-import' ) ); $store->setOption( Installer::OPT_SUPPLEMENT_JOBS, true ); if ( $this->hasOption( 'delete' ) ) { $this->dropStore( $store ); } else { $store->setup(); } // Avoid holding a reference StoreFactory::clear(); } protected function getMessageReporter() { $messageReporterFactory = MessageReporterFactory::getInstance(); if ( $this->messageReporter === null && $this->getOption( 'quiet' ) ) { $this->messageReporter = $messageReporterFactory->newNullMessageReporter(); } elseif( $this->messageReporter === null ) { $this->messageReporter = $messageReporterFactory->newObservableMessageReporter(); $this->messageReporter->registerReporterCallback( [ $this, 'reportMessage' ] ); } return $this->messageReporter; } protected function loadGlobalFunctions() { global $smwgIP; if ( !isset( $smwgIP ) ) { $smwgIP = dirname( __FILE__ ) . '/../'; } require_once ( $smwgIP . 'src/GlobalFunctions.php' ); } protected function getStore() { global $smwgDefaultStore; $storeClass = $this->getOption( 'backend', $smwgDefaultStore ); $this->originalStore = $smwgDefaultStore; if ( class_exists( $storeClass ) ) { $smwgDefaultStore = $storeClass; } else { $this->error( "\nError: There is no backend class \"$storeClass\". Aborting.", 1 ); } return StoreFactory::getStore( $storeClass ); } protected function dropStore( Store $store ) { $storeName = get_class( $store ); $verification = $this->promptDeletionVerification( $storeName ); if ( !$verification ) { return; } $store->drop( !$this->isQuiet() ); // be sure to have some buffer, otherwise some PHPs complain while ( ob_get_level() > 0 ) { ob_end_flush(); } $this->output( "\nYou can recreate them with this script followed by the use\n"); $this->output( "of the rebuildData.php script to rebuild their contents.\n"); } /** * @param string $storeName * * @return boolean */ protected function promptDeletionVerification( $storeName ) { $this->output( "You are about to delete all data stored in the SMW backend $storeName.\n" ); if ( $storeName === $this->originalStore ) { $this->output( "This backend is CURRENTLY IN USE. Deleting it is likely to BREAK YOUR WIKI.\n" ); } else { $this->output( "This backend is not currently in use. Deleting it should not cause any problems.\n" ); } $this->output( "To undo this operation later on, a complete refresh of the data will be needed.\n" ); if ( !$this->hasOption( 'nochecks' ) ) { print ( "If you are sure you want to proceed, type DELETE.\n" ); if ( $this->readconsole() !== 'DELETE' ) { print ( "Aborting.\n\n" ); return false; } } return true; } /** * @since 3.0 * * @param string $message */ public function reportMessage( $message ) { $this->output( $message ); } } $maintClass = 'SMW\Maintenance\SetupStore'; require_once ( RUN_MAINTENANCE_IF_MAIN );