From 198924a60f15014d9e04326a0e75a61a0893c031 Mon Sep 17 00:00:00 2001 From: Barton Chittenden Date: Tue, 7 Jul 2015 13:07:52 -0700 Subject: [PATCH] Bug 14504: Add delete_items.pl: a command line batch deletion tool http://bugs.koha-community.org/show_bug.cgi?id=14504 Signed-off-by: Heather Braum --- misc/cronjobs/delete_items.pl | 158 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 misc/cronjobs/delete_items.pl diff --git a/misc/cronjobs/delete_items.pl b/misc/cronjobs/delete_items.pl new file mode 100755 index 0000000..c6683ff --- /dev/null +++ b/misc/cronjobs/delete_items.pl @@ -0,0 +1,158 @@ +#! /usr/bin/perl + +use warnings; +use strict; +use Getopt::Long; +use C4::Context; +use C4::Items; +use C4::Circulation; +use Modern::Perl; +use Pod::Usage; + +my $VERSION='1.0'; + +my $dbh = C4::Context->dbh(); + +my $query = { + target_items => q|SELECT itemnumber from items| +}; + +my $GLOBAL = { + query => $query + , sth => {} +}; + +my $OPTIONS = { + criteria => [] + , flags => { + verbose => '' + , commit => '' + , help => '' + , manual => '' + , version => '' + } +}; + +GetOptions( + 'criteria=s' => $OPTIONS->{criteria} + , 'v|verbose' => sub { $OPTIONS->{flags}->{verbose} = 1 } + , 'V|version' => sub { $OPTIONS->{flags}->{version} = 1 } + , 'h|help' => sub { $OPTIONS->{flags}->{help} = 1 } + , 'm|manual' => sub { $OPTIONS->{flags}->{manual} = 1 } + , 'c|commit' => sub { $OPTIONS->{flags}->{commit} = 1 } # aka DO-EET! + , 'dry-run' => sub { $OPTIONS->{flags}->{commit} = 0; + $OPTIONS->{flags}->{verbose} = 1 } +); + +my @criteria = @{ $OPTIONS->{criteria} }; + +if( $OPTIONS->{flags}->{version} ) { + say "$0 version $VERSION"; + exit; +} + +pod2usage( -verbose => 2 ) if $OPTIONS->{flags}->{manual}; +pod2usage(1) if ( $OPTIONS->{flags}->{help} || scalar @criteria == 0 ); + + + + +sub verbose { + say @_ if $OPTIONS->{flags}->{verbose}; +} + + +my $where_clause = ' where ' . join ( " and ", @criteria ); + +verbose "Where statement: $where_clause"; + +$GLOBAL->{sth}->{target_tiems} = $dbh->prepare( $query->{target_items} . $where_clause ); +$GLOBAL->{sth}->{target_tiems}->execute(); + +DELITEM: while ( my $item = $GLOBAL->{sth}->{target_tiems}->fetchrow_hashref() ) { + my $issue = GetOpenIssue( $item->{itemnumber} ); + if( defined $issue ) { + verbose "Cannot delete '$item->{itemnumber}' -- item is checked out." + } else { + verbose "Deleting '$item->{itemnumber}' "; + C4::Items::DelItem( { itemnumber => $item->{itemnumber} } ) if $OPTIONS->{flags}->{commit} ; + } +} + +=head1 NAME + + delete_items.pl - A batch item deletion tool, which generates a query against + the items database and deletes the items matching the + criteria specified in the command line arguments. + +=head1 SYNOPSIS + +delete_items.pl [--help|--manual|--version] + +delete_items.pl [--verbose] [--dry-run] --criteria "I" ... [--commit] + +=cut + +=head1 OPTIONS + +=over 8 + +=item B<--help> + +Show the brief help information. + +=item B<--manual> + +Read the manual, with examples. + +=item B<--version> + +Show the version number and exit. + +=item B<--verbose> + +Send the "WHERE" clause generated by the collected C<--criteria> +arguments, as well as items affected to Standard Out. + +=item B<--criteria> + +The C<--criteria> option may called multiple times. The following argument +must be a syntactically valid SQL statement which is part of the C +clause querying the items table. These are joined by C. + +=item B<--commit> + +No items will be deleted unless the C<--commit> flag is present. + +=item B<--dry-run> + +Disables C<--commit> flag and enables C<--verbose> flag. + +=back + +=cut + + +=head1 EXAMPLES + + The following is an example of this script: + + delete_items.pl --criteria "items.withdrawn ! 0" --criteria "items.withdrawn_on < $(date --date="13 month ago" --rfc-3339=date)" --commit + + delete_items.pl --criteria "itemlost >= '1'" --criteria "itemlost <='4'" --criteria "itemlost_on < '2014-04-28'" --commit + +=cut + + +=head1 DESCRIPTION + + This is a lightweight batch deletion tool for items, suitable for running in a cron job. + +=cut + + +=head1 AUTHOR + + Barton Chittenden + +=cut -- 2.1.4