Koha/Koha/UploadedFiles.pm
Marcel de Rooy 8c80c9b8e1 Bug 18300: Delete missing upload records
If you deleted files from the upload directories manually, or you rebooted
with files in the temporary upload folder, or for some other reason have
records without a file, you may want to cleanup your records in the
uploaded_files table.

This patch adds the method delete_missing to Koha::UploadedFiles. It also
supports a keep_record parameter to do a dry run (count the missing files
first).

Also, we add an option --uploads-missing to cleanup_database. If you add
the flag 1 after this option, you will delete missing files. If you add the
flag 0 or only use the option, you will count missing files.

A subtest is added to Upload.t for delete_missing tests.

Test plan:
[1] Run t/db_dependent/Upload.t
[2] Upload a file and delete the file manually.
[3] Run cleanup_database.pl --uploads-missing
    It should report at least one missing file now.
    Check that the record has not been deleted.
[4] Run cleanup_database.pl --uploads-missing 1
    It should report that it removed at least one file.
    Check that the record is gone.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Mirko Tietgen <mirko@abunchofthings.net>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
2017-04-21 00:11:39 +00:00

203 lines
5.1 KiB
Perl

package Koha::UploadedFiles;
# Copyright Rijksmuseum 2016
#
# 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 3 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 Modern::Perl;
use C4::Koha;
use Koha::Database;
use Koha::DateUtils;
use Koha::UploadedFile;
use parent qw(Koha::Objects);
=head1 NAME
Koha::UploadedFiles - Koha::Objects class for uploaded files
=head1 SYNOPSIS
use Koha::UploadedFiles;
# get one upload
my $upload01 = Koha::UploadedFiles->find( $id );
# get some uploads
my @uploads = Koha::UploadedFiles->search_term({ term => '.mrc' });
# delete all uploads
Koha::UploadedFiles->delete;
=head1 DESCRIPTION
Allows regular CRUD operations on uploaded_files via Koha::Objects / DBIx.
The delete method also takes care of deleting files. The search_term method
provides a wrapper around search to look for a term in multiple columns.
=head1 METHODS
=head2 INSTANCE METHODS
=head3 delete
Delete uploaded files.
Parameter keep_file may be used to delete records, but keep files.
Returns the number of deleted records, 0E0 or -1 (Unknown).
Please note that the number of deleted records is not automatically the same
as the number of files.
=cut
sub delete {
my ( $self, $params ) = @_;
$self = Koha::UploadedFiles->new if !ref($self); # handle class call
# We use the individual delete on each resultset record
my $rv = 0;
while( my $row = $self->next ) {
my $delete= $row->delete( $params ); # 1, 0E0 or -1
$rv = ( $delete < 0 || $rv < 0 ) ? -1 : ( $rv + $delete );
}
return $rv==0 ? "0E0" : $rv;
}
=head3 delete_temporary
Delete_temporary is called by cleanup_database and only removes temporary
uploads older than [pref UploadPurgeTemporaryFilesDays] days.
It is possible to override the pref with the override_pref parameter.
Return value: see delete.
=cut
sub delete_temporary {
my ( $self, $params ) = @_;
my $days = C4::Context->preference('UploadPurgeTemporaryFilesDays');
if( exists $params->{override_pref} ) {
$days = $params->{override_pref};
} elsif( !defined($days) || $days eq '' ) { # allow 0, not NULL or ""
return "0E0";
}
my $dt = dt_from_string();
$dt->subtract( days => $days );
my $parser = Koha::Database->new->schema->storage->datetime_parser;
return $self->search({
permanent => [ undef, 0 ],
dtcreated => { '<' => $parser->format_datetime($dt) },
})->delete;
}
=head3 delete_missing
$cnt = Koha::UploadedFiles->delete_missing();
$cnt = Koha::UploadedFiles->delete_missing({ keep_record => 1 });
Deletes all records where the actual file is not found.
Supports a keep_record hash parameter to do a check only.
Returns the number of missing files (and/or deleted records).
=cut
sub delete_missing {
my ( $self, $params ) = @_;
$self = Koha::UploadedFiles->new if !ref($self); # handle class call
my $cnt = 0;
while( my $row = $self->next ) {
if( my $file = $row->full_path ) {
next if -e $file;
# We are passing keep_file since we already know that the file
# is missing and we do not want to see the warning
$row->delete({ keep_file => 1 }) if !$params->{keep_record};
$cnt++;
}
}
return $cnt;
}
=head3 search_term
Search_term allows you to pass a term to search in filename and hashvalue.
If you do not pass include_private, only public records are returned.
Is only a wrapper around Koha::Objects search. Has similar return value.
=cut
sub search_term {
my ( $self, $params ) = @_;
my $term = $params->{term} // '';
my %public = ();
if( !$params->{include_private} ) {
%public = ( public => 1 );
}
return $self->search(
[ { filename => { like => '%'.$term.'%' }, %public },
{ hashvalue => { like => '%'.$params->{term}.'%' }, %public } ],
{ order_by => { -asc => 'id' }},
);
}
=head2 CLASS METHODS
=head3 getCategories
getCategories returns a list of upload category codes and names
=cut
sub getCategories {
my ( $class ) = @_;
my $cats = C4::Koha::GetAuthorisedValues('UPLOAD');
[ map {{ code => $_->{authorised_value}, name => $_->{lib} }} @$cats ];
}
=head3 _type
Returns name of corresponding DBIC resultset
=cut
sub _type {
return 'UploadedFile';
}
=head3 object_class
Returns name of corresponding Koha object class
=cut
sub object_class {
return 'Koha::UploadedFile';
}
=head1 AUTHOR
Marcel de Rooy (Rijksmuseum)
Koha Development Team
=cut
1;