MediaWiki  master
resolveStubs.php
Go to the documentation of this file.
1 <?php
25 if ( !defined( 'MEDIAWIKI' ) ) {
26  $optionsWithArgs = [ 'm' ];
27 
28  require_once __DIR__ . '/../commandLine.inc';
29 
30  resolveStubs();
31 }
32 
37 function resolveStubs() {
38  $fname = 'resolveStubs';
39 
40  $dbr = wfGetDB( DB_REPLICA );
41  $maxID = $dbr->selectField( 'text', 'MAX(old_id)', '', $fname );
42  $blockSize = 10000;
43  $numBlocks = intval( $maxID / $blockSize ) + 1;
44 
45  for ( $b = 0; $b < $numBlocks; $b++ ) {
47 
48  printf( "%5.2f%%\n", $b / $numBlocks * 100 );
49  $start = intval( $maxID / $numBlocks ) * $b + 1;
50  $end = intval( $maxID / $numBlocks ) * ( $b + 1 );
51 
52  $res = $dbr->select( 'text', [ 'old_id', 'old_text', 'old_flags' ],
53  "old_id>=$start AND old_id<=$end " .
54  "AND old_flags LIKE '%object%' AND old_flags NOT LIKE '%external%' " .
55  'AND LOWER(CONVERT(LEFT(old_text,22) USING latin1)) = \'o:15:"historyblobstub"\'',
56  $fname );
57  foreach ( $res as $row ) {
58  resolveStub( $row->old_id, $row->old_text, $row->old_flags );
59  }
60  }
61  print "100%\n";
62 }
63 
70 function resolveStub( $id, $stubText, $flags ) {
71  $fname = 'resolveStub';
72 
73  $stub = unserialize( $stubText );
74  $flags = explode( ',', $flags );
75 
76  $dbr = wfGetDB( DB_REPLICA );
77  $dbw = wfGetDB( DB_MASTER );
78 
79  if ( strtolower( get_class( $stub ) ) !== 'historyblobstub' ) {
80  print "Error found object of class " . get_class( $stub ) . ", expecting historyblobstub\n";
81 
82  return;
83  }
84 
85  # Get the (maybe) external row
86  $externalRow = $dbr->selectRow(
87  'text',
88  [ 'old_text' ],
89  [
90  'old_id' => $stub->mOldId,
91  'old_flags' . $dbr->buildLike( $dbr->anyString(), 'external', $dbr->anyString() )
92  ],
93  $fname
94  );
95 
96  if ( !$externalRow ) {
97  # Object wasn't external
98  return;
99  }
100 
101  # Preserve the legacy encoding flag, but switch from object to external
102  if ( in_array( 'utf-8', $flags ) ) {
103  $newFlags = 'external,utf-8';
104  } else {
105  $newFlags = 'external';
106  }
107 
108  # Update the row
109  # print "oldid=$id\n";
110  $dbw->update( 'text',
111  [ /* SET */
112  'old_flags' => $newFlags,
113  'old_text' => $externalRow->old_text . '/' . $stub->mHash
114  ],
115  [ /* WHERE */
116  'old_id' => $id
117  ], $fname
118  );
119 }
resolveStub( $id, $stubText, $flags)
Resolve a history stub.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
global $optionsWithArgs
Definition: commandLine.inc:24
const DB_MASTER
Definition: defines.php:26
wfWaitForSlaves( $ifWritesSince=null, $wiki=false, $cluster=false, $timeout=null)
Waits for the replica DBs to catch up to the master position.
unserialize( $serialized)
if(!defined( 'MEDIAWIKI')) resolveStubs()
Convert history stubs that point to an external row to direct external pointers.
const DB_REPLICA
Definition: defines.php:25