From 31042081a22f4a71753f413598f90a0d836c310f Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Sat, 25 Jun 2005 14:24:08 +0000 Subject: [PATCH] perl script for deleting user accounts with no contributions, by Ralf Baechle --- maintenance/delete-idle-wiki-users.pl | 138 ++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 maintenance/delete-idle-wiki-users.pl diff --git a/maintenance/delete-idle-wiki-users.pl b/maintenance/delete-idle-wiki-users.pl new file mode 100644 index 0000000000..aef68ccd7e --- /dev/null +++ b/maintenance/delete-idle-wiki-users.pl @@ -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(); + -- 2.20.1