Koha/misc/cronjobs/cleanup_database.pl
Marcel de Rooy 5c4f27bd0d Enhancement 5074 (Adding possibility to cleanup_database.pl to purge only older sessions) [UPDATED for master]
Currently, the misc/cronjobs script cleanup_database truncates the session table (deleting all records, including active sessions).
With an additional parameter sessdays, this behavior could be changed or (perhaps better) extended. If the parameter sessdays is passed along with a number of days, the script only deletes older session records. This is accomplished by examining the values of lasttime, atime or ctime in the record.
So, calling the script like:
  ./cleanup_database.pl -v -sessions -sessdays 7
will only delete sessions records older than 7 days. The "old style" call
  ./cleanup_database.pl -v -sessions
still works too and truncates the table as before.

Signed-off-by: Galen Charlton <gmcharlt@gmail.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
2010-11-02 11:02:15 +13:00

163 lines
4.8 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2009 PTFS, Inc.
#
# This file is part of Koha.
#
# Koha 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.
#
# Koha 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.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use strict;
use warnings;
BEGIN {
# find Koha's Perl modules
# test carefully before changing this
use FindBin;
eval { require "$FindBin::Bin/../kohalib.pl" };
}
use C4::Context;
use C4::Dates;
#use C4::Debug;
#use C4::Letters;
#use File::Spec;
use Getopt::Long;
sub usage {
print STDERR <<USAGE;
Usage: $0 [-h|--help] [--sessions] [--sessdays DAYS] [-v|--verbose] [--zebraqueue DAYS]
[-m|--mail]
-h --help prints this help message, and exits, ignoring all
other options
--sessions purge the sessions table. If you use this while users
are logged into Koha, they will have to reconnect.
--sessdays DAYS purge only sessions older than DAYS days (use together with sessions parameter).
-v --verbose will cause the script to give you a bit more information
about the run.
--zebraqueue DAYS purge completed entries from the zebraqueue from
more than DAYS days ago.
-m --mail purge the mail queue.
USAGE
exit $_[0];
}
my ($help, $sessions, $sess_days, $verbose, $zebraqueue_days, $mail);
GetOptions(
'h|help' => \$help,
'sessions' => \$sessions,
'sessdays:i' => \$sess_days,
'v|verbose' => \$verbose,
'm|mail' => \$mail,
'zebraqueue:i' => \$zebraqueue_days,
) || usage(1);
if ($help) {
usage(0);
}
if (!($sessions || $zebraqueue_days || $mail)){
print "You did not specify any cleanup work for the script to do.\n\n";
usage(1);
}
my $dbh = C4::Context->dbh();
my $query;
my $sth;
my $sth2;
my $count;
if ($sessions && !$sess_days) { #old behavior
if ($verbose){
print "Session purge triggered.\n";
$sth = $dbh->prepare("SELECT COUNT(*) FROM sessions");
$sth->execute() or die $dbh->errstr;
my @count_arr = $sth->fetchrow_array;
print "$count_arr[0] entries will be deleted.\n";
}
$sth = $dbh->prepare("TRUNCATE sessions");
$sth->execute() or die $dbh->errstr;;
if ($verbose){
print "Done with session purge.\n";
}
}
elsif($sessions && $sess_days>0) { #new behavior with number of days old
if ($verbose){
print "Session purge triggered with days>$sess_days.\n";
}
RemoveOldSessions();
if ($verbose){
print "Done with session purge with days>$sess_days.\n";
}
}
if ($zebraqueue_days){
$count = 0;
if ($verbose){
print "Zebraqueue purge triggered for $zebraqueue_days days.\n";
}
$sth = $dbh->prepare("SELECT id,biblio_auth_number,server,time FROM zebraqueue
WHERE done=1 and time < date_sub(curdate(), interval ? day)");
$sth->execute($zebraqueue_days) or die $dbh->errstr;
$sth2 = $dbh->prepare("DELETE FROM zebraqueue WHERE id=?");
while (my $record = $sth->fetchrow_hashref){
$sth2->execute($record->{id}) or die $dbh->errstr;
$count++;
}
if ($verbose){
print "$count records were deleted.\nDone with zebraqueue purge.\n";
}
}
if ($mail) {
if ($verbose) {
$sth = $dbh->prepare("SELECT COUNT(*) FROM message_queue");
$sth->execute() or die $dbh->errstr;
my @count_arr = $sth->fetchrow_array;
print "Deleting $count_arr[0] entries from the mail queue.\n";
}
$sth = $dbh->prepare("TRUNCATE message_queue");
$sth->execute() or $dbh->errstr;
print "Done with purging the mail queue.\n" if ($verbose);
}
exit(0);
sub RemoveOldSessions {
my ($id, $a_session, $limit, $lasttime);
$limit= time() - 24*3600*$sess_days;
$sth= $dbh->prepare("SELECT id, a_session FROM sessions");
$sth->execute or die $dbh->errstr;
$sth->bind_columns(\$id, \$a_session);
$sth2 = $dbh->prepare("DELETE FROM sessions WHERE id=?");
$count=0;
while ($sth->fetch) {
$lasttime=0;
if($a_session =~ /lasttime:\s+(\d+)/) {
$lasttime= $1;
}
elsif($a_session =~ /(ATIME|CTIME):\s+(\d+)/ ) {
$lasttime= $2;
}
if($lasttime && $lasttime < $limit) {
$sth2->execute($id) or die $dbh->errstr;
$count++;
}
}
if ($verbose){
print "$count sessions were deleted.\n";
}
}