MediaWiki REL1_33
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
121 // 1.29
122 [ 'addField', 'externallinks', 'el_index_60', 'patch-externallinks-el_index_60.sql' ],
123 [ 'addField', 'user_groups', 'ug_expiry', 'patch-user_groups-ug_expiry.sql' ],
124
125 // 1.30
126 [ 'doAutoIncrementTriggers' ],
127 [ 'addIndex', 'site_stats', 'PRIMARY', 'patch-site_stats-pk.sql' ],
128
129 // Should have been in 1.30
130 [ 'addTable', 'comment', 'patch-comment-table.sql' ],
131 // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
132 [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
133 // Should have been in 1.30
134 [ 'migrateComments' ],
135
136 // 1.31
137 [ 'addTable', 'slots', 'patch-slots.sql' ],
138 [ 'addField', 'slots', 'slot_origin', 'patch-slot-origin.sql' ],
139 [ 'addTable', 'content', 'patch-content.sql' ],
140 [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
141 [ 'addTable', 'content_models', 'patch-content_models.sql' ],
142 [ 'migrateArchiveText' ],
143 [ 'addTable', 'actor', 'patch-actor-table.sql' ],
144 [ 'migrateActors' ],
145 [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
146 [ 'populateArchiveRevId' ],
147 [ 'addIndex', 'recentchanges', 'rc_namespace_title_timestamp',
148 'patch-recentchanges-nttindex.sql' ],
149
150 // 1.32
151 [ 'addTable', 'change_tag_def', 'patch-change_tag_def.sql' ],
152 [ 'populateExternallinksIndex60' ],
153 [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
154 [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
155 [ 'addIndex', 'archive', 'ar_revid_uniq', 'patch-archive-ar_rev_id-unique.sql' ],
156 [ 'populateContentTables' ],
157 [ 'addIndex', 'recentchanges', 'rc_this_oldid', 'patch-recentchanges-rc_this_oldid-index.sql' ],
158 [ 'dropTable', 'transcache' ],
159 [ 'runMaintenance', PopulateChangeTagDef::class, 'maintenance/populateChangeTagDef.php' ],
160 [ 'addIndex', 'change_tag', 'change_tag_i03',
161 'patch-change_tag-change_tag_rc_tag_id.sql' ],
162 [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
163 [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
164 [ 'migrateImageCommentTemp' ],
165
166 // 1.33
167 [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
168 [ 'dropTable', 'valid_tag' ],
169 [ 'dropTable', 'tag_summary' ],
170 [ 'dropField', 'protected_titles', 'pt_reason', 'patch-drop-comment-fields.sql' ],
171
172 // KEEP THIS AT THE BOTTOM!!
173 [ 'doRebuildDuplicateFunction' ],
174
175 ];
176 }
177
183 protected function doNamespaceDefaults() {
184 $meta = $this->db->fieldInfo( 'page', 'page_namespace' );
185 if ( $meta->defaultValue() != null ) {
186 return;
187 }
188
189 $this->applyPatch(
190 'patch_namespace_defaults.sql',
191 false,
192 'Altering namespace fields with default value'
193 );
194 }
195
199 protected function doFKRenameDeferr() {
200 $meta = $this->db->query( '
201 SELECT COUNT(*) cnt
202 FROM user_constraints
203 WHERE constraint_type = \'R\' AND deferrable = \'DEFERRABLE\''
204 );
205 $row = $meta->fetchRow();
206 if ( $row && $row['cnt'] > 0 ) {
207 return;
208 }
209
210 $this->applyPatch( 'patch_fk_rename_deferred.sql', false, "Altering foreign keys ... " );
211 }
212
216 protected function doFunctions17() {
217 $this->applyPatch( 'patch_create_17_functions.sql', false, "Recreating functions" );
218 }
219
224 protected function doSchemaUpgrade17() {
225 // check if iwlinks table exists which was added in 1.17
226 if ( $this->db->tableExists( 'iwlinks' ) ) {
227 return;
228 }
229 $this->applyPatch( 'patch_16_17_schema_changes.sql', false, "Updating schema to 17" );
230 }
231
235 protected function doInsertPage0() {
236 $this->output( "Inserting page 0 if missing ... " );
237 $row = [
238 'page_id' => 0,
239 'page_namespace' => 0,
240 'page_title' => ' ',
241 'page_is_redirect' => 0,
242 'page_is_new' => 0,
243 'page_random' => 0,
244 'page_touched' => $this->db->timestamp(),
245 'page_latest' => 0,
246 'page_len' => 0
247 ];
248 $this->db->insert( 'page', $row, 'OracleUpdater:doInserPage0', [ 'IGNORE' ] );
249 $this->output( "ok\n" );
250 }
251
256 protected function doRemoveNotNullEmptyDefaults() {
257 $meta = $this->db->fieldInfo( 'categorylinks', 'cl_sortkey_prefix' );
258 if ( $meta->isNullable() ) {
259 return;
260 }
261 $this->applyPatch(
262 'patch_remove_not_null_empty_defs.sql',
263 false,
264 'Removing not null empty constraints'
265 );
266 }
267
268 protected function doRemoveNotNullEmptyDefaults2() {
269 $meta = $this->db->fieldInfo( 'ipblocks', 'ipb_by_text' );
270 if ( $meta->isNullable() ) {
271 return;
272 }
273 $this->applyPatch(
274 'patch_remove_not_null_empty_defs2.sql',
275 false,
276 'Removing not null empty constraints'
277 );
278 }
279
284 protected function doRecentchangesFK2Cascade() {
285 $meta = $this->db->query( 'SELECT 1 FROM all_constraints WHERE owner = \'' .
286 strtoupper( $this->db->getDBname() ) .
287 '\' AND constraint_name = \'' .
288 $this->db->tablePrefix() .
289 'RECENTCHANGES_FK2\' AND delete_rule = \'CASCADE\''
290 );
291 $row = $meta->fetchRow();
292 if ( $row ) {
293 return;
294 }
295
296 $this->applyPatch( 'patch_recentchanges_fk2_cascade.sql', false, "Altering RECENTCHANGES_FK2" );
297 }
298
302 protected function doPageRestrictionsPKUKFix() {
303 $this->output( "Altering PAGE_RESTRICTIONS keys ... " );
304
305 $meta = $this->db->query( 'SELECT column_name FROM all_cons_columns WHERE owner = \'' .
306 strtoupper( $this->db->getDBname() ) .
307 '\' AND constraint_name = \'' .
308 $this->db->tablePrefix() .
309 'PAGE_RESTRICTIONS_PK\' AND rownum = 1'
310 );
311 $row = $meta->fetchRow();
312 if ( $row['column_name'] == 'PR_ID' ) {
313 $this->output( "seems to be up to date.\n" );
314
315 return;
316 }
317
318 $this->applyPatch( 'patch-page_restrictions_pkuk_fix.sql', false );
319 $this->output( "ok\n" );
320 }
321
325 protected function doAutoIncrementTriggers() {
326 $this->output( "Adding auto-increment triggers ... " );
327
328 $meta = $this->db->query( 'SELECT trigger_name FROM user_triggers WHERE table_owner = \'' .
329 strtoupper( $this->db->getDBname() ) .
330 '\' AND trigger_name = \'' .
331 $this->db->tablePrefix() .
332 'PAGE_DEFAULT_PAGE_ID\''
333 );
334 $row = $meta->fetchRow();
335 if ( $row['column_name'] ) {
336 $this->output( "seems to be up to date.\n" );
337
338 return;
339 }
340
341 $this->applyPatch( 'patch-auto_increment_triggers.sql', false );
342
343 $this->output( "ok\n" );
344 }
345
349 protected function doRebuildDuplicateFunction() {
350 $this->applyPatch( 'patch_rebuild_dupfunc.sql', false, "Rebuilding duplicate function" );
351 }
352
358 public function doUpdates( array $what = [ 'core', 'extensions', 'purge', 'stats' ] ) {
359 parent::doUpdates( $what );
360
361 $this->db->query( 'BEGIN fill_wiki_info; END;' );
362 }
363
367 public function purgeCache() {
368 # We can't guarantee that the user will be able to use TRUNCATE,
369 # but we know that DELETE is available to us
370 $this->output( "Purging caches..." );
371 $this->db->delete( '/*Q*/' . $this->db->tableName( 'objectcache' ), '*', __METHOD__ );
372 $this->output( "done.\n" );
373 }
374}
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
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))