--- /dev/null
+<?php
+
+/**
+ * Support functions for the removeUnusedAccounts script
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+# Count the number of edits the specified user has made
+function CountEdits( $user_id ) {
+ # We've *got* to pull this stuff off the master. If the user *has* made an edit, but it hasn't
+ # been replicated to the slaves yet, we'll end up falsely marking them as inactive. This could
+ # (and usually would) lead to their deletion.
+ $dbw =& wfGetDB( DB_MASTER );
+ $sql = 'SELECT COUNT(rev_id) AS count FROM ' . $dbw->tableName( 'revision' ) . ' WHERE rev_user = ' . $user_id;
+ $res = $dbw->query( $sql );
+ $row = $dbw->fetchObject( $res );
+ return( $row->count );
+}
+
+# Return an array containing all valid user IDs
+function GetUsers() {
+ # We're safe enough pulling this off a slave
+ $dbr =& wfGetDB( DB_SLAVE );
+ $sql = 'SELECT user_id FROM ' . $dbr->tableName( 'user' );
+ $res = $dbr->query( $sql );
+ $users = array();
+ while( $row = $dbr->fetchObject( $res ) ) {
+ $users[] = $row->user_id;
+ }
+ return( $users );
+}
+
+# Delete one or more users
+function DeleteUsers( $users ) {
+ # Need a master, obviously
+ $dbw =& wfGetDB( DB_MASTER );
+ # We'll do it all in one go, for speed
+ $dbw->begin();
+ $table = $dbw->tableName( 'user' );
+ foreach( $users as $user ) {
+ $dbw->query( 'DELETE FROM ' . $table . ' WHERE user_id = ' . $user . ' LIMIT 1' );
+ }
+ $dbw->commit();
+}
+
+?>
\ No newline at end of file
--- /dev/null
+<?php
+
+/**
+ * Remove unused user accounts from the database
+ * An unused account is one which has made no edits
+ *
+ * @package MediaWiki
+ * @subpackage Maintenance
+ * @author Rob Church <robchur@gmail.com>
+ */
+
+require_once( 'commandLine.inc' );
+require_once( 'removeUnusedAccounts.inc' );
+echo( "REMOVE UNUSED ACCOUNTS\nThis script will delete all users who have made no edits.\n\n" );
+
+$count = 0;
+$del = array();
+
+# Right, who needs deleting?
+$users = GetUsers();
+echo( "Found " . count( $users ) . " accounts.\n" );
+echo( "Locating inactive users..." );
+foreach( $users as $user ) {
+ if( $user != 1 ) { # Don't *touch* the first user account, ever
+ if( CountEdits( $user ) == 0 ) {
+ # User has no edits, mark them for deletion
+ $del[] = $user;
+ $count++;
+ }
+ }
+}
+echo( "done.\n" );
+
+# Purge the inactive accounts we found
+echo( $count . " inactive accounts found. Deleting..." );
+DeleteUsers( $del );
+echo( "done.\n" );
+
+# We're done
+echo( "Complete.\n" );
+
+?>
\ No newline at end of file