MediaWiki REL1_32
OracleUpdater.php
Go to the documentation of this file.
1<?php
31
37 protected $db;
38
39 protected function getCoreUpdateList() {
40 return [
41 [ 'disableContentHandlerUseDB' ],
42
43 // 1.17
44 [ 'doNamespaceDefaults' ],
45 [ 'doFKRenameDeferr' ],
46 [ 'doFunctions17' ],
47 [ 'doSchemaUpgrade17' ],
48 [ 'doInsertPage0' ],
49 [ 'doRemoveNotNullEmptyDefaults' ],
50 [ 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ],
51
52 // 1.18
53 [ 'addIndex', 'user', 'i02', 'patch-user_email_index.sql' ],
54 [ 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ],
55 [ 'addTable', 'uploadstash', 'patch-uploadstash.sql' ],
56 [ 'doRecentchangesFK2Cascade' ],
57
58 // 1.19
59 [ 'addIndex', 'logging', 'i05', 'patch-logging_type_action_index.sql' ],
60 [ 'addField', 'revision', 'rev_sha1', 'patch-rev_sha1_field.sql' ],
61 [ 'addField', 'archive', 'ar_sha1', 'patch-ar_sha1_field.sql' ],
62 [ 'doRemoveNotNullEmptyDefaults2' ],
63 [ 'addIndex', 'page', 'i03', 'patch-page_redirect_namespace_len.sql' ],
64 [ 'addField', 'uploadstash', 'us_chunk_inx', 'patch-us_chunk_inx_field.sql' ],
65 [ 'addField', 'job', 'job_timestamp', 'patch-job_timestamp_field.sql' ],
66 [ 'addIndex', 'job', 'i02', 'patch-job_timestamp_index.sql' ],
67 [ 'doPageRestrictionsPKUKFix' ],
68
69 // 1.20
70 [ 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ],
71 [ 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ],
72 [ 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ],
73
74 // 1.21
75 [ 'addField', 'revision', 'rev_content_format',
76 'patch-revision-rev_content_format.sql' ],
77 [ 'addField', 'revision', 'rev_content_model',
78 'patch-revision-rev_content_model.sql' ],
79 [ 'addField', 'archive', 'ar_content_format', 'patch-archive-ar_content_format.sql' ],
80 [ 'addField', 'archive', 'ar_content_model', 'patch-archive-ar_content_model.sql' ],
81 [ 'addField', 'archive', 'ar_id', 'patch-archive-ar_id.sql' ],
82 [ 'addField', 'externallinks', 'el_id', 'patch-externallinks-el_id.sql' ],
83 [ 'addField', 'page', 'page_content_model', 'patch-page-page_content_model.sql' ],
84 [ 'enableContentHandlerUseDB' ],
85 [ 'dropField', 'site_stats', 'ss_admins', 'patch-ss_admins.sql' ],
86 [ 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ],
87 [ 'addTable', 'sites', 'patch-sites.sql' ],
88 [ 'addField', 'filearchive', 'fa_sha1', 'patch-fa_sha1.sql' ],
89 [ 'addField', 'job', 'job_token', 'patch-job_token.sql' ],
90 [ 'addField', 'job', 'job_attempts', 'patch-job_attempts.sql' ],
91 [ 'addField', 'uploadstash', 'us_props', 'patch-uploadstash-us_props.sql' ],
92 [ 'modifyField', 'user_groups', 'ug_group', 'patch-ug_group-length-increase-255.sql' ],
93 [ 'modifyField', 'user_former_groups', 'ufg_group',
94 'patch-ufg_group-length-increase-255.sql' ],
95
96 // 1.23
97 [ 'addIndex', 'logging', 'i06', 'patch-logging_user_text_type_time_index.sql' ],
98 [ 'addIndex', 'logging', 'i07', 'patch-logging_user_text_time_index.sql' ],
99 [ 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ],
100 [ 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ],
101 [ 'addField', 'recentchanges', 'rc_source', 'patch-rc_source.sql' ],
102
103 // 1.24
104 [ 'addField', 'page', 'page_lang', 'patch-page-page_lang.sql' ],
105
106 // 1.25
107 [ 'dropTable', 'hitcounter' ],
108 [ 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ],
109 [ 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ],
110
111 // 1.27
112 [ 'dropTable', 'msg_resource_links' ],
113 [ 'dropTable', 'msg_resource' ],
114 [ 'addField', 'watchlist', 'wl_id', 'patch-watchlist-wl_id.sql' ],
115
116 // 1.28
117 [ 'addIndex', 'recentchanges', 'rc_name_type_patrolled_timestamp',
118 'patch-add-rc_name_type_patrolled_timestamp_index.sql' ],
119 [ 'addField', 'change_tag', 'ct_id', 'patch-change_tag-ct_id.sql' ],
120 [ 'addField', 'tag_summary', 'ts_id', 'patch-tag_summary-ts_id.sql' ],
121
122 // 1.29
123 [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
124 [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
125
126 // 1.30
127 [ 'doAutoIncrementTriggers' ],
128 [ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
129
130 // Should have been in 1.30
131 [ 'addTable', 'comment', 'patch-comment-table.sql' ],
132 // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
133 [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
134 // Should have been in 1.30
135 [ 'migrateComments' ],
136
137 // 1.31
138 [ 'addTable', 'slots', 'patch-slots.sql' ],
139 [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
140 [ 'addTable', 'content', 'patch-content.sql' ],
141 [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
142 [ 'addTable', 'content_models', 'patch-content_models.sql' ],
143 [ 'migrateArchiveText' ],
144 [ 'addTable', 'actor', 'patch-actor-table.sql' ],
145 [ 'migrateActors' ],
146 [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
147 [ 'populateArchiveRevId' ],
148 [ 'addIndex', 'recentchanges', 'rc_namespace_title_timestamp',
149 'patch-recentchanges-nttindex.sql' ],
150
151 // 1.32
152 [ 'addTable', 'change_tag_def', 'patch-change_tag_def.sql' ],
153 [ 'populateExternallinksIndex60' ],
154 [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
155 [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
156 [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
157 [ 'populateContentTables' ],
158 [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
159 [ 'dropTable', 'transcache' ],
160 [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ],
161 [ 'addIndex', 'change_tag', 'change_tag_i03',
162 'patch-change_tag-change_tag_rc_tag_id.sql' ],
163 [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
164 [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
165 [ 'migrateImageCommentTemp' ],
166
167 // KEEP THIS AT THE BOTTOM!!
168 [ 'doRebuildDuplicateFunction' ],
169
170 ];
171 }
172
178 protected function doNamespaceDefaults() {
179 $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
180 if ( $meta->defaultValue() != null ) {
181 return;
182 }
183
184 $this->applyPatch(
185 'patch_namespace_defaults.sql',
186 false,
187 'Altering namespace fields with default value'
188 );
189 }
190
194 protected function doFKRenameDeferr() {
195 $meta = $this->db->query( '
196 SELECT COUNT(*) cnt
197 FROM user_constraints
198 WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\''
199 );
200 $row = $meta->fetchRow();
201 if ( $row && $row['cnt'] > 0 ) {
202 return;
203 }
204
205 $this->applyPatch( 'patch_fk_rename_deferred.sql', false, "Altering foreign keys ... " );
206 }
207
211 protected function doFunctions17() {
212 $this->applyPatch( 'patch_create_17_functions.sql', false, "Recreating functions" );
213 }
214
219 protected function doSchemaUpgrade17() {
220 // check if iwlinks table exists which was added in 1.17
221 if ( $this->db->tableExists( 'iwlinks' ) ) {
222 return;
223 }
224 $this->applyPatch( 'patch_16_17_schema_changes.sql', false, "Updating schema to 17" );
225 }
226
230 protected function doInsertPage0() {
231 $this->output( "Inserting page 0 if missing ... " );
232 $row = [
233 'page_id' => 0,
234 'page_namespace' => 0,
235 'page_title' => ' ',
236 'page_is_redirect' => 0,
237 'page_is_new' => 0,
238 'page_random' => 0,
239 'page_touched' => $this->db->timestamp(),
240 'page_latest' => 0,
241 'page_len' => 0
242 ];
243 $this->db->insert( 'page', $row, 'OracleUpdater:doInserPage0', [ 'IGNORE' ] );
244 $this->output( "ok\n" );
245 }
246
251 protected function doRemoveNotNullEmptyDefaults() {
252 $meta = $this->db->fieldInfo( 'categorylinks', 'cl_sortkey_prefix' );
253 if ( $meta->isNullable() ) {
254 return;
255 }
256 $this->applyPatch(
257 'patch_remove_not_null_empty_defs.sql',
258 false,
259 'Removing not null empty constraints'
260 );
261 }
262
263 protected function doRemoveNotNullEmptyDefaults2() {
264 $meta = $this->db->fieldInfo( 'ipblocks', 'ipb_by_text' );
265 if ( $meta->isNullable() ) {
266 return;
267 }
268 $this->applyPatch(
269 'patch_remove_not_null_empty_defs2.sql',
270 false,
271 'Removing not null empty constraints'
272 );
273 }
274
279 protected function doRecentchangesFK2Cascade() {
280 $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
281 strtoupper( $this->db->getDBname() ) .
282 '\' AND constraint_name = \'' .
283 $this->db->tablePrefix() .
284 'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
285 );
286 $row = $meta->fetchRow();
287 if ( $row ) {
288 return;
289 }
290
291 $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false, "Altering RECENTCHANGES_FK2" );
292 }
293
297 protected function doPageRestrictionsPKUKFix() {
298 $this->output( "Altering PAGE_RESTRICTIONS keys ... " );
299
300 $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \'' .
301 strtoupper( $this->db->getDBname() ) .
302 '\' AND constraint_name = \'' .
303 $this->db->tablePrefix() .
304 'PAGE_RESTRICTIONS_PK\' AND rownum = 1'
305 );
306 $row = $meta->fetchRow();
307 if ( $row['column_name'] == 'PR_ID' ) {
308 $this->output( "seems to be up to date.\n" );
309
310 return;
311 }
312
313 $this->applyPatch( 'patch-page_restrictions_pkuk_fix.sql', false );
314 $this->output( "ok\n" );
315 }
316
320 protected function doAutoIncrementTriggers() {
321 $this->output( "Adding auto-increment triggers ... " );
322
323 $meta = $this->db->query( 'SELECT trigger_name FROM user_triggers WHERE table_owner = \'' .
324 strtoupper( $this->db->getDBname() ) .
325 '\' AND trigger_name = \'' .
326 $this->db->tablePrefix() .
327 'PAGE_DEFAULT_PAGE_ID\''
328 );
329 $row = $meta->fetchRow();
330 if ( $row['column_name'] ) {
331 $this->output( "seems to be up to date.\n" );
332
333 return;
334 }
335
336 $this->applyPatch( 'patch-auto_increment_triggers.sql', false );
337
338 $this->output( "ok\n" );
339 }
340
344 protected function doRebuildDuplicateFunction() {
345 $this->applyPatch( 'patch_rebuild_dupfunc.sql', false, "Rebuilding duplicate function" );
346 }
347
353 public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
354 parent::doUpdates( $what );
355
356 $this->db->query( 'BEGIN fill_wiki_info; END;' );
357 }
358
362 public function purgeCache() {
363 # We can't guarantee that the user will be able to use TRUNCATE,
364 # but we know that DELETE is available to us
365 $this->output( "Purging caches..." );
366 $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
367 $this->output( "done.\n" );
368 }
369}
Class for handling database updates.
output( $str)
Output some text.
applyPatch( $path, $isFullPath=false, $msg=null)
Applies a SQL patch.
Class for handling updates to Oracle databases.
doRebuildDuplicateFunction()
rebuilding of the function that duplicates tables for tests
purgeCache()
Overload: because of the DDL_MODE tablename escaping is a bit dodgy.
doSchemaUpgrade17()
Schema upgrade 16->17 there are no incremental patches prior to this.
doRemoveNotNullEmptyDefaults()
Remove DEFAULT '' NOT NULL constraints from fields as '' is internally converted to NULL in Oracle.
doUpdates(array $what=[ 'core', 'extensions', 'purge', 'stats'])
Overload: after this action field info table has to be rebuilt.
doPageRestrictionsPKUKFix()
Fixed wrong PK, UK definition.
doNamespaceDefaults()
MySQL uses datatype defaults for NULL inserted into NOT NULL fields In namespace case that results in...
DatabaseOracle $db
Handle to the database subclass.
doInsertPage0()
Insert page (page_id = 0) to prevent FK constraint violation.
getCoreUpdateList()
Get an array of updates to perform on the database.
doFKRenameDeferr()
Uniform FK names + deferrable state.
doAutoIncrementTriggers()
Add auto-increment triggers.
doRecentchangesFK2Cascade()
Removed forcing of invalid state on recentchanges_fk2.
doFunctions17()
Recreate functions to 17 schema layout.
The wiki should then use memcached to cache various data To use multiple just add more items to the array To increase the weight of a make its entry a array("192.168.0.1:11211", 2))