diff options
author | Luke Shumaker <lukeshu@sbcglobal.net> | 2016-05-01 15:12:12 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@sbcglobal.net> | 2016-05-01 15:12:12 -0400 |
commit | c9aa36da061816dee256a979c2ff8d2ee41824d9 (patch) | |
tree | 29f7002b80ee984b488bd047dbbd80b36bf892e9 /includes/installer/MssqlUpdater.php | |
parent | b4274e0e33eafb5e9ead9d949ebf031a9fb8363b (diff) | |
parent | d1ba966140d7a60cd5ae4e8667ceb27c1a138592 (diff) |
Merge branch 'archwiki'
# Conflicts:
# skins/ArchLinux.php
# skins/ArchLinux/archlogo.gif
Diffstat (limited to 'includes/installer/MssqlUpdater.php')
-rw-r--r-- | includes/installer/MssqlUpdater.php | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/includes/installer/MssqlUpdater.php b/includes/installer/MssqlUpdater.php new file mode 100644 index 00000000..ed11f8b6 --- /dev/null +++ b/includes/installer/MssqlUpdater.php @@ -0,0 +1,138 @@ +<?php +/** + * Microsoft SQL Server-specific installer. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup Deployment + */ + +/** + * Class for setting up the MediaWiki database using Microsoft SQL Server. + * + * @ingroup Deployment + * @since 1.23 + */ + +class MssqlUpdater extends DatabaseUpdater { + + /** + * @var DatabaseMssql + */ + protected $db; + + protected function getCoreUpdateList() { + return array( + // 1.23 + array( 'addField', 'mwuser', 'user_password_expires', 'patch-user_password_expires.sql' ), + + // 1.24 + array( 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql'), + // Constraint updates + array( 'updateConstraints', 'category_types', 'categorylinks', 'cl_type' ), + array( 'updateConstraints', 'major_mime', 'filearchive', 'fa_major_mime' ), + array( 'updateConstraints', 'media_type', 'filearchive', 'fa_media_type' ), + array( 'updateConstraints', 'major_mime', 'oldimage', 'oi_major_mime' ), + array( 'updateConstraints', 'media_type', 'oldimage', 'oi_media_type' ), + array( 'updateConstraints', 'major_mime', 'image', 'img_major_mime' ), + array( 'updateConstraints', 'media_type', 'image', 'img_media_type' ), + array( 'updateConstraints', 'media_type', 'uploadstash', 'us_media_type' ), + // END: Constraint updates + + array( 'modifyField', 'image', 'img_major_mime', + 'patch-img_major_mime-chemical.sql' ), + array( 'modifyField', 'oldimage', 'oi_major_mime', + 'patch-oi_major_mime-chemical.sql' ), + array( 'modifyField', 'filearchive', 'fa_major_mime', + 'patch-fa_major_mime-chemical.sql' ), + ); + } + + /** + * 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; + } +} |