Files
tyforum/util/util_replace.pl
2015-01-03 11:43:36 +01:00

102 lines
3.1 KiB
Perl

#!/usr/bin/perl
#------------------------------------------------------------------------------
# mwForum - Web-based discussion forum
# Copyright (c) 1999-2015 Markus Wichitill
#
# 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 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#------------------------------------------------------------------------------
# Search and replace text in mwForum database fields.
use strict;
use warnings;
no warnings qw(uninitialized);
# Imports
use Getopt::Std ();
require MwfMain;
# Get arguments
my %opts = ();
Getopt::Std::getopts('?hxiquf:t:c:', \%opts);
my $help = $opts{'?'} || $opts{h};
my $execute = $opts{x};
my $caseIns = $opts{i};
my $quiet = $opts{q};
my $mysqlUseResult = $opts{u};
my $forumId = $opts{f};
my $table = $opts{t} || 'posts';
my $col = $opts{c} || 'body';
my $txt1 = $ARGV[0];
my $txt2 = $ARGV[1];
usage() if $help || !length($txt1);
# Init
my ($m, $cfg, $lng) = MwfMain->newShell(forumId => $forumId);
$m->{dbh}{mysql_use_result} = 1 if $mysqlUseResult;
# Decode UTF-8 or treat as Latin1
utf8::decode($txt1) or utf8::upgrade($txt1);
utf8::decode($txt2) or utf8::upgrade($txt2);
# Search and replace
$m->dbBegin();
my $sum = 0;
my $switch = $caseIns ? "(?i)" : "";
my $updSth = $m->dbPrepare("
UPDATE $table SET $col = ? WHERE id = ?");
my $selSth = $m->fetchSth("
SELECT id, $col FROM $table");
my ($id, $body);
$selSth->bind_columns(\($id, $body));
while ($selSth->fetch()) {
utf8::decode($body);
my $num = $body =~ s!$switch$txt1!$txt2!go;
$sum += $num;
if ($execute && $num) {
# Replace
$m->dbExecute($updSth, $body, $id);
print "Replaced $num occurrences in #$id\n" if !$quiet;
}
else {
# Print occurrences only
print "Found $num occurrences in #$id\n" if !$quiet && $num;
}
}
$m->dbCommit();
# Print sum of occurrences
my $verb = $execute ? "Replaced" : "Found";
print "$verb $sum occurrences\n";
#------------------------------------------------------------------------------
sub usage
{
print
"\nSearch and replace in database fields.\n\n",
"Usage: util_replace.pl [-xiq] [-f forum] [-t table] [-c column] [--] searchExp [replaceExp]\n",
" -x Execute replacements. Otherwise, only number of occurrences is printed.\n",
" -i Search-expression is case-insensitive.\n",
" -q Quiet, print summary only.\n",
" -f Forum hostname or URL path when using a multi-forum installation.\n",
" -t Table name, default: posts.\n",
" -c Column name, default: body.\n",
"\nNotes:\n",
" - searchExp is a regular expression.\n",
" - replaceExp cannot use backreferences.\n",
" - Can only be used on tables with an 'id' field.\n",
" - Non-ASCII characters may not work if not passed as UTF-8 or Latin1.\n",
;
exit 1;
}