Merge branch 'MDL-37114_23' of git://github.com/timhunt/moodle into MOODLE_23_STABLE
[moodle.git] / mod / data / db / upgrade.php
1 <?php
3 // This file keeps track of upgrades to
4 // the data module
5 //
6 // Sometimes, changes between versions involve
7 // alterations to database structures and other
8 // major things that may break installations.
9 //
10 // The upgrade function in this file will attempt
11 // to perform all the necessary actions to upgrade
12 // your older installation to the current version.
13 //
14 // If there's something it cannot do itself, it
15 // will tell you what you need to do.
16 //
17 // The commands in here will all be database-neutral,
18 // using the methods of database_manager class
19 //
20 // Please do not forget to use upgrade_set_timeout()
21 // before any action that may take longer time to finish.
23 function xmldb_data_upgrade($oldversion) {
24     global $CFG, $DB, $OUTPUT;
26     $dbman = $DB->get_manager();
29     // Moodle v2.2.0 release upgrade line
30     // Put any upgrade step following this
32     // Moodle v2.3.0 release upgrade line
33     // Put any upgrade step following this
35     if ($oldversion < 2012061701) {
36         // Check if there is a directory containing any old presets.
37         $olddatadir = $CFG->dataroot . '/data';
38         $oldpresetdir = "$olddatadir/preset";
39         if (file_exists($oldpresetdir)) {
40             // Get directory contents.
41             $userfolders = new DirectoryIterator($oldpresetdir);
42             // Store the system context, these are site wide presets.
43             $context = get_system_context();
44             // Create file storage object.
45             $fs = get_file_storage();
46             // Create array of accepted files.
47             $arracceptedfilenames = array('singletemplate.html', 'listtemplateheader.html', 'listtemplate.html',
48                                           'listtemplatefooter.html', 'addtemplate.html', 'rsstemplate.html',
49                                           'rsstitletemplate.html', 'csstemplate.css', 'jstemplate.js',
50                                           'asearchtemplate.html', 'preset.xml');
51             // Loop through all the folders, they should represent userids.
52             foreach ($userfolders as $userfolder) {
53                 // If it is a file, skip it.
54                 if ($userfolder->isFile()) {
55                     continue;
56                 }
57                 // The folder name should represent the user id.
58                 $userid = $userfolder->getFilename();
59                 // Skip if it is not numeric.
60                 if (!is_numeric($userid)) {
61                     continue;
62                 }
63                 // Skip if the number does not correspond to a user (does not matter if user was deleted).
64                 if (!$DB->record_exists('user', array('id' => $userid))) {
65                     continue;
66                 }
67                 // Open this folder.
68                 $presetfolders = new DirectoryIterator("$oldpresetdir/$userid");
69                 foreach ($presetfolders as $presetfolder) {
70                     // If it is a file, skip it.
71                     if ($presetfolder->isFile()) {
72                         continue;
73                     }
74                     // Save the name of the preset.
75                     $presetname = $presetfolder->getFilename();
76                     // Get the files in this preset folder.
77                     $presetfiles = new DirectoryIterator("$oldpresetdir/$userid/$presetname");
78                     // Now we want to get the contents of the presets.
79                     foreach ($presetfiles as $file) {
80                         // If it is not a file, skip it.
81                         if (!$file->isFile()) {
82                             continue;
83                         }
84                         // Set the filename.
85                         $filename = $file->getFilename();
86                         // If it is not in the array of accepted file names skip it.
87                         if (!in_array($filename, $arracceptedfilenames)) {
88                             continue;
89                         }
90                         // Store the full file path.
91                         $fullfilepath = "$oldpresetdir/$userid/$presetname/$filename";
92                         // Create file record.
93                         $filerecord = array('contextid' => $context->id,
94                                             'component' => 'mod_data',
95                                             'filearea' => 'site_presets',
96                                             'itemid' => 0,
97                                             'filename' => $filename,
98                                             'userid' => $userid);
99                         // Check to ensure it does not already exists in the file directory.
100                         if (!$fs->file_exists($context->id, 'mod_data', 'site_presets', 0, '/' . $presetfolder . '/', $filename)) {
101                             $filerecord['filepath'] = '/' . $presetfolder . '/';
102                         } else {
103                             $filerecord['filepath'] = '/' . $presetfolder . '_' . $userid . '_old/';
104                         }
105                         $fs->create_file_from_pathname($filerecord, $fullfilepath);
106                         // Remove the file.
107                         @unlink($fullfilepath);
108                     }
109                     // Remove the preset directory.
110                     @rmdir("$oldpresetdir/$userid/$presetname");
111                 }
112                 // Remove the user directory.
113                 @rmdir("$oldpresetdir/$userid");
114             }
115             // Remove the final directories.
116             @rmdir("$oldpresetdir");
117             @rmdir("$olddatadir");
118         }
120         upgrade_mod_savepoint(true, 2012061701, 'data');
121     }
123     return true;