-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathrestorelib.php
276 lines (245 loc) · 11.2 KB
/
restorelib.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
<?php
/**
* This script contains all the functionality allowing SLOODLE data in Moodle to be restored from a backup.
*
* @package sloodle
*
*/
require_once($CFG->dirroot.'/mod/sloodle/init.php');
require_once(SLOODLE_LIBROOT.'/modules.php');
require_once(SLOODLE_LIBROOT.'/sloodle_session.php');
/**
* Restore everything from the given backup.
*/
function sloodle_restore_mods($mod, $restore)
{
global $CFG;
$status = true;
//Get record from backup_ids
$data = backup_getid($restore->backup_unique_code,$mod->modtype,$mod->id);
if ($data) {
// Get the XML backup data as an array
$info = $data->info;
// Build our SLOODLE DB record
$sloodle = new object();
$sloodle->course = $restore->course_id;
$sloodle->type = backup_todb($info['MOD']['#']['SUBTYPE']['0']['#']);
$sloodle->name = backup_todb($info['MOD']['#']['NAME']['0']['#']);
$sloodle->intro = backup_todb($info['MOD']['#']['INTRO']['0']['#']);
$sloodle->timecreated = backup_todb($info['MOD']['#']['TIMECREATED']['0']['#']);
$sloodle->timemodified = backup_todb($info['MOD']['#']['TIMEMODIFIED']['0']['#']);
$newid = sloodle_insert_record("sloodle", $sloodle);
// Inform the user what we are restoring
if (!defined('RESTORE_SILENTLY')) {
echo "<li>".get_string("modulename", "sloodle")." \"".format_string(stripslashes($sloodle->name),true)."\"</li>";
}
backup_flush(300);
if ($newid) {
// We have the newid, update backup_ids
backup_putid($restore->backup_unique_code, $mod->modtype, $mod->id, $newid);
// Should we restore userdata?
$includeuserdata = restore_userdata_selected($restore, 'sloodle', $mod->id);
// Attempt to get a SloodleModule object for this module sub-type
$dummysession = new SloodleSession(false); // We need to provide this to keep the module happy!
$moduleobj = sloodle_load_module($sloodle->type, $dummysession);
if ($moduleobj != false) {
// Attempt to restore this module's secondary data
if (!$moduleobj->restore($newid, $info['MOD']['#']['SECONDARYDATA']['0']['#'], $includeuserdata)) $status = false;
} else {
echo "<li>Failed to fully restore SLOODLE module type {$sloodle->type}. This type may not be available on your installation.</li>";
}
} else {
$status = false;
}
} else {
$status = false;
}
return $status;
}
/**
* Return content decoded to support interactivities linking. Every module
* should have its own. They are called automatically from
* sloodle_decode_content_links_caller() function in each module
* in the restore process.
* @todo This probably needs to be expanded to account for non-standard view URLs (notably those starting with parameter "_type")
*/
function sloodle_decode_content_links ($content,$restore) {
global $CFG;
$result = $content;
//Link to the list of chats
$searchstring='/\$@(SLOODLEINDEX)\*([0-9]+)@\$/';
//We look for it
preg_match_all($searchstring,$content,$foundset);
//If found, then we are going to look for its new id (in backup tables)
if ($foundset[0]) {
//print_object($foundset); //Debug
//Iterate over foundset[2]. They are the old_ids
foreach($foundset[2] as $old_id) {
//We get the needed variables here (course id)
$rec = backup_getid($restore->backup_unique_code,"course",$old_id);
//Personalize the searchstring
$searchstring='/\$@(SLOODLEINDEX)\*('.$old_id.')@\$/';
//If it is a link to this course, update the link to its new location
if($rec->new_id) {
//Now replace it
$result= preg_replace($searchstring,$CFG->wwwroot.'/mod/sloodle/index.php?id='.$rec->new_id,$result);
} else {
//It's a foreign link so leave it as original
$result= preg_replace($searchstring,$restore->original_wwwroot.'/mod/chat/index.php?id='.$old_id,$result);
}
}
}
//Link to chat view by moduleid
$searchstring='/\$@(SLOODLEVIEWBYID)\*([0-9]+)@\$/';
//We look for it
preg_match_all($searchstring,$result,$foundset);
//If found, then we are going to look for its new id (in backup tables)
if ($foundset[0]) {
//print_object($foundset); //Debug
//Iterate over foundset[2]. They are the old_ids
foreach($foundset[2] as $old_id) {
//We get the needed variables here (course_modules id)
$rec = backup_getid($restore->backup_unique_code,"course_modules",$old_id);
//Personalize the searchstring
$searchstring='/\$@(SLOODLEVIEWBYID)\*('.$old_id.')@\$/';
//If it is a link to this course, update the link to its new location
if($rec->new_id) {
//Now replace it
$result= preg_replace($searchstring,$CFG->wwwroot.'/mod/sloodle/view.php?id='.$rec->new_id,$result);
} else {
//It's a foreign link so leave it as original
$result= preg_replace($searchstring,$restore->original_wwwroot.'/mod/sloodle/view.php?id='.$old_id,$result);
}
}
}
return $result;
}
/**
* This function makes all the necessary calls to xxxx_decode_content_links()
* function in each module, passing them the desired contents to be decoded
* from backup format to destination site/course in order to mantain inter-activities
* working in the backup/restore process. It's called from restore_decode_content_links()
* function in restore process
*/
function sloodle_decode_content_links_caller($restore)
{
global $CFG;
$status = true;
$sloodles = sloodle_get_records_sql_params("
SELECT s.id, s.intro
FROM {$CFG->prefix}sloodle s
WHERE s.course = ?
", array($restore->course_id) );
if ($sloodles) {
$i = 0; //Counter to send some output to the browser to avoid timeouts
foreach ($sloodles as $sloodle) {
//Increment counter
$i++;
$content = $sloodle->intro;
$result = restore_decode_content_links_worker($content,$restore);
if ($result != $content) {
//Update record
$sloodle->intro = $result;
$status = sloodle_update_record("sloodle", $sloodle);
if (debugging()) {
if (!defined('RESTORE_SILENTLY')) {
echo '<br /><hr />'.s($content).'<br />changed to<br />'.s($result).'<hr /><br />';
}
}
}
//Do some output
if (($i+1) % 5 == 0) {
if (!defined('RESTORE_SILENTLY')) {
echo ".";
if (($i+1) % 100 == 0) {
echo "<br />";
}
}
backup_flush(300);
}
}
}
return $status;
}
/**
* This function returns a log record with all the necessay transformations done.
* It's used by restore_log_module() to restore modules log.
* This has not been modified for SLOODLE -- it comes from the chat module.
* SLOODLE doesn't really use logs correctly all the time, so this may not work anyway.
*/
function sloodle_restore_logs($restore,$log)
{
$status = false;
//Depending of the action, we recode different things
switch ($log->action) {
case "add":
if ($log->cmid) {
//Get the new_id of the module (to recode the info field)
$mod = backup_getid($restore->backup_unique_code,$log->module,$log->info);
if ($mod) {
$log->url = "view.php?id=".$log->cmid;
$log->info = $mod->new_id;
$status = true;
}
}
break;
case "update":
if ($log->cmid) {
//Get the new_id of the module (to recode the info field)
$mod = backup_getid($restore->backup_unique_code,$log->module,$log->info);
if ($mod) {
$log->url = "view.php?id=".$log->cmid;
$log->info = $mod->new_id;
$status = true;
}
}
break;
case "talk":
if ($log->cmid) {
//Get the new_id of the module (to recode the info field)
$mod = backup_getid($restore->backup_unique_code,$log->module,$log->info);
if ($mod) {
$log->url = "view.php?id=".$log->cmid;
$log->info = $mod->new_id;
$status = true;
}
}
break;
case "view":
if ($log->cmid) {
//Get the new_id of the module (to recode the info field)
$mod = backup_getid($restore->backup_unique_code,$log->module,$log->info);
if ($mod) {
$log->url = "view.php?id=".$log->cmid;
$log->info = $mod->new_id;
$status = true;
}
}
break;
case "view all":
$log->url = "index.php?id=".$log->course;
$status = true;
break;
case "report":
if ($log->cmid) {
//Get the new_id of the module (to recode the info field)
$mod = backup_getid($restore->backup_unique_code,$log->module,$log->info);
if ($mod) {
$log->url = "report.php?id=".$log->cmid;
$log->info = $mod->new_id;
$status = true;
}
}
break;
default:
if (!defined('RESTORE_SILENTLY')) {
echo "action (".$log->module."-".$log->action.") unknown. Not restored<br />"; //Debug
}
break;
}
if ($status) {
$status = $log;
}
return $status;
}
?>