* Plural for Bat-smg
[lhc/web/wiklou.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