Пример #1
0
 /**
  * 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;
 }
Пример #2
0
 /**
  * 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;
 }