MDL-23885 fixed file api encapsulation and lowering number of direcories in zip files
[moodle.git] / backup / util / helper / backup_file_manager.class.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * @package    moodlecore
20  * @subpackage backup-helper
21  * @copyright  2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 /**
26  * Collection of helper functions to handle files
27  *
28  * This class implements various functions related with moodle storage
29  * handling (get file from storage, put it there...) and some others
30  * to use the zip/unzip facilities.
31  *
32  * Note: It's supposed that, some day, files implementation will offer
33  * those functions without needeing to know storage internals at all.
34  * That day, we'll move related functions here to proper file api ones.
35  *
36  * TODO: Finish phpdocs
37  */
38 class backup_file_manager {
40     /**
41      * Returns the full path to backup storage base dir
42      */
43     public static function get_backup_storage_base_dir($backupid) {
44         global $CFG;
46         return $CFG->dataroot . '/temp/backup/' . $backupid . '/files';
47     }
49     /**
50      * Given one file content hash, returns the path (relative to filedir)
51      * to the file.
52      */
53     public static function get_backup_content_file_location($contenthash) {
54         $l1 = $contenthash[0].$contenthash[1];
55         return "$l1/$contenthash";
56     }
58     /**
59      * Copy one file from moodle storage to backup storage
60      */
61     public static function copy_file_moodle2backup($backupid, $filerecorid) {
62         global $DB;
64         // Normalise param
65         if (!is_object($filerecorid)) {
66             $filerecorid = $DB->get_record('files', array('id' => $filerecorid));
67         }
69         // Directory, nothing to do
70         if ($filerecorid->filename === '.') {
71             return;
72         }
74         $fs = get_file_storage();
75         $file = new stored_file($fs, $filerecorid);
77         // Calculate source and target paths (use same subdirs strategy for both)
78         $targetfilepath = self::get_backup_storage_base_dir($backupid) . '/' .
79                           self::get_backup_content_file_location($filerecorid->contenthash);
81         // Create target dir if necessary
82         if (!file_exists(dirname($targetfilepath))) {
83             if (!check_dir_exists(dirname($targetfilepath), true, true)) {
84                 throw new backup_helper_exception('cannot_create_directory', dirname($targetfilepath));
85             }
86         }
88         // And copy the file (if doesn't exist already)
89         if (!file_exists($targetfilepath)) {
90             $file->copy_content_to($targetfilepath);
91         }
92     }
93 }