Marcel de Rooy
8c80c9b8e1
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>
203 lines
5.1 KiB
Perl
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;
|