From 9708138a86dd66e876bf3ff6e24dfdf1ae3d51d9 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Sun, 20 Apr 2014 22:46:39 +0000 Subject: [PATCH] Bug 9032: (follow-up) restore documented intepretation of virtualshelfshares.sharedate The sharedate column is documented as having the following meaning: "date of invitation or acceptance of invitation" This patch adjust the new list-sharing code to stick with that interpretation, as otherwise the column should have been renamed to 'invite_expiration_date' or the like. It also removes the "housekeeping" functionality from AddShare, as otherwise the routine should have been named AddShareAndDoOtherStuff. To prevent list shares from piling up, a new --list-invites flag has been added to cleanup_database.pl. The default crontabs have been modified to use the --list-invites flag by default. To test ------- [1] Make some list share invites and accept some, but now all of them. [2] Wait 14 days (or more reasonably, manually edit the sharedate values for the unaccepted shares to put them at least 14 days in the past.). [3] Run cleanup_database.pl --list-invites [4] Verify that accepted shares remain, as to share invites that have not yet reached more than 14 days of age. Signed-off-by: Galen Charlton --- C4/VirtualShelves.pm | 14 +++++--------- debian/koha-common.cron.daily | 2 +- misc/cronjobs/cleanup_database.pl | 22 ++++++++++++++++++++-- misc/cronjobs/crontab.example | 2 +- t/db_dependent/VirtualShelves.t | 5 ++--- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/C4/VirtualShelves.pm b/C4/VirtualShelves.pm index f5a67582c6..e44f1f2206 100644 --- a/C4/VirtualShelves.pm +++ b/C4/VirtualShelves.pm @@ -675,13 +675,9 @@ sub AddShare { my ($shelfnumber, $key)= @_; return if !$shelfnumber || !$key; - my $sql; my $dbh = C4::Context->dbh; - $sql="DELETE FROM virtualshelfshares WHERE sharedatedo($sql); - $sql="INSERT INTO virtualshelfshares (shelfnumber, invitekey, sharedate) VALUES (?, ?, ADDDATE(NOW(),?))"; - $dbh->do($sql, undef, ($shelfnumber, $key, SHARE_INVITATION_EXPIRY_DAYS)); + my $sql = "INSERT INTO virtualshelfshares (shelfnumber, invitekey, sharedate) VALUES (?, ?, NOW())"; + $dbh->do($sql, undef, ($shelfnumber, $key)); return !$dbh->err; } @@ -703,10 +699,10 @@ sub AcceptShare { my $dbh = C4::Context->dbh; $sql=" UPDATE virtualshelfshares -SET invitekey=NULL, sharedate=NULL, borrowernumber=? -WHERE shelfnumber=? AND invitekey=? AND sharedate>NOW() +SET invitekey=NULL, sharedate=NOW(), borrowernumber=? +WHERE shelfnumber=? AND invitekey=? AND (sharedate + INTERVAL ? DAY) >NOW() "; - my $i= $dbh->do($sql, undef, ($borrowernumber, $shelfnumber, $key)); + my $i= $dbh->do($sql, undef, ($borrowernumber, $shelfnumber, $key, SHARE_INVITATION_EXPIRY_DAYS)); return if !defined($i) || !$i || $i eq '0E0'; #not found return 1; } diff --git a/debian/koha-common.cron.daily b/debian/koha-common.cron.daily index ebc4916b67..2f899b08c2 100644 --- a/debian/koha-common.cron.daily +++ b/debian/koha-common.cron.daily @@ -20,7 +20,7 @@ koha-foreach --enabled /usr/share/koha/bin/cronjobs/fines.pl koha-foreach --enabled --email /usr/share/koha/bin/cronjobs/advance_notices.pl -c koha-foreach --enabled /usr/share/koha/bin/cronjobs/holds/cancel_expired_holds.pl >/dev/null 2>&1 koha-foreach --enabled /usr/share/koha/bin/cronjobs/services_throttle.pl > /dev/null 2>&1 -koha-foreach --enabled /usr/share/koha/bin/cronjobs/cleanup_database.pl --sessions --zebraqueue 10 +koha-foreach --enabled /usr/share/koha/bin/cronjobs/cleanup_database.pl --sessions --zebraqueue 10 --list-invites koha-foreach --enabled --noemail /usr/share/koha/bin/cronjobs/cleanup_database.pl --mail koha-foreach --enabled /usr/share/koha/bin/cronjobs/holds/auto_unsuspend_holds.pl > /dev/null 2>&1 koha-run-backups --days 2 --output /var/spool/koha diff --git a/misc/cronjobs/cleanup_database.pl b/misc/cronjobs/cleanup_database.pl index 965107b24b..fa27e9b7f2 100755 --- a/misc/cronjobs/cleanup_database.pl +++ b/misc/cronjobs/cleanup_database.pl @@ -25,6 +25,7 @@ use constant DEFAULT_MAIL_PURGEDAYS => 30; use constant DEFAULT_IMPORT_PURGEDAYS => 60; use constant DEFAULT_LOGS_PURGEDAYS => 180; use constant DEFAULT_SEARCHHISTORY_PURGEDAYS => 30; +use constant DEFAULT_SHARE_INVITATION_EXPIRY_DAYS => 14; BEGIN { # find Koha's Perl modules @@ -64,6 +65,8 @@ Usage: $0 [-h|--help] [--sessions] [--sessdays DAYS] [-v|--verbose] [--zebraqueu Defaults to 180 days if no days specified. --searchhistory DAYS purge entries from search_history older than DAYS days. Defaults to 30 days if no days specified + --list-invites DAYS purge (unaccepted) list share invites older than DAYS + days. Defaults to 14 days if no days specified. USAGE exit $_[0]; } @@ -71,7 +74,8 @@ USAGE my ( $help, $sessions, $sess_days, $verbose, $zebraqueue_days, $mail, $purge_merged, $pImport, - $pLogs, $pSearchhistory, $pZ3950 + $pLogs, $pSearchhistory, $pZ3950, + $pListShareInvites, ); GetOptions( @@ -86,6 +90,7 @@ GetOptions( 'z3950' => \$pZ3950, 'logs:i' => \$pLogs, 'searchhistory:i' => \$pSearchhistory, + 'list-invites:i' => \$pListShareInvites, ) || usage(1); $sessions=1 if $sess_days && $sess_days>0; @@ -96,6 +101,7 @@ $pLogs= DEFAULT_LOGS_PURGEDAYS if defined($pLogs) && $pLogs==0; $zebraqueue_days= DEFAULT_ZEBRAQ_PURGEDAYS if defined($zebraqueue_days) && $zebraqueue_days==0; $mail= DEFAULT_MAIL_PURGEDAYS if defined($mail) && $mail==0; $pSearchhistory= DEFAULT_SEARCHHISTORY_PURGEDAYS if defined($pSearchhistory) && $pSearchhistory==0; +$pListShareInvites = DEFAULT_SHARE_INVITATION_EXPIRY_DAYS if defined($pListShareInvites) && $pListShareInvites == 0; if ($help) { usage(0); @@ -108,7 +114,8 @@ unless ( $sessions || $pImport || $pLogs || $pSearchhistory - || $pZ3950 ) + || $pZ3950 + || $pListShareInvites ) { print "You did not specify any cleanup work for the script to do.\n\n"; usage(1); @@ -206,6 +213,17 @@ if($pSearchhistory) { print "Done with purging search_history.\n" if $verbose; } +if ($pListShareInvites) { + print "Purging unaccepted list share invites older than $pListShareInvites days.\n" if $verbose; + $sth = $dbh->prepare(" + DELETE FROM virtualshelfshares + WHERE invitekey IS NOT NULL + AND (sharedate + INTERVAL ? DAY) < NOW() + "); + $sth->execute($pListShareInvites); + print "Done with purging unaccepted list share invites.\n" if $verbose; +} + exit(0); sub RemoveOldSessions { diff --git a/misc/cronjobs/crontab.example b/misc/cronjobs/crontab.example index 7df5867f94..a937bf0020 100644 --- a/misc/cronjobs/crontab.example +++ b/misc/cronjobs/crontab.example @@ -81,7 +81,7 @@ KOHA_CRON_PATH = /usr/share/koha/bin/cronjobs 59 23 * * * __KOHA_USER__ $KOHA_CRON_PATH/services_throttle.pl > /dev/null 2>&1 # clean up databases nightly. Be sure not to run this with --sessions during a time when the system is in use! -16 1 * * * __KOHA_USER__ $KOHA_CRON_PATH/cleanup_database.pl --sessions --zebraqueue 10 +16 1 * * * __KOHA_USER__ $KOHA_CRON_PATH/cleanup_database.pl --sessions --zebraqueue 10 --list-invites # delete old purchase suggestions weekly. Replace XX with a number to define the age of suggestions to delete. @weekly __KOHA_USER__ $KOHA_CRON_PATH/purge_suggestions.pl --days XX > /dev/null 2>&1 diff --git a/t/db_dependent/VirtualShelves.t b/t/db_dependent/VirtualShelves.t index e4e25a7c88..dce9b8ebdd 100755 --- a/t/db_dependent/VirtualShelves.t +++ b/t/db_dependent/VirtualShelves.t @@ -179,9 +179,8 @@ for my $i (0..9){ #----------------------- TEST AddShare ----------------------------------------# -#first count the number of shares in the table; keep in mind that AddShare may -#delete some expired records while housekeeping -my $sql_sharecount="select count(*) from virtualshelfshares where DATEDIFF(sharedate, NOW())>0"; +#first count the number of shares in the table +my $sql_sharecount="select count(*) from virtualshelfshares"; my $cnt1=$dbh->selectrow_array($sql_sharecount); #try to add a share without shelfnumber: should fail -- 2.39.5