X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FFile%2FBackend%2FFilesystem.pm;h=758142bf3ef71bfb8d1dac8251b83f28d5f19653;hb=b36fb0f412d2d2b43b8d98d787743cbe1fbf2540;hp=45254c9d55aa73cf54afb984d760c58b0931a090;hpb=c5dc49746255a5a49870a40981f3b782792e708c;p=kivitendo-erp.git diff --git a/SL/File/Backend/Filesystem.pm b/SL/File/Backend/Filesystem.pm index 45254c9d5..758142bf3 100644 --- a/SL/File/Backend/Filesystem.pm +++ b/SL/File/Backend/Filesystem.pm @@ -6,6 +6,7 @@ use parent qw(SL::File::Backend); use SL::DB::File; use File::Copy; use File::Slurp; +use File::stat; use File::Path qw(make_path); # @@ -15,16 +16,28 @@ use File::Path qw(make_path); sub delete { my ($self, %params) = @_; die "no dbfile in backend delete" unless $params{dbfile}; - my $backend_data = $params{dbfile}->backend_data; - $backend_data = 0 if $params{last}; - $backend_data = $params{dbfile}->backend_data-1 if $params{all_but_notlast}; - - if ($backend_data > 0 ) { - for my $version ( 1..$backend_data) { + my $last_version = $params{dbfile}->backend_data; + my $first_version = 1; + $last_version = 0 if $params{last}; + $last_version = $params{dbfile}->backend_data-1 if $params{all_but_notlast}; + $last_version = $params{version} if $params{version}; + $first_version = $params{version} if $params{version}; + + if ($last_version > 0 ) { + for my $version ( $first_version..$last_version) { my $file_path = $self->_filesystem_path($params{dbfile},$version); unlink($file_path); } - if ($params{all_but_notlast}) { + if ($params{version}) { + for my $version ( $last_version+1 .. $params{dbfile}->backend_data) { + my $from = $self->_filesystem_path($params{dbfile},$version); + my $to = $self->_filesystem_path($params{dbfile},$version - 1); + die "file not exists in backend delete" unless -f $from; + rename($from,$to); + } + $params{dbfile}->backend_data($params{dbfile}->backend_data-1); + } + elsif ($params{all_but_notlast}) { my $from = $self->_filesystem_path($params{dbfile},$params{dbfile}->backend_data); my $to = $self->_filesystem_path($params{dbfile},1); die "file not exists in backend delete" unless -f $from; @@ -32,6 +45,8 @@ sub delete { $params{dbfile}->backend_data(1); } else { $params{dbfile}->backend_data(0); + } + unless ($params{dbfile}->backend_data) { my $dir_path = $self->_filesystem_path($params{dbfile}); rmdir($dir_path); } @@ -52,6 +67,15 @@ sub save { die 'dbfile not exists' unless $params{dbfile}; my $dbfile = $params{dbfile}; die 'no file contents' unless $params{file_path} || $params{file_contents}; + + # Do not save and do not create a new version of the document if file size of last version is the same. + if ($dbfile->source eq 'created' && $self->get_version_count(dbfile => $dbfile)) { + my $new_file_size = $params{file_path} ? stat($params{file_path})->size : length($params{file_contents}); + my $last_file_size = stat($self->_filesystem_path($dbfile))->size; + + return 1 if $last_file_size == $new_file_size; + } + $dbfile->backend_data(0) unless $dbfile->backend_data; $dbfile->backend_data($dbfile->backend_data*1+1); $dbfile->save->load; @@ -65,25 +89,28 @@ sub save { print OUT $params{file_contents}; close(OUT); } + if ($params{mtime}) { + utime($params{mtime}, $params{mtime}, $tofile); + } return 1; } sub get_version_count { my ($self, %params) = @_; die "no dbfile" unless $params{dbfile}; - return $params{dbfile}->backend_data * 1; + return $params{dbfile}->backend_data//0 * 1; } sub get_mtime { my ($self, %params) = @_; die "no dbfile" unless $params{dbfile}; die "unknown version" if $params{version} && - ($params{version} < 0 || $params{version} > $params{dbfile}->backend_data) ; - my $path = $self->_filesystem_path($params{dbfile},$params{version}); + ($params{version} < 0 || $params{version} > $params{dbfile}->backend_data); + my $path = $self->_filesystem_path($params{dbfile}, $params{version}); + die "No file found at $path. Expected: $params{dbfile}{file_name}, file.id: $params{dbfile}{id}" if !-f $path; - my @st = stat($path); - my $dt = DateTime->from_epoch(epoch => $st[9])->clone(); + my $dt = DateTime->from_epoch(epoch => stat($path)->mtime, time_zone => $::locale->get_local_time_zone()->name, locale => $::lx_office_conf{system}->{language})->clone(); return $dt; } @@ -91,7 +118,9 @@ sub get_filepath { my ($self, %params) = @_; die "no dbfile" unless $params{dbfile}; my $path = $self->_filesystem_path($params{dbfile},$params{version}); - die "no file in backend get_filepath" if !-f $path; + + die "No file found at $path. Expected: $params{dbfile}{file_name}, file.id: $params{dbfile}{id}" if !-f $path; + return $path; } @@ -110,6 +139,34 @@ sub enabled { return 1; } +sub sync_from_backend { + my ($self, %params) = @_; + my @query = (file_type => $params{file_type}); + push @query, (file_name => $params{file_name}) if $params{file_name}; + push @query, (mime_type => $params{mime_type}) if $params{mime_type}; + push @query, (source => $params{source}) if $params{source}; + + my $sortby = $params{sort_by} || 'itime DESC,file_name ASC'; + + my @files = @{ SL::DB::Manager::File->get_all(query => [@query], sort_by => $sortby) }; + for (@files) { + $main::lxdebug->message(LXDebug->DEBUG2(), "file id=" . $_->id." version=".$_->backend_data); + my $newversion = $_->backend_data; + for my $version ( reverse 1 .. $_->backend_data ) { + my $path = $self->_filesystem_path($_, $version); + $main::lxdebug->message(LXDebug->DEBUG2(), "path=".$path." exists=".( -f $path?1:0)); + last if -f $path; + $newversion = $version - 1; + } + $main::lxdebug->message(LXDebug->DEBUG2(), "newversion=".$newversion." version=".$_->backend_data); + if ( $newversion < $_->backend_data ) { + $_->backend_data($newversion); + $_->save if $newversion > 0; + $_->delete if $newversion <= 0; + } + } + +} # # internals