]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - scripts/delete_orphan_files.php
was renamed for security reasons
[quix0rs-gnu-social.git] / scripts / delete_orphan_files.php
1 #!/usr/bin/env php
2 <?php
3 /*
4  * StatusNet - a distributed open-source microblogging tool
5  * Copyright (C) 2008, 2009, StatusNet, Inc.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 define('INSTALLDIR', dirname(__DIR__));
22 define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public');
23
24 $shortoptions = 'y';
25 $longoptions = array('yes');
26
27 $helptext = <<<END_OF_HELP
28 delete_orphan_files.php [options]
29 Deletes all files and their File entries where there is no link to a
30 Notice entry. Good for cleaning up after user deletion or so where the
31 attached files weren't removed as well.
32
33   -y --yes      do not wait for confirmation
34
35 Will print '.' for each deleted File entry and 'x' if it also had a locally stored file.
36
37 WARNING WARNING WARNING, this will also delete Qvitter files such as background etc. since
38 they are not linked to notices (yet anyway).
39
40 END_OF_HELP;
41
42 require_once INSTALLDIR.'/scripts/commandline.inc.php';
43
44 print "Finding File entries that are not related to a Notice (or the notice has been deleted)...";
45 $file = new File();
46 $sql = 'SELECT file.* FROM file'.
47         ' LEFT JOIN file_to_post ON file_to_post.file_id=file.id'.
48         ' WHERE'.
49             ' NOT EXISTS (SELECT file_to_post.file_id FROM file_to_post WHERE file.id=file_to_post.file_id)'.
50             ' OR NOT EXISTS (SELECT notice.id FROM notice WHERE notice.id=file_to_post.post_id)'.
51             ' GROUP BY file.id;';
52
53 if ($file->query($sql) !== false) {
54     print " {$file->N} found.\n";
55     if ($file->N == 0) {
56         exit(0);
57     }
58 } else {
59     print "FAILED";
60     exit(1);
61 }
62
63 if (!have_option('y', 'yes')) {
64     print "About to delete the entries along with locally stored files. Are you sure? [y/N] ";
65     $response = fgets(STDIN);
66     if (strtolower(trim($response)) != 'y') {
67         print "Aborting.\n";
68         exit(0);
69     }
70 }
71
72 print "\nDeleting: ";
73 while ($file->fetch()) {
74     try {
75         $file->getPath();
76         $file->delete();
77         print 'x';
78     } catch (Exception $e) {
79         // either FileNotFound exception or ClientException
80         $file->delete();
81         print '.';
82     }
83 }
84 print "\nDONE.\n";