perl script for deleting user accounts with no contributions, by Ralf Baechle
authorTim Starling <tstarling@users.mediawiki.org>
Sat, 25 Jun 2005 14:24:08 +0000 (14:24 +0000)
committerTim Starling <tstarling@users.mediawiki.org>
Sat, 25 Jun 2005 14:24:08 +0000 (14:24 +0000)
maintenance/delete-idle-wiki-users.pl [new file with mode: 0644]

diff --git a/maintenance/delete-idle-wiki-users.pl b/maintenance/delete-idle-wiki-users.pl
new file mode 100644 (file)
index 0000000..aef68cc
--- /dev/null
@@ -0,0 +1,138 @@
+#!/usr/bin/perl
+#
+# Nuke idle wiki accounts from the wiki's user database.
+#
+# Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
+#
+# This program is free software; you can redistribute  it and/or modify it
+# under  the terms of  the GNU General  Public License as published by the
+# Free Software Foundation;  either version 2 of the  License, or (at your
+# option) any later version.
+#
+# THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+# WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+# NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+# USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# You should have received a copy of the  GNU General Public License along
+# with this program; if not, write  to the Free Software Foundation, Inc.,
+# 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+my $database = "DBI:mysql:database=wikidb;host=localhost";
+my $dbuser   = "wikiuser";
+my $dbpasswd = "password";
+
+use strict;
+use DBI();
+
+my $verbose = 0;
+my $for_real = 1;
+
+sub do_db_op
+{
+       my ($dbh, $sql) = @_;
+
+       if ($verbose >= 3) {
+               print $sql . ";\n"
+       }
+
+       if ($for_real == 1) {
+               $dbh->do($sql);
+       }
+}
+
+sub undo_user
+{
+       my ($ref, $dbh, $sth, $killed);
+
+       # Connect to the database.
+       $dbh = DBI->connect($database, $dbuser, $dbpasswd, {RaiseError => 1});
+
+       $sth = $dbh->prepare("SELECT * FROM user");
+       $sth->execute();
+
+       $ref = $sth->fetchrow_hashref();
+
+       if ($sth->rows == 0) {
+               print "There is no user in this wiki.\n";
+               return;
+       }
+
+       while ($ref = $sth->fetchrow_hashref()) {
+               my ($user_id, $user_name, $cph, $oph, $edits);
+
+               $user_name = $ref->{user_name};
+               $user_id = $ref->{user_id};
+               if ($verbose >= 2) {
+                       print "Annihilating user " . $user_name .
+                             " has user_id " . $user_id . ".\n";
+               }
+
+               $cph = $dbh->prepare("SELECT * FROM cur where " .
+                               "cur_user = $user_id" .
+                               " AND " .
+                               "cur_user_text = " . $dbh->quote("$user_name"));
+               $cph->execute();
+
+               $oph = $dbh->prepare("SELECT * FROM old where " .
+                               "old_user = $user_id" .
+                               " AND " .
+                               "old_user_text = " . $dbh->quote("$user_name"));
+               $oph->execute();
+
+               $edits = $cph->rows + $oph->rows;
+
+               $cph->finish();
+               $oph->finish();
+
+               if ($edits == 0) {
+                       if ($verbose >= 2) {
+                               print "Keeping user " . $user_name .
+                                     ", user_id " . $user_id . ".\n";
+                       }
+
+                       do_db_op($dbh,
+                        "DELETE FROM user WHERE user_name = " .
+                        $dbh->quote("$user_name") .
+                        " AND " .
+                        "user_id = $user_id");
+
+                       $killed++;
+               }
+       }
+
+       $sth->finish();
+
+       $dbh->disconnect();
+
+       if ($verbose >= 1) {
+               print "Killed " . $killed . " users\n";
+       }
+}
+
+my (@users, $user, $this, $opts);
+
+@users = ();
+$opts = 1;
+
+foreach $this (@ARGV) {
+       if ($opts == 1 && $this eq '-v') {
+               $verbose++;
+       } elsif ($opts == 1 && $this eq '--verbose') {
+               $verbose = 1;
+       } elsif ($opts == 1 && $this eq '--') {
+               $opts = 0;
+       } else {
+               push(@users, $this);
+       }
+}
+
+undo_user();
+