/** * General schema update for a table that touches more than one field or requires * destructive actions (such as dropping and recreating the table). * * @param string $table * @param string $updatekey * @param string $patch * @param bool $fullpath */ protected function updateSchema($table, $updatekey, $patch, $fullpath = false) { if (!$this->db->tableExists($table, __METHOD__)) { $this->output("...{$table} table does not exist, skipping schema update patch.\n"); } elseif ($this->updateRowExists($updatekey)) { $this->output("...{$table} already had schema updated by {$patch}.\n"); } else { $this->insertUpdateRow($updatekey); return $this->applyPatch($patch, $fullpath, "Updating schema of table {$table}"); } return true; }
/** * Drops unnamed and creates named constraints following the pattern * <column>_ckc * * @param string $constraintType * @param string $table Name of the table to which the field belongs * @param string $field Name of the field to modify * @return bool False if patch is skipped. */ protected function updateConstraints($constraintType, $table, $field) { global $wgDBname, $wgDBmwschema; if (!$this->doTable($table)) { return true; } $this->output("...updating constraints on [{$table}].[{$field}] ..."); $updateKey = "{$field}-{$constraintType}-ck"; if (!$this->db->tableExists($table, __METHOD__)) { $this->output("...{$table} table does not exist, skipping modify field patch.\n"); return true; } elseif (!$this->db->fieldExists($table, $field, __METHOD__)) { $this->output("...{$field} field does not exist in {$table} table, " . "skipping modify field patch.\n"); return true; } elseif ($this->updateRowExists($updateKey)) { $this->output("...{$field} in table {$table} already patched.\n"); return true; } # After all checks passed, start the update $this->insertUpdateRow($updateKey); $path = 'named_constraints.sql'; $constraintMap = array('category_types' => "({$field} in('page', 'subcat', 'file'))", 'major_mime' => "({$field} in('unknown', 'application', 'audio', 'image', 'text', 'video'," . " 'message', 'model', 'multipart'))", 'media_type' => "({$field} in('UNKNOWN', 'BITMAP', 'DRAWING', 'AUDIO', 'VIDEO', 'MULTIMEDIA'," . "'OFFICE', 'TEXT', 'EXECUTABLE', 'ARCHIVE'))"); $constraint = $constraintMap[$constraintType]; # and hack-in those variables that should be replaced # in our template file right now $this->db->setSchemaVars(array('tableName' => $table, 'fieldName' => $field, 'checkConstraint' => $constraint, 'wgDBname' => $wgDBname, 'wgDBmwschema' => $wgDBmwschema)); # Full path from file name $path = $this->db->patchPath($path); # No need for a cursor allowing result-iteration; just apply a patch # store old value for re-setting later $wasScrollable = $this->db->scrollableCursor(false); # Apply patch $this->db->sourceFile($path); # Reset DB instance to have original state $this->db->setSchemaVars(false); $this->db->scrollableCursor($wasScrollable); $this->output("done.\n"); return true; }