MediaWiki  master
convertUserOptions.php
Go to the documentation of this file.
1 <?php
24 require_once __DIR__ . '/Maintenance.php';
25 
28 
35 
36  private $mConversionCount = 0;
37 
38  public function __construct() {
39  parent::__construct();
40  $this->addDescription( 'Convert user options from old to new system' );
41  $this->setBatchSize( 50 );
42  }
43 
44  public function execute() {
45  $this->output( "...batch conversion of user_options: " );
46  $id = 0;
47  $dbw = $this->getDB( DB_MASTER );
48 
49  if ( !$dbw->fieldExists( 'user', 'user_options', __METHOD__ ) ) {
50  $this->output( "nothing to migrate. " );
51 
52  return;
53  }
54  while ( $id !== null ) {
55  $res = $dbw->select( 'user',
56  [ 'user_id', 'user_options' ],
57  [
58  'user_id > ' . $dbw->addQuotes( $id ),
59  "user_options != " . $dbw->addQuotes( '' ),
60  ],
61  __METHOD__,
62  [
63  'ORDER BY' => 'user_id',
64  'LIMIT' => $this->getBatchSize(),
65  ]
66  );
67  $id = $this->convertOptionBatch( $res, $dbw );
68 
70 
71  if ( $id ) {
72  $this->output( "--Converted to ID $id\n" );
73  }
74  }
75  $this->output( "done. Converted " . $this->mConversionCount . " user records.\n" );
76  }
77 
83  private function convertOptionBatch( $res, $dbw ) {
84  $id = null;
85  foreach ( $res as $row ) {
86  $this->mConversionCount++;
87  $insertRows = [];
88  foreach ( explode( "\n", $row->user_options ) as $s ) {
89  $m = [];
90  if ( !preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) {
91  continue;
92  }
93 
94  // MW < 1.16 would save even default values. Filter them out
95  // here (as in User) to avoid adding many unnecessary rows.
96  $defaultOption = User::getDefaultOption( $m[1] );
97  if ( is_null( $defaultOption ) || $m[2] != $defaultOption ) {
98  $insertRows[] = [
99  'up_user' => $row->user_id,
100  'up_property' => $m[1],
101  'up_value' => $m[2],
102  ];
103  }
104  }
105 
106  if ( count( $insertRows ) ) {
107  $dbw->insert( 'user_properties', $insertRows, __METHOD__, [ 'IGNORE' ] );
108  }
109 
110  $dbw->update(
111  'user',
112  [ 'user_options' => '' ],
113  [ 'user_id' => $row->user_id ],
114  __METHOD__
115  );
116  $id = $row->user_id;
117  }
118 
119  return $id;
120  }
121 }
122 
123 $maintClass = ConvertUserOptions::class;
124 require_once RUN_MAINTENANCE_IF_MAIN;
const RUN_MAINTENANCE_IF_MAIN
Definition: Maintenance.php:39
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
Definition: Maintenance.php:86
Maintenance script to convert user options to the new user_properties table.
setBatchSize( $s=0)
Set the batch size.
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.
addDescription( $text)
Set the description text.
output( $out, $channel=null)
Throw some output to the user.
static getDefaultOption( $opt)
Get a given default option value.
Definition: User.php:1751
getBatchSize()
Returns batch size.
convertOptionBatch( $res, $dbw)
getDB( $db, $groups=[], $dbDomain=false)
Returns a database to be used by current maintenance script.