/** * Create database tables from scratch. * * @return Status */ public function createTables() { $status = $this->getConnection(); if (!$status->isOK()) { return $status; } $this->db->selectDB($this->getVar('wgDBname')); if ($this->db->tableExists('archive', __METHOD__)) { $status->warning('config-install-tables-exist'); $this->enableLB(); return $status; } $this->db->setFlag(DBO_DDLMODE); // For Oracle's handling of schema files $this->db->begin(__METHOD__); $error = $this->db->sourceFile($this->db->getSchemaPath()); if ($error !== true) { $this->db->reportQueryError($error, 0, '', __METHOD__); $this->db->rollback(__METHOD__); $status->fatal('config-install-tables-failed', $error); } else { $this->db->commit(__METHOD__); } // Resume normal operations if ($status->isOk()) { $this->enableLB(); } return $status; }
/** * Apply a SQL source file to the database as part of running an installation step. * * @param string $sourceFileMethod * @param string $stepName * @param string $archiveTableMustNotExist * @return Status */ private function stepApplySourceFile($sourceFileMethod, $stepName, $archiveTableMustNotExist = false) { $status = $this->getConnection(); if (!$status->isOK()) { return $status; } $this->db->selectDB($this->getVar('wgDBname')); if ($archiveTableMustNotExist && $this->db->tableExists('archive', __METHOD__)) { $status->warning("config-{$stepName}-tables-exist"); $this->enableLB(); return $status; } $this->db->setFlag(DBO_DDLMODE); // For Oracle's handling of schema files $this->db->begin(__METHOD__); $error = $this->db->sourceFile(call_user_func(array($this->db, $sourceFileMethod))); if ($error !== true) { $this->db->reportQueryError($error, 0, '', __METHOD__); $this->db->rollback(__METHOD__); $status->fatal("config-{$stepName}-tables-failed", $error); } else { $this->db->commit(__METHOD__); } // Resume normal operations if ($status->isOk()) { $this->enableLB(); } return $status; }
/** * Create the tables for each extension the user enabled * @return Status */ public function createExtensionTables() { $status = $this->getConnection(); if (!$status->isOK()) { return $status; } $updater = DatabaseUpdater::newForDB($this->db); $extensionUpdates = $updater->getNewExtensions(); $ourExtensions = array_map('strtolower', $this->getVar('_Extensions')); foreach ($ourExtensions as $ext) { if (isset($extensionUpdates[$ext])) { $this->db->begin(__METHOD__); $error = $this->db->sourceFile($extensionUpdates[$ext]); if ($error !== true) { $this->db->rollback(__METHOD__); $status->warning('config-install-tables-failed', $error); } else { $this->db->commit(__METHOD__); } } } // Now run updates to create tables for old extensions $updater->doUpdates(array('extensions')); return $status; }
/** * Applies a SQL patch * @param $path String Path to the patch file * @param $isFullPath Boolean Whether to treat $path as a relative or not */ protected function applyPatch($path, $isFullPath = false) { if ($isFullPath) { $this->db->sourceFile($path); } else { $this->db->sourceFile($this->db->patchPath($path)); } }
public function testStoredFunctions() { if (!in_array(wfGetDB(DB_MASTER)->getType(), array('mysql', 'postgres'))) { $this->markTestSkipped('MySQL or Postgres required'); } global $IP; $this->dropFunctions(); $this->functionTest = true; $this->assertTrue($this->db->sourceFile("{$IP}/tests/phpunit/data/db/{$this->db->getType()}/functions.sql")); $res = $this->db->query('SELECT mw_test_function() AS test', __METHOD__); $this->assertEquals(42, $res->fetchObject()->test); }
/** * Applies a SQL patch * @param $path String Path to the patch file * @param $isFullPath Boolean Whether to treat $path as a relative or not * @param $msg String Description of the patch */ protected function applyPatch($path, $isFullPath = false, $msg = null) { if ($msg === null) { $msg = "Applying {$path} patch"; } if (!$isFullPath) { $path = $this->db->patchPath($path); } $this->output("{$msg} ..."); $this->db->sourceFile($path); $this->output("done.\n"); }
/** * Applies a SQL patch * * @param string $path Path to the patch file * @param bool $isFullPath Whether to treat $path as a relative or not * @param string $msg Description of the patch * @return bool False if patch is skipped. */ protected function applyPatch($path, $isFullPath = false, $msg = null) { if ($msg === null) { $msg = "Applying {$path} patch"; } if ($this->skipSchema) { $this->output("...skipping schema change ({$msg}).\n"); return false; } $this->output("{$msg} ..."); if (!$isFullPath) { $path = $this->db->patchPath($path); } if ($this->fileHandle !== null) { $this->copyFile($path); } else { $this->db->sourceFile($path); } $this->output("done.\n"); return true; }