]> wagnertech.de Git - mfinanz.git/blob - sql/Pg-upgrade2/add_file_version.pl
restart apache2 in postinst
[mfinanz.git] / sql / Pg-upgrade2 / add_file_version.pl
1 # @tag: add_file_version
2 # @description: Versionen für files in extra Tabelle erzeugen
3 # @depends: release_3_8_0 file_version files_add_uid
4 package SL::DBUpgrade2::add_file_version;
5
6 use strict;
7 use utf8;
8
9 use SL::DB::File;
10 use SL::File::Backend::Webdav;
11
12 use SL::Locale::String qw(t8);
13 use SL::System::Process;
14
15 use UUID::Tiny ':std';
16
17 use parent qw(SL::DBUpgrade2::Base);
18
19 sub get_all_versions {
20   my ($dbfile) = @_;
21
22   my @versionobjs;
23   my $fileobj = SL::File::Object->new(
24     db_file => $dbfile,
25     id => $dbfile->id,
26     loaded => 1,
27   );
28
29   my $maxversion = $fileobj->backend eq 'Filesystem' ? $fileobj->db_file->backend_data : 1;
30   $fileobj->version($maxversion);
31   push @versionobjs, $fileobj;
32   if ($maxversion > 1) {
33     for my $version (2..$maxversion) {
34       my $clone = $fileobj->clone;
35       $clone->version($maxversion-$version+1);
36       $clone->newest(0);
37       push @versionobjs, $clone;
38     }
39   }
40
41   return @versionobjs;
42 }
43
44 sub get_filepath {
45   my ($file_obj) = @_;
46
47   my $file_id = $file_obj->id;
48   my $backend = $file_obj->backend
49     or die "File with ID '$file_id' has no backend specified.";
50   my $db_file   = $file_obj->db_file;
51   my $file_name = $file_obj->file_name;
52   my $version   = $file_obj->version;
53
54   my $path;
55   if ($backend eq 'Webdav') {
56     ($path) = $file_obj->backend_class->webdav_path($db_file);
57   } elsif ($backend eq 'Filesystem') {
58     # use filesystem with depth 3
59     my $iddir   = sprintf("%04d", $db_file->id % 1000);
60     my $base_path    = File::Spec->catdir($::lx_office_conf{paths}->{document_path}, $::auth->client->{id}, $iddir, $db_file->id);
61     $path = File::Spec->catdir($base_path, $db_file->id . '_' . $version);
62   } else {
63     die "Unknown backend '$backend' for file with ID '$file_id'.";
64   }
65
66   die "No file found at $path. Expected: $file_name, file.id: $file_id" if !-f $path;
67   return $path;
68 }
69
70 sub test_all_files_exists {
71   my @errors;
72
73   my $all_dbfiles = SL::DB::Manager::File->get_all;
74
75   foreach my $dbfile (@{$all_dbfiles}) {
76     my @versions = get_all_versions($dbfile);
77     foreach my $version (@versions) {
78       eval {
79         get_filepath($version);
80       } or do {
81         push @errors, $@;
82       }
83     }
84   }
85
86   return @errors;
87 }
88
89 sub print_errors {
90   my ($self, $errors) = @_;
91
92   print $::form->parse_html_template("dbupgrade/add_file_version_form", {
93       ERRORS => $errors
94     });
95 }
96
97 sub run {
98   my ($self) = @_;
99
100   my $query = <<SQL;
101 SELECT f.id
102 FROM files f
103 FULL OUTER JOIN file_versions fv ON (f.id = fv.file_id)
104 GROUP BY f.id
105 HAVING count(fv.file_id) = 0
106 SQL
107   my @file_ids_without_version = map {$_->[0]} @{$self->dbh->selectall_arrayref($query)};
108
109   unless ($::form->{delete_file_entries_of_missing_files}) {
110     my @errors = $self->test_all_files_exists();
111     if (scalar @errors) {
112       $self->print_errors(\@errors);
113       return 2;
114     }
115   }
116
117   SL::DB->client->with_transaction(sub {
118     my @errors;
119     my $all_dbfiles = SL::DB::Manager::File->get_all;
120     foreach my $dbfile (@$all_dbfiles) {
121       my $file_id = $dbfile->id;
122       my $backend = $dbfile->backend
123         or die "File with ID '$file_id' has no backend specified.";
124
125       my $doc_path;
126       if ($backend eq 'Webdav') {
127         $doc_path = SL::File::Backend::Webdav::get_rootdir();
128       } elsif ($backend eq 'Filesystem') {
129         $doc_path = $::lx_office_conf{paths}->{document_path};
130       } else {
131         die "Unknown backend '$backend' for file with ID '$file_id'.";
132       }
133
134       my @versions = get_all_versions($dbfile);
135       foreach my $version (@versions) {
136         my $tofile;
137         eval {
138           $tofile = get_filepath($version);
139         } or do {
140           next;
141         };
142         my $rel_file = $tofile;
143         $rel_file    =~ s/$doc_path//;
144
145         my $fv = SL::DB::FileVersion->new(
146           file_id       => $dbfile->id,
147           version       => $version->version || 1,
148           file_location => $rel_file,
149           doc_path      => $doc_path,
150           backend       => $dbfile->backend,
151           guid          => create_uuid_as_string(UUID_V4),
152         )->save;
153       }
154     }
155
156     my $query = <<SQL;
157 SELECT f.id
158 FROM files f
159 FULL OUTER JOIN file_versions fv ON (f.id = fv.file_id)
160 GROUP BY f.id
161 HAVING count(fv.file_id) = 0
162 SQL
163     my @file_ids_without_version =
164       map {$_->[0]}
165       @{SL::DB::->client->dbh->selectall_arrayref($query)};
166     if (scalar @file_ids_without_version) {
167       if ($::form->{delete_file_entries_of_missing_files}) {
168         SL::DB::Manager::File->delete_all(where => [id => \@file_ids_without_version]);
169       } else {
170         die "Files without versions: " . join(', ', @file_ids_without_version);
171       }
172     }
173
174     1;
175   }) or do { die SL::DB->client->error };
176
177   return 1;
178 }
179
180 1;