]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - maintenance/initEditCount.php
MediaWiki 1.11.0
[autoinstallsdev/mediawiki.git] / maintenance / initEditCount.php
1 <?php
2
3 require_once "commandLine.inc";
4
5 if( isset( $options['help'] ) ) {
6         die( "Batch-recalculate user_editcount fields from the revision table.
7 Options:
8   --quick        Force the update to be done in a single query.
9   --background   Force replication-friendly mode; may be inefficient but
10                  avoids locking tables or lagging slaves with large updates;
11                  calculates counts on a slave if possible.
12
13 Background mode will be automatically used if the server is MySQL 4.0
14 (which does not support subqueries) or if multiple servers are listed
15 in \$wgDBservers, usually indicating a replication environment.
16
17 ");
18 }
19 $dbw = wfGetDB( DB_MASTER );
20 $user = $dbw->tableName( 'user' );
21 $revision = $dbw->tableName( 'revision' );
22
23 $dbver = $dbw->getServerVersion();
24
25 // Autodetect mode...
26 $backgroundMode = count( $wgDBservers ) > 1 ||
27         ($dbw instanceof DatabaseMySql && version_compare( $dbver, '4.1' ) < 0);
28
29 if( isset( $options['background'] ) ) {
30         $backgroundMode = true;
31 } elseif( isset( $options['quick'] ) ) {
32         $backgroundMode = false;
33 }
34
35 if( $backgroundMode ) {
36         echo "Using replication-friendly background mode...\n";
37         
38         $dbr = wfGetDB( DB_SLAVE );
39         $chunkSize = 100;
40         $lastUser = $dbr->selectField( 'user', 'MAX(user_id)', '', __FUNCTION__ );
41         
42         $start = microtime( true );
43         $migrated = 0;
44         for( $min = 0; $min <= $lastUser; $min += $chunkSize ) {
45                 $max = $min + $chunkSize;
46                 $result = $dbr->query(
47                         "SELECT
48                                 user_id,
49                                 COUNT(rev_user) AS user_editcount
50                         FROM $user
51                         LEFT OUTER JOIN $revision ON user_id=rev_user
52                         WHERE user_id > $min AND user_id <= $max
53                         GROUP BY user_id",
54                         __FUNCTION__ );
55                 
56                 while( $row = $dbr->fetchObject( $result ) ) {
57                         $dbw->update( 'user',
58                                 array( 'user_editcount' => $row->user_editcount ),
59                                 array( 'user_id' => $row->user_id ),
60                                 __FUNCTION__ );
61                         ++$migrated;
62                 }
63                 $dbr->freeResult( $result );
64                 
65                 $delta = microtime( true ) - $start;
66                 $rate = ($delta == 0.0) ? 0.0 : $migrated / $delta;
67                 printf( "%s %d (%0.1f%%) done in %0.1f secs (%0.3f accounts/sec).\n",
68                         $wgDBname,
69                         $migrated,
70                         min( $max, $lastUser ) / $lastUser * 100.0,
71                         $delta,
72                         $rate );
73                 
74                 wfWaitForSlaves( 10 );
75         }
76 } else {
77         // Subselect should work on modern MySQLs etc
78         echo "Using single-query mode...\n";
79         $sql = "UPDATE $user SET user_editcount=(SELECT COUNT(*) FROM $revision WHERE rev_user=user_id)";
80         $dbw->query( $sql );
81 }
82
83 echo "Done!\n";
84
85