Added support for timestart and timeend (user_teachers table) and
[moodle.git] / backup / backuplib.php
CommitLineData
01a16f7e 1<?PHP //$Id$
2 //This file contains all the function needed in the backup utility
3 //except the mod-related funtions that are into every backuplib.php inside
4 //every mod directory
5
6 //Insert necessary category ids to backup_ids table
7 function insert_category_ids ($course,$backup_unique_code) {
8 global $CFG;
9 $status = true;
10 $status = execute_sql("INSERT INTO {$CFG->prefix}backup_ids
11 (backup_code, table_name, old_id)
12 SELECT DISTINCT '$backup_unique_code','quiz_categories',t.category
13 FROM {$CFG->prefix}quiz_questions t,
14 {$CFG->prefix}quiz_question_grades g,
15 {$CFG->prefix}quiz q
16 WHERE q.course = '$course' AND
17 g.quiz = q.id AND
18 g.question = t.id",false);
19 return $status;
20 }
21
22 //Delete category ids from backup_ids table
23 function delete_category_ids ($backup_unique_code) {
24 global $CFG;
25 $status = true;
26 $status = execute_sql("DELETE FROM {$CFG->prefix}backup_ids
27 WHERE backup_code = '$backup_unique_code'",false);
28 return $status;
29 }
30
31 //Calculate the number of users to backup and put their ids in backup_ids
32 //Return an array of info (name,value)
33 function user_check_backup($course,$backup_unique_code,$backup_users) {
34 //$backup_users=0-->all
0611af10 35 // 1-->course (needed + enrolled)
fa96ad2f 36 // 2-->none
01a16f7e 37
38 global $CFG;
39 global $db;
40
41 $count_users = 0;
fa96ad2f 42
43 //If we've selected none, simply return 0
44 if ($backup_users == 0 or $backup_users == 1) {
01a16f7e 45
fa96ad2f 46 //Calculate needed users (calling every xxxx_get_participants function + scales users)
47 $needed_users = backup_get_needed_users($course);
0611af10 48
fa96ad2f 49 //Calculate enrolled users (students + teachers)
50 $enrolled_users = backup_get_enrolled_users($course);
0611af10 51
fa96ad2f 52 //Calculate all users (every record in users table)
53 $all_users = backup_get_all_users();
0611af10 54
fa96ad2f 55 //Calculate course users (needed + enrolled)
56 //First, needed
57 $course_users = $needed_users;
0611af10 58
fa96ad2f 59 //Now, enrolled
60 if ($enrolled_users) {
61 foreach ($enrolled_users as $enrolled_user) {
62 $course_users[$enrolled_user->id]->id = $enrolled_user->id;
63 }
0611af10 64 }
0611af10 65
fa96ad2f 66 //Now, depending of parameters, create $backupable_users
67 if ($backup_users == 0) {
68 $backupable_users = $all_users;
69 } else {
70 $backupable_users = $course_users;
71 }
0611af10 72
fa96ad2f 73 //If we have backupable users
74 if ($backupable_users) {
75 //Iterate over users putting their roles
76 foreach ($backupable_users as $backupable_user) {
77 $backupable_user->info = "";
78 //Is Admin in tables (not is_admin()) !!
79 if (record_exists("user_admins","userid",$backupable_user->id)) {
80 $backupable_user->info .= "admin";
81 }
82 //Is Course Creator in tables (not is_coursecreator()) !!
83 if (record_exists("user_coursecreators","userid",$backupable_user->id)) {
84 $backupable_user->info .= "coursecreator";
85 }
86 //Is Teacher in tables (not is_teacher()) !!
87 if (record_exists("user_teachers","course",$course,"userid",$backupable_user->id)) {
88 $backupable_user->info .= "teacher";
89 }
90 //Is Student in tables (not is_student()) !!
91 if (record_exists("user_students","course",$course,"userid",$backupable_user->id)) {
92 $backupable_user->info .= "student";
93 }
94 //Is needed user (exists in needed_users)
95 if (isset($needed_users[$backupable_user->id])) {
96 $backupable_user->info .= "needed";
97 }
98 //Now create the backup_id record
99 $backupids_rec->backup_code = $backup_unique_code;
100 $backupids_rec->table_name = "user";
101 $backupids_rec->old_id = $backupable_user->id;
102 $backupids_rec->info = $backupable_user->info;
103
104 //Insert the record id. backup_users decide it.
105 //When all users
106 $status = insert_record("backup_ids",$backupids_rec,false,"backup_code");
107 $count_users++;
fb14b23b 108 }
fa96ad2f 109 //Do some output
110 backup_flush(30);
01a16f7e 111 }
112 }
fa96ad2f 113
01a16f7e 114 //Prepare Info
115 //Gets the user data
116 $info[0][0] = get_string("users");
117 $info[0][1] = $count_users;
118
119 return $info;
120 }
121
0611af10 122 //Returns every needed user (participant) in a course
41198449 123 //It uses the xxxx_get_participants() function
124 //plus users needed to backup scales.
0611af10 125 //WARNING: It returns only NEEDED users, not every
126 // every student and teacher in the course, so it
127 //must be merged with backup_get_enrrolled_users !!
128
129 function backup_get_needed_users ($courseid) {
130
0043ddbb 131 global $CFG, $THEME;
0611af10 132
133 $result = false;
134
135 $course_modules = get_records_sql ("SELECT cm.id, m.name, cm.instance
136 FROM {$CFG->prefix}modules m,
137 {$CFG->prefix}course_modules cm
138 WHERE m.id = cm.module and
139 cm.course = '$courseid'");
140
141 if ($course_modules) {
142 //Iterate over each module
143 foreach ($course_modules as $course_module) {
144 $modlib = "$CFG->dirroot/mod/$course_module->name/lib.php";
145 $modgetparticipants = $course_module->name."_get_participants";
146 if (file_exists($modlib)) {
147 include_once($modlib);
148 if (function_exists($modgetparticipants)) {
149 $module_participants = $modgetparticipants($course_module->instance);
150 //Add them to result
151 if ($module_participants) {
152 foreach ($module_participants as $module_participant) {
153 $result[$module_participant->id]->id = $module_participant->id;
154 }
155 }
156 }
157 }
158 }
159 }
41198449 160
161 //Now, add scales users (from site and course scales)
162 //Get users
163 $scaleusers = get_records_sql("SELECT DISTINCT userid,userid
164 FROM {$CFG->prefix}scale
165 WHERE courseid = '0' or courseid = '$courseid'");
166 //Add scale users to results
167 if ($scaleusers) {
168 foreach ($scaleusers as $scaleuser) {
169 //If userid != 0
170 if ($scaleuser->userid != 0) {
171 $result[$scaleuser->userid]->id = $scaleuser->userid;
172 }
173 }
174 }
0611af10 175
176 return $result;
177
178 }
179
180 //Returns every enrolled user (student and teacher) in a course
181
182 function backup_get_enrolled_users ($courseid) {
183
184 global $CFG;
185
186 $result = false;
187
188 //Get teachers
189 $teachers = get_records_sql("SELECT DISTINCT userid,userid
190 FROM {$CFG->prefix}user_teachers
191 WHERE course = '$courseid'");
192 //Get students
193 $students = get_records_sql("SELECT DISTINCT userid,userid
194 FROM {$CFG->prefix}user_students
195 WHERE course = '$courseid'");
196 //Add teachers
197 if ($teachers) {
198 foreach ($teachers as $teacher) {
199 $result[$teacher->userid]->id = $teacher->userid;
200 }
201 }
202 //Add students
203 if ($students) {
204 foreach ($students as $student) {
205 $result[$student->userid]->id = $student->userid;
206 }
207 }
208
209 return $result;
210 }
211
212 //Returns all users (every record in users table)
213
214 function backup_get_all_users() {
215
216 global $CFG;
217
218 $result = false;
219
220 //Get users
221 $users = get_records_sql("SELECT DISTINCT id,id
222 FROM {$CFG->prefix}user");
223 //Add users
224 if ($users) {
225 foreach ($users as $user) {
226 $result[$user->id]->id = $user->id;
227 }
228 }
229
230 return $result;
231 }
232
01a16f7e 233 //Calculate the number of log entries to backup
234 //Return an array of info (name,value)
235 function log_check_backup($course) {
236
237 global $CFG;
238
4f39d4fb 239 //Now execute the count
240 $ids = count_records("log","course",$course);
01a16f7e 241
01a16f7e 242 //Gets the user data
243 $info[0][0] = get_string("logs");
244 if ($ids) {
4f39d4fb 245 $info[0][1] = $ids;
01a16f7e 246 } else {
247 $info[0][1] = 0;
248 }
249
250 return $info;
251 }
252
253 //Calculate the number of user files to backup
254 //Under $CFG->dataroot/users
255 //and put them (their path) in backup_ids
256 //Return an array of info (name,value)
257 function user_files_check_backup($course,$backup_unique_code) {
258
259 global $CFG;
260
261 $rootdir = $CFG->dataroot."/users";
262 //Check if directory exists
263 if (is_dir($rootdir)) {
264 $coursedirs = get_directory_list($rootdir);
265 foreach ($coursedirs as $dir) {
266 //Extracts user id from file path
267 $tok = strtok($dir,"/");
268 if ($tok) {
269 $userid = $tok;
270 } else {
271 $tok = "";
272 }
fa383df9 273 //Look it is a backupable user
274 $data = get_record ("backup_ids","backup_code","$backup_unique_code",
275 "table_name","user",
276 "old_id",$userid);
277 if ($data) {
278 //Insert them into backup_files
279 $status = execute_sql("INSERT INTO {$CFG->prefix}backup_files
280 (backup_code, file_type, path, old_id)
281 VALUES
282 ('$backup_unique_code','user','$dir','$userid')",false);
283 }
284 //Do some output
285 backup_flush(30);
01a16f7e 286 }
287 }
288
289 //Now execute the select
290 $ids = get_records_sql("SELECT DISTINCT b.path, b.old_id
291 FROM {$CFG->prefix}backup_files b
292 WHERE backup_code = '$backup_unique_code' AND
293 file_type = 'user'");
294 //Gets the user data
295 $info[0][0] = get_string("files");
296 if ($ids) {
297 $info[0][1] = count($ids);
298 } else {
299 $info[0][1] = 0;
300 }
301
302 return $info;
303 }
304
305 //Calculate the number of course files to backup
8f7ab281 306 //under $CFG->dataroot/$course, except $CFG->moddata, and backupdata
01a16f7e 307 //and put them (their path) in backup_ids
308 //Return an array of info (name,value)
309 function course_files_check_backup($course,$backup_unique_code) {
310
311 global $CFG;
312
313 $rootdir = $CFG->dataroot."/$course";
314 //Check if directory exists
315 if (is_dir($rootdir)) {
316 $coursedirs = get_directory_list($rootdir,$CFG->moddata);
8f7ab281 317 $backupdata_dir = "backupdata";
01a16f7e 318 foreach ($coursedirs as $dir) {
8f7ab281 319 //Check it isn't backupdata_dir
320 if (strpos($dir,$backupdata_dir)!==0) {
01a16f7e 321 //Insert them into backup_files
322 $status = execute_sql("INSERT INTO {$CFG->prefix}backup_files
323 (backup_code, file_type, path)
324 VALUES
325 ('$backup_unique_code','course','$dir')",false);
326 }
e487376a 327 //Do some output
328 backup_flush(30);
01a16f7e 329 }
330 }
331
332 //Now execute the select
333 $ids = get_records_sql("SELECT DISTINCT b.path, b.old_id
334 FROM {$CFG->prefix}backup_files b
335 WHERE backup_code = '$backup_unique_code' AND
336 file_type = 'course'");
337 //Gets the user data
338 $info[0][0] = get_string("files");
339 if ($ids) {
340 $info[0][1] = count($ids);
341 } else {
342 $info[0][1] = 0;
343 }
344
345 return $info;
346 }
347
348 //Function to check and create the needed moddata dir to
349 //save all the mod backup files. We always name it moddata
350 //to be able to restore it, but in restore we check for
351 //$CFG->moddata !!
352 function check_and_create_moddata_dir($backup_unique_code) {
353
354 global $CFG;
355
356 $status = check_dir_exists($CFG->dataroot."/temp/backup/".$backup_unique_code."/moddata",true);
357
358 return $status;
359 }
360
361 //Function to check and create the "user_files" dir to
362 //save all the user files we need from "users" dir
363 function check_and_create_user_files_dir($backup_unique_code) {
364
365 global $CFG;
366
367 $status = check_dir_exists($CFG->dataroot."/temp/backup/".$backup_unique_code."/user_files",true);
368
369 return $status;
370 }
371
372 //Function to check and create the "course_files" dir to
373 //save all the course files we need from "CFG->datadir/course" dir
374 function check_and_create_course_files_dir($backup_unique_code) {
375
376 global $CFG;
377
378 $status = check_dir_exists($CFG->dataroot."/temp/backup/".$backup_unique_code."/course_files",true);
379
380 return $status;
381 }
382
383 //Function to create, open and write header of the xml file
384 function backup_open_xml($backup_unique_code) {
385
386 global $CFG;
387
388 $status = true;
389
390 //Open for writing
391
392 $file = $CFG->dataroot."/temp/backup/".$backup_unique_code."/moodle.xml";
393 $backup_file = fopen($file,"w");
394 //Writes the header
395 $status = fwrite ($backup_file,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
396 if ($status) {
397 $status = fwrite ($backup_file,start_tag("MOODLE_BACKUP",0,true));
398 }
399 if ($status) {
400 return $backup_file;
401 } else {
402 return false;
403 }
404 }
405
406 //Close the file
407 function backup_close_xml($backup_file) {
408 $status = fwrite ($backup_file,end_tag("MOODLE_BACKUP",0,true));
409 return fclose($backup_file);
410 }
411
412 //Return the xml start tag
413 function start_tag($tag,$level=0,$endline=false) {
414 if ($endline) {
415 $endchar = "\n";
416 } else {
417 $endchar = "";
418 }
419 return str_repeat(" ",$level*2)."<".strtoupper($tag).">".$endchar;
420 }
421
422 //Return the xml end tag
423 function end_tag($tag,$level=0,$endline=true) {
424 if ($endline) {
425 $endchar = "\n";
426 } else {
427 $endchar = "";
428 }
429 return str_repeat(" ",$level*2)."</".strtoupper($tag).">".$endchar;
430 }
431
432 //Return the start tag, the contents and the end tag
433 function full_tag($tag,$level=0,$endline=true,$content,$to_utf=true) {
01f50e06 434 //Here we encode absolute links
435 $content = backup_encode_absolute_links($content);
01a16f7e 436 $st = start_tag($tag,$level,$endline);
437 $co="";
438 if ($to_utf) {
fcf74f5a 439 $co = preg_replace("/\r\n|\r/", "\n", utf8_encode(htmlspecialchars($content)));
01a16f7e 440 } else {
fcf74f5a 441 $co = preg_replace("/\r\n|\r/", "\n", htmlspecialchars($content));
01a16f7e 442 }
443 $et = end_tag($tag,0,true);
444 return $st.$co.$et;
445 }
446
447 //Prints General info about the course
448 //name, moodle_version (internal and release), backup_version, date, info in file...
449 function backup_general_info ($bf,$preferences) {
450
451 global $CFG;
452
453 fwrite ($bf,start_tag("INFO",1,true));
454
455 //The name of the backup
456 fwrite ($bf,full_tag("NAME",2,false,$preferences->backup_name));
457 //The moodle_version
458 fwrite ($bf,full_tag("MOODLE_VERSION",2,false,$preferences->moodle_version));
459 fwrite ($bf,full_tag("MOODLE_RELEASE",2,false,$preferences->moodle_release));
460 //The backup_version
461 fwrite ($bf,full_tag("BACKUP_VERSION",2,false,$preferences->backup_version));
462 fwrite ($bf,full_tag("BACKUP_RELEASE",2,false,$preferences->backup_release));
463 //The date
464 fwrite ($bf,full_tag("DATE",2,false,$preferences->backup_unique_code));
c9c89845 465 //The original site wwwroot
466 fwrite ($bf,full_tag("ORIGINAL_WWWROOT",2,false,$CFG->wwwroot));
01a16f7e 467 //Te includes tag
468 fwrite ($bf,start_tag("DETAILS",2,true));
469 //Now, go to mod element of preferences to print its status
470 foreach ($preferences->mods as $element) {
471 //Calculate info
472 $included = "false";
473 $userinfo = "false";
474 if ($element->backup) {
475 $included = "true";
476 if ($element->userinfo) {
477 $userinfo = "true";
478 }
479 }
480 //Prints the mod start
481 fwrite ($bf,start_tag("MOD",3,true));
482 fwrite ($bf,full_tag("NAME",4,false,$element->name));
483 fwrite ($bf,full_tag("INCLUDED",4,false,$included));
484 fwrite ($bf,full_tag("USERINFO",4,false,$userinfo));
485
486 //Print the end
487 fwrite ($bf,end_tag("MOD",3,true));
488 }
489 //The user in backup
490 if ($preferences->backup_users == 1) {
491 fwrite ($bf,full_tag("USERS",3,false,"course"));
fa96ad2f 492 } else if ($preferences->backup_users == 0) {
01a16f7e 493 fwrite ($bf,full_tag("USERS",3,false,"all"));
fa96ad2f 494 } else {
495 fwrite ($bf,full_tag("USERS",3,false,"none"));
01a16f7e 496 }
497 //The logs in backup
498 if ($preferences->backup_logs == 1) {
499 fwrite ($bf,full_tag("LOGS",3,false,"true"));
500 } else {
501 fwrite ($bf,full_tag("LOGS",3,false,"false"));
502 }
503 //The user files
504 if ($preferences->backup_user_files == 1) {
505 fwrite ($bf,full_tag("USERFILES",3,false,"true"));
506 } else {
507 fwrite ($bf,full_tag("USERFILES",3,false,"false"));
508 }
509 //The course files
510 if ($preferences->backup_course_files == 1) {
511 fwrite ($bf,full_tag("COURSEFILES",3,false,"true"));
512 } else {
513 fwrite ($bf,full_tag("COURSEFILES",3,false,"false"));
514 }
515
516 fwrite ($bf,end_tag("DETAILS",2,true));
517
518
519 $status = fwrite ($bf,end_tag("INFO",1,true));
520
521 return $status;
522 }
523
524 //Prints course's general info (table course)
525 function backup_course_start ($bf,$preferences) {
526
527 global $CFG;
528
529 $status = true;
530
531 //Course open tag
532 fwrite ($bf,start_tag("COURSE",1,true));
48cbf566 533 //Header open tag
534 fwrite ($bf,start_tag("HEADER",2,true));
01a16f7e 535
536 //Get info from course
537 $course=false;
538 if ($courses = get_records("course","id",$preferences->backup_course)) {
539 $course = $courses[$preferences->backup_course];
540 }
541 if ($course) {
542 //Prints course info
48cbf566 543 fwrite ($bf,full_tag("ID",3,false,$course->id));
01a16f7e 544 //Obtain the category
545 $category = false;
546 if ($categories = get_records("course_categories","id","$course->category")) {
547 $category = $categories[$course->category];
548 }
549 if ($category) {
550 //Prints category info
48cbf566 551 fwrite ($bf,start_tag("CATEGORY",3,true));
552 fwrite ($bf,full_tag("ID",4,false,$course->category));
553 fwrite ($bf,full_tag("NAME",4,false,$category->name));
554 fwrite ($bf,end_tag("CATEGORY",3,true));
01a16f7e 555 }
556 //Continues with the course
48cbf566 557 fwrite ($bf,full_tag("PASSWORD",3,false,$course->password));
558 fwrite ($bf,full_tag("FULLNAME",3,false,$course->fullname));
559 fwrite ($bf,full_tag("SHORTNAME",3,false,$course->shortname));
e0f8b50d 560 fwrite ($bf,full_tag("IDNUMBER",3,false,$course->idnumber));
48cbf566 561 fwrite ($bf,full_tag("SUMMARY",3,false,$course->summary));
562 fwrite ($bf,full_tag("FORMAT",3,false,$course->format));
fff79722 563 fwrite ($bf,full_tag("SHOWGRADES",3,false,$course->showgrades));
229f852a 564 fwrite ($bf,full_tag("BLOCKINFO",3,false,blocks_get_block_names($course->blockinfo)));
48cbf566 565 fwrite ($bf,full_tag("NEWSITEMS",3,false,$course->newsitems));
566 fwrite ($bf,full_tag("TEACHER",3,false,$course->teacher));
567 fwrite ($bf,full_tag("TEACHERS",3,false,$course->teachers));
568 fwrite ($bf,full_tag("STUDENT",3,false,$course->student));
569 fwrite ($bf,full_tag("STUDENTS",3,false,$course->students));
570 fwrite ($bf,full_tag("GUEST",3,false,$course->guest));
9bd651e8 571 fwrite ($bf,full_tag("STARTDATE",3,false,$course->startdate));
48cbf566 572 fwrite ($bf,full_tag("NUMSECTIONS",3,false,$course->numsections));
4c49c802 573 //fwrite ($bf,full_tag("SHOWRECENT",3,false,$course->showrecent)); INFO: This is out in 1.3
6ecc3ea8 574 fwrite ($bf,full_tag("MAXBYTES",3,false,$course->maxbytes));
3f125001 575 fwrite ($bf,full_tag("SHOWREPORTS",3,false,$course->showreports));
568d750b 576 fwrite ($bf,full_tag("GROUPMODE",3,false,$course->groupmode));
577 fwrite ($bf,full_tag("GROUPMODEFORCE",3,false,$course->groupmodeforce));
3a4b33c3 578 fwrite ($bf,full_tag("LANG",3,false,$course->lang));
48cbf566 579 fwrite ($bf,full_tag("MARKER",3,false,$course->marker));
d4f2e3fb 580 fwrite ($bf,full_tag("VISIBLE",3,false,$course->visible));
750024e8 581 fwrite ($bf,full_tag("HIDDENSECTIONS",3,false,$course->hiddensections));
48cbf566 582 fwrite ($bf,full_tag("TIMECREATED",3,false,$course->timecreated));
583 $status = fwrite ($bf,full_tag("TIMEMODIFIED",3,false,$course->timemodified));
584 //Print header end
585 fwrite ($bf,end_tag("HEADER",2,true));
01a16f7e 586 } else {
587 $status = false;
588 }
589
590 return $status;
591 }
592
593 //Prints course's end tag
594 function backup_course_end ($bf,$preferences) {
595
596 //Course end tag
597 $status = fwrite ($bf,end_tag("COURSE",1,true));
598
599 return $status;
600
601 }
602
603 //Prints course's sections info (table course_sections)
604 function backup_course_sections ($bf,$preferences) {
605
606 global $CFG;
607
608 $status = true;
609
610
611 //Get info from sections
612 $section=false;
613 if ($sections = get_records("course_sections","course",$preferences->backup_course,"section")) {
614 //Section open tag
615 fwrite ($bf,start_tag("SECTIONS",2,true));
616 //Iterate over every section (ordered by section)
617 foreach ($sections as $section) {
618 //Begin Section
619 fwrite ($bf,start_tag("SECTION",3,true));
620 fwrite ($bf,full_tag("ID",4,false,$section->id));
621 fwrite ($bf,full_tag("NUMBER",4,false,$section->section));
622 fwrite ($bf,full_tag("SUMMARY",4,false,$section->summary));
623 fwrite ($bf,full_tag("VISIBLE",4,false,$section->visible));
624 //Now print the mods in section
625 backup_course_modules ($bf,$preferences,$section);
626 //End section
627 fwrite ($bf,end_tag("SECTION",3,true));
628 }
629 //Section close tag
630 $status = fwrite ($bf,end_tag("SECTIONS",2,true));
631 }
632
633 return $status;
634
635 }
636
637 //Prints course's modules info (table course_modules)
638 //Only for selected mods in preferences
639 function backup_course_modules ($bf,$preferences,$section) {
640
641 global $CFG;
642
643 $status = true;
644
645 $first_record = true;
646
647 //Now print the mods in section
648 //Extracts mod id from sequence
649 $tok = strtok($section->sequence,",");
650 while ($tok) {
651 //Get module's type
652 $moduletype = get_module_type ($preferences->backup_course,$tok);
653 //Check if we've selected to backup that type
654 if ($moduletype and $preferences->mods[$moduletype]->backup) {
655 $selected = true;
656 } else {
657 $selected = false;
658 }
659
660 if ($selected) {
661 //Gets course_module data from db
662 $course_module = get_records ("course_modules","id",$tok);
663 //If it's the first, pring MODS tag
664 if ($first_record) {
665 fwrite ($bf,start_tag("MODS",4,true));
666 $first_record = false;
667 }
668 //Print mod info from course_modules
669 fwrite ($bf,start_tag("MOD",5,true));
670 //Save neccesary info to backup_ids
671 fwrite ($bf,full_tag("ID",6,false,$tok));
672 fwrite ($bf,full_tag("TYPE",6,false,$moduletype));
673 fwrite ($bf,full_tag("INSTANCE",6,false,$course_module[$tok]->instance));
47e90355 674 fwrite ($bf,full_tag("ADDED",6,false,$course_module[$tok]->added));
01a16f7e 675 fwrite ($bf,full_tag("DELETED",6,false,$course_module[$tok]->deleted));
676 fwrite ($bf,full_tag("SCORE",6,false,$course_module[$tok]->score));
aac94fd0 677 fwrite ($bf,full_tag("INDENT",6,false,$course_module[$tok]->indent));
01a16f7e 678 fwrite ($bf,full_tag("VISIBLE",6,false,$course_module[$tok]->visible));
e695cd3f 679 fwrite ($bf,full_tag("GROUPMODE",6,false,$course_module[$tok]->groupmode));
01a16f7e 680 fwrite ($bf,end_tag("MOD",5,true));
681 }
682 //check for next
683 $tok = strtok(",");
684 }
685
686 //Si ha habido modulos, final de MODS
687 if (!$first_record) {
688 $status =fwrite ($bf,end_tag("MODS",4,true));
689 }
690
691 return $status;
692 }
693
694 //Print users to xml
695 //Only users previously calculated in backup_ids will output
696 //
697 function backup_user_info ($bf,$preferences) {
698
699 global $CFG;
700
701 $status = true;
702
703 $users = get_records_sql("SELECT u.old_id, u.table_name,u.info
704 FROM {$CFG->prefix}backup_ids u
705 WHERE u.backup_code = '$preferences->backup_unique_code' AND
706 u.table_name = 'user'");
707
708 //If we have users to backup
709 if ($users) {
710 //Begin Users tag
711 fwrite ($bf,start_tag("USERS",2,true));
d48370a6 712 $counter = 0;
01a16f7e 713 //With every user
714 foreach ($users as $user) {
715 //Get user data from table
716 $user_data = get_record("user","id",$user->old_id);
717 //Begin User tag
718 fwrite ($bf,start_tag("USER",3,true));
719 //Output all user data
720 fwrite ($bf,full_tag("ID",4,false,$user_data->id));
721 fwrite ($bf,full_tag("CONFIRMED",4,false,$user_data->confirmed));
722 fwrite ($bf,full_tag("DELETED",4,false,$user_data->deleted));
723 fwrite ($bf,full_tag("USERNAME",4,false,$user_data->username));
724 fwrite ($bf,full_tag("PASSWORD",4,false,$user_data->password));
725 fwrite ($bf,full_tag("IDNUMBER",4,false,$user_data->idnumber));
0535cada 726 fwrite ($bf,full_tag("FIRSTNAME",4,false,$user_data->firstname));
01a16f7e 727 fwrite ($bf,full_tag("LASTNAME",4,false,$user_data->lastname));
728 fwrite ($bf,full_tag("EMAIL",4,false,$user_data->email));
8199e3f0 729 fwrite ($bf,full_tag("EMAILSTOP",4,false,$user_data->emailstop));
01a16f7e 730 fwrite ($bf,full_tag("ICQ",4,false,$user_data->icq));
731 fwrite ($bf,full_tag("PHONE1",4,false,$user_data->phone1));
732 fwrite ($bf,full_tag("PHONE2",4,false,$user_data->phone2));
733 fwrite ($bf,full_tag("INSTITUTION",4,false,$user_data->institution));
734 fwrite ($bf,full_tag("DEPARTMENT",4,false,$user_data->department));
735 fwrite ($bf,full_tag("ADDRESS",4,false,$user_data->address));
736 fwrite ($bf,full_tag("CITY",4,false,$user_data->city));
737 fwrite ($bf,full_tag("COUNTRY",4,false,$user_data->country));
738 fwrite ($bf,full_tag("LANG",4,false,$user_data->lang));
739 fwrite ($bf,full_tag("TIMEZONE",4,false,$user_data->timezone));
740 fwrite ($bf,full_tag("FIRSTACCESS",4,false,$user_data->firstaccess));
741 fwrite ($bf,full_tag("LASTACCESS",4,false,$user_data->lastaccess));
742 fwrite ($bf,full_tag("LASTLOGIN",4,false,$user_data->lastlogin));
743 fwrite ($bf,full_tag("CURRENTLOGIN",4,false,$user_data->currentlogin));
744 fwrite ($bf,full_tag("LASTIP",4,false,$user_data->lastIP));
745 fwrite ($bf,full_tag("SECRET",4,false,$user_data->secret));
746 fwrite ($bf,full_tag("PICTURE",4,false,$user_data->picture));
747 fwrite ($bf,full_tag("URL",4,false,$user_data->url));
748 fwrite ($bf,full_tag("DESCRIPTION",4,false,$user_data->description));
749 fwrite ($bf,full_tag("MAILFORMAT",4,false,$user_data->mailformat));
750 fwrite ($bf,full_tag("MAILDISPLAY",4,false,$user_data->maildisplay));
751 fwrite ($bf,full_tag("HTMLEDITOR",4,false,$user_data->htmleditor));
0535cada 752 fwrite ($bf,full_tag("AUTOSUBSCRIBE",4,false,$user_data->autosubscribe));
01a16f7e 753 fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$user_data->timemodified));
754
755 //Output every user role (with its associated info)
756 $user->isadmin = strpos($user->info,"admin");
757 $user->iscoursecreator = strpos($user->info,"coursecreator");
758 $user->isteacher = strpos($user->info,"teacher");
759 $user->isstudent = strpos($user->info,"student");
0611af10 760 $user->isneeded = strpos($user->info,"needed");
01a16f7e 761 if ($user->isadmin!==false or
762 $user->iscoursecreator!==false or
763 $user->isteacher!==false or
0611af10 764 $user->isstudent!==false or
765 $user->isneeded!==false) {
01a16f7e 766 //Begin ROLES tag
767 fwrite ($bf,start_tag("ROLES",4,true));
768 //PRINT ROLE INFO
769 //Admins
770 if ($user->isadmin!==false) {
771 //Print ROLE start
772 fwrite ($bf,start_tag("ROLE",5,true));
773 //Print Role info
774 fwrite ($bf,full_tag("TYPE",6,false,"admin"));
775 //Print ROLE end
776 fwrite ($bf,end_tag("ROLE",5,true));
777 }
778 //CourseCreator
779 if ($user->iscoursecreator!==false) {
780 //Print ROLE start
781 fwrite ($bf,start_tag("ROLE",5,true));
782 //Print Role info
783 fwrite ($bf,full_tag("TYPE",6,false,"coursecreator"));
784 //Print ROLE end
785 fwrite ($bf,end_tag("ROLE",5,true));
786 }
787 //Teacher
788 if ($user->isteacher!==false) {
789 //Print ROLE start
790 fwrite ($bf,start_tag("ROLE",5,true));
791 //Print Role info
792 fwrite ($bf,full_tag("TYPE",6,false,"teacher"));
793 //Get specific info for teachers
794 $tea = get_record("user_teachers","userid",$user->old_id,"course",$preferences->backup_course);
795 fwrite ($bf,full_tag("AUTHORITY",6,false,$tea->authority));
796 fwrite ($bf,full_tag("TEA_ROLE",6,false,$tea->role));
35a14ba0 797 fwrite ($bf,full_tag("EDITALL",6,false,$tea->editall));
e0f8b50d 798 fwrite ($bf,full_tag("TIMESTART",6,false,$tea->timestart));
799 fwrite ($bf,full_tag("TIMEEND",6,false,$tea->timeend));
35a14ba0 800 fwrite ($bf,full_tag("TIMEMODIFIED",6,false,$tea->timemodified));
dabf73b4 801 fwrite ($bf,full_tag("TIMEACCESS",6,false,$tea->timeaccess));
01a16f7e 802 //Print ROLE end
803 fwrite ($bf,end_tag("ROLE",5,true));
804 }
805 //Student
806 if ($user->isstudent!==false) {
807 //Print ROLE start
808 fwrite ($bf,start_tag("ROLE",5,true));
809 //Print Role info
810 fwrite ($bf,full_tag("TYPE",6,false,"student"));
811 //Get specific info for students
812 $stu = get_record("user_students","userid",$user->old_id,"course",$preferences->backup_course);
813 fwrite ($bf,full_tag("TIMESTART",6,false,$stu->timestart));
814 fwrite ($bf,full_tag("TIMEEND",6,false,$stu->timeend));
815 fwrite ($bf,full_tag("TIME",6,false,$stu->time));
dabf73b4 816 fwrite ($bf,full_tag("TIMEACCESS",6,false,$stu->timeaccess));
01a16f7e 817 //Print ROLE end
818 fwrite ($bf,end_tag("ROLE",5,true));
819 }
0611af10 820 //Needed
821 if ($user->isneeded!==false) {
822 //Print ROLE start
823 fwrite ($bf,start_tag("ROLE",5,true));
824 //Print Role info
825 fwrite ($bf,full_tag("TYPE",6,false,"needed"));
826 //Print ROLE end
827 fwrite ($bf,end_tag("ROLE",5,true));
828 }
01a16f7e 829
830 //End ROLES tag
831 fwrite ($bf,end_tag("ROLES",4,true));
41fd7fe4 832
833 //Check if we have user_preferences to backup
834 if ($preferences_data = get_records("user_preferences","userid",$user->old_id)) {
835 //Start USER_PREFERENCES tag
836 fwrite ($bf,start_tag("USER_PREFERENCES",4,true));
837 //Write each user_preference
838 foreach ($preferences_data as $user_preference) {
839 fwrite ($bf,start_tag("USER_PREFERENCE",5,true));
840 fwrite ($bf,full_tag("NAME",6,false,$user_preference->name));
841 fwrite ($bf,full_tag("VALUE",6,false,$user_preference->value));
842 fwrite ($bf,end_tag("USER_PREFERENCE",5,true));
843 }
844 //End USER_PREFERENCES tag
845 fwrite ($bf,end_tag("USER_PREFERENCES",4,true));
846 }
847
01a16f7e 848 }
849 //End User tag
850 fwrite ($bf,end_tag("USER",3,true));
d48370a6 851 //Do some output
852 $counter++;
853 if ($counter % 10 == 0) {
854 echo ".";
855 if ($counter % 200 == 0) {
856 echo "<br>";
857 }
858 backup_flush(300);
859 }
01a16f7e 860 }
861 //End Users tag
862 fwrite ($bf,end_tag("USERS",2,true));
863 } else {
8c02baf6 864 // There aren't any users.
865 $status = true;
01a16f7e 866 }
867
868 return $status;
869 }
870
871 //Backup log info (time ordered)
872 function backup_log_info($bf,$preferences) {
873
874 global $CFG;
8f7ab281 875
876 //Number of records to get in every chunk
877 $recordset_size = 1000;
01a16f7e 878
879 $status = true;
8f7ab281 880
881 //Counter, points to current record
882 $counter = 0;
01a16f7e 883
8f7ab281 884 //Count records
885 $count_logs = count_records("log","course",$preferences->backup_course);
01a16f7e 886
8f7ab281 887 //Pring logs header
888 if ($count_logs > 0 ) {
01a16f7e 889 fwrite ($bf,start_tag("LOGS",2,true));
8f7ab281 890 }
891 while ($counter < $count_logs) {
892 //Get a chunk of records
893 $logs = get_records ("log","course",$preferences->backup_course,"time","*",$counter,$recordset_size);
894
895 //We have logs
896 if ($logs) {
897 //Iterate
898 foreach ($logs as $log) {
899 //See if it is a valid module to backup
900 if ($log->module == "course" or
901 $log->module == "user" or
902 $preferences->mods[$log->module]->backup == 1) {
903 //Begin log tag
904 fwrite ($bf,start_tag("LOG",3,true));
905
906 //Output log tag
907 fwrite ($bf,full_tag("ID",4,false,$log->id));
908 fwrite ($bf,full_tag("TIME",4,false,$log->time));
909 fwrite ($bf,full_tag("USERID",4,false,$log->userid));
910 fwrite ($bf,full_tag("IP",4,false,$log->ip));
911 fwrite ($bf,full_tag("MODULE",4,false,$log->module));
90553685 912 fwrite ($bf,full_tag("CMID",4,false,$log->cmid));
8f7ab281 913 fwrite ($bf,full_tag("ACTION",4,false,$log->action));
914 fwrite ($bf,full_tag("URL",4,false,$log->url));
915 fwrite ($bf,full_tag("INFO",4,false,$log->info));
916
917 //End log tag
918 fwrite ($bf,end_tag("LOG",3,true));
919 }
920 //Do some output
921 $counter++;
922 if ($counter % 10 == 0) {
923 echo ".";
924 if ($counter % 200 == 0) {
925 echo "<br>";
926 }
927 backup_flush(300);
d48370a6 928 }
d48370a6 929 }
01a16f7e 930 }
8f7ab281 931 }
932 //End logs tag
933 if ($count_logs > 0 ) {
01a16f7e 934 $status = fwrite ($bf,end_tag("LOGS",2,true));
935 }
936 return $status;
937 }
938
42f1ff47 939
940 //Backup scales info (common and course scales)
941 function backup_scales_info($bf,$preferences) {
942
943 global $CFG;
944
945 $status = true;
946
947 //Counter, points to current record
948 $counter = 0;
949
950 //Get scales (common and course scales)
951 $scales = get_records_sql("SELECT id, courseid, userid, name, scale, description, timemodified
952 FROM {$CFG->prefix}scale
953 WHERE courseid = '0' or courseid = $preferences->backup_course");
35055d37 954
955 //Copy only used scales to $backupscales. They will be in backup (unused no). See Bug 1223.
956 $backupscales = array();
42f1ff47 957 if ($scales) {
35055d37 958 foreach ($scales as $scale) {
959 if (course_scale_used($preferences->backup_course, $scale->id)) {
960 $backupscales[] = $scale;
961 }
962 }
963 }
964
965 //Pring scales header
966 if ($backupscales) {
42f1ff47 967 //Pring scales header
968 fwrite ($bf,start_tag("SCALES",2,true));
969 //Iterate
35055d37 970 foreach ($backupscales as $scale) {
42f1ff47 971 //Begin scale tag
972 fwrite ($bf,start_tag("SCALE",3,true));
973 //Output scale tag
974 fwrite ($bf,full_tag("ID",4,false,$scale->id));
975 fwrite ($bf,full_tag("COURSEID",4,false,$scale->courseid));
976 fwrite ($bf,full_tag("USERID",4,false,$scale->userid));
977 fwrite ($bf,full_tag("NAME",4,false,$scale->name));
978 fwrite ($bf,full_tag("SCALETEXT",4,false,$scale->scale));
979 fwrite ($bf,full_tag("DESCRIPTION",4,false,$scale->description));
980 fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$scale->timemodified));
981 //End scale tag
982 fwrite ($bf,end_tag("SCALE",3,true));
983 }
984 //End scales tag
985 $status = fwrite ($bf,end_tag("SCALES",2,true));
986 }
987 return $status;
988 }
989
cd44fdcb 990 //Backup events info (course events)
991 function backup_events_info($bf,$preferences) {
992
993 global $CFG;
994
995 $status = true;
996
997 //Counter, points to current record
998 $counter = 0;
999
1000 //Get events (course events)
1001 $events = get_records_select("event","courseid='$preferences->backup_course' AND instance='0'","id");
1002
1003 //Pring events header
1004 if ($events) {
1005 //Pring events header
1006 fwrite ($bf,start_tag("EVENTS",2,true));
1007 //Iterate
1008 foreach ($events as $event) {
1009 //Begin event tag
1010 fwrite ($bf,start_tag("EVENT",3,true));
1011 //Output event tag
1012 fwrite ($bf,full_tag("ID",4,false,$event->id));
1013 fwrite ($bf,full_tag("NAME",4,false,$event->name));
1014 fwrite ($bf,full_tag("DESCRIPTION",4,false,$event->description));
d2b5f1e8 1015 fwrite ($bf,full_tag("FORMAT",4,false,$event->format));
cd44fdcb 1016 fwrite ($bf,full_tag("GROUPID",4,false,$event->groupid));
1017 fwrite ($bf,full_tag("USERID",4,false,$event->userid));
1018 fwrite ($bf,full_tag("EVENTTYPE",4,false,$event->eventtype));
1019 fwrite ($bf,full_tag("TIMESTART",4,false,$event->timestart));
1020 fwrite ($bf,full_tag("TIMEDURATION",4,false,$event->timeduration));
4c49c802 1021 fwrite ($bf,full_tag("VISIBLE",4,false,$event->visible));
cd44fdcb 1022 fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$event->timemodified));
1023 //End event tag
1024 fwrite ($bf,end_tag("EVENT",3,true));
1025 }
1026 //End events tag
1027 $status = fwrite ($bf,end_tag("EVENTS",2,true));
1028 }
1029 return $status;
1030 }
1031
a4de843e 1032 //Backup groups info
1033 function backup_groups_info($bf,$preferences) {
1034
1035 global $CFG;
ece42d55 1036
a4de843e 1037 $status = true;
ece42d55 1038 $status2 = true;
a4de843e 1039
1040 //Get groups
1041 $groups = get_records("groups","courseid",$preferences->backup_course);
1042
1043 //Pring groups header
1044 if ($groups) {
1045 //Pring groups header
1046 fwrite ($bf,start_tag("GROUPS",2,true));
1047 //Iterate
1048 foreach ($groups as $group) {
1049 //Begin group tag
1050 fwrite ($bf,start_tag("GROUP",3,true));
1051 //Output group contents
1052 fwrite ($bf,full_tag("ID",4,false,$group->id));
1053 fwrite ($bf,full_tag("COURSEID",4,false,$group->courseid));
1054 fwrite ($bf,full_tag("NAME",4,false,$group->name));
1055 fwrite ($bf,full_tag("DESCRIPTION",4,false,$group->description));
1056 fwrite ($bf,full_tag("LANG",4,false,$group->lang));
1057 fwrite ($bf,full_tag("PICTURE",4,false,$group->picture));
3c0561cf 1058 fwrite ($bf,full_tag("HIDEPICTURE",4,false,$group->hidepicture));
a4de843e 1059 fwrite ($bf,full_tag("TIMECREATED",4,false,$group->timecreated));
1060 fwrite ($bf,full_tag("TIMEMODIFIED",4,false,$group->timemodified));
1061
1062 //Now, backup groups_members
1063 $status2 = backup_groups_members_info($bf,$preferences,$group->id);
1064
1065 //End group tag
1066 fwrite ($bf,end_tag("GROUP",3,true));
1067 }
1068 //End groups tag
1069 $status = fwrite ($bf,end_tag("GROUPS",2,true));
1070 }
1071 return ($status && $status2);
1072 }
1073
1074 //Backup groups_members info
1075 function backup_groups_members_info($bf,$preferences,$groupid) {
1076
1077 global $CFG;
1078
1079 $status = true;
1080
1081 //Get groups_members
1082 $groups_members = get_records("groups_members","groupid",$groupid);
1083
1084 //Pring groups_members header
1085 if ($groups_members) {
1086 //Pring groups_members header
1087 fwrite ($bf,start_tag("MEMBERS",4,true));
1088 //Iterate
1089 foreach ($groups_members as $group_member) {
1090 //Begin group_member tag
1091 fwrite ($bf,start_tag("MEMBER",5,true));
1092 //Output group_member contents
1093 fwrite ($bf,full_tag("USERID",6,false,$group_member->userid));
1094 fwrite ($bf,full_tag("TIMEADDED",6,false,$group_member->timeadded));
1095 //End group_member tag
1096 fwrite ($bf,end_tag("MEMBER",5,true));
1097 }
1098 //End groups_members tag
1099 $status = fwrite ($bf,end_tag("MEMBERS",4,true));
1100 }
1101 return $status;
1102 }
42f1ff47 1103
01a16f7e 1104 //Start the modules tag
1105 function backup_modules_start ($bf,$preferences) {
1106
1107 return fwrite ($bf,start_tag("MODULES",2,true));
1108 }
1109
1110 //End the modules tag
1111 function backup_modules_end ($bf,$preferences) {
1112
1113 return fwrite ($bf,end_tag("MODULES",2,true));
1114 }
1115
1116 //This function makes all the necesary calls to every mod
1117 //to export itself and its files !!!
1118 function backup_module($bf,$preferences,$module) {
1119
1120 global $CFG;
1121
1122 $status = true;
1123
1124 //First, re-check if necessary functions exists
1125 $modbackup = $module."_backup_mods";
1126 if (function_exists($modbackup)) {
1127 //Call the function
1128 $status = $modbackup($bf,$preferences);
1129 } else {
1130 //Something was wrong. Function should exist.
1131 $status = false;
1132 }
1133
1134 return $status;
1135
1136 }
1137
01f50e06 1138 //This function encode things to make backup multi-site fully functional
1139 //It does this conversions:
4c49c802 1140 // - $CFG->wwwroot/file.php/courseid ----------------------> $@FILEPHP@$
56eea82e 1141 // - Links to forums everywhere (DB) are encoded.
01f50e06 1142 //
1143 function backup_encode_absolute_links($content) {
1144
1145 global $CFG,$preferences;
1146
4c49c802 1147 //Check if preferences is ok. If it isn't set, we are
1148 //in a scheduled_backup to we are able to get a copy
1149 //from CFG->backup_preferences
1150 if (!isset($preferences)) {
646c20b5 1151 $mypreferences = $CFG->backup_preferences;
1152 } else {
1153 //We are in manual backups so global preferences must exist!!
1154 $mypreferences = $preferences;
4c49c802 1155 }
1156
1157 //First, we check for every call to file.php inside the course
646c20b5 1158 $search = array($CFG->wwwroot."/file.php/".$mypreferences->backup_course);
01f50e06 1159
4c49c802 1160 $replace = array("$@FILEPHP@$");
01f50e06 1161
1162 $result = str_replace($search,$replace,$content);
1163
646c20b5 1164 foreach ($mypreferences->mods as $name => $info) {
56eea82e 1165 //Check if the xxxx_encode_content_links exists
1166 $function_name = $name."_encode_content_links";
1167 if (function_exists($function_name)) {
646c20b5 1168 $result = $function_name($result,$mypreferences);
56eea82e 1169 }
1170 }
1171
1172 if ($result != $content && $CFG->debug>7) { //Debug
1173 echo "<br><hr>".$content."<br>changed to<br>".$result."<hr><br>"; //Debug
1174 } //Debug
01f50e06 1175
1176 return $result;
1177 }
1178
01a16f7e 1179 //This function copies all the needed files under the "users" directory to the "user_files"
1180 //directory under temp/backup
1181 function backup_copy_user_files ($preferences) {
1182
1183 global $CFG;
1184
1185 $status = true;
1186
1187 //First we check to "user_files" exists and create it as necessary
1188 //in temp/backup/$backup_code dir
1189 $status = check_and_create_user_files_dir($preferences->backup_unique_code);
1190
1191 //Now iterate over directories under "users" to check if that user must be
1192 //copied to backup
1193
1194 $rootdir = $CFG->dataroot."/users";
1195 //Check if directory exists
1196 if (is_dir($rootdir)) {
1197 $list = list_directories ($rootdir);
1198 if ($list) {
1199 //Iterate
1200 foreach ($list as $dir) {
1201 //Look for dir like username in backup_ids
1202 $data = get_record ("backup_ids","backup_code",$preferences->backup_unique_code,
1203 "table_name","user",
1204 "old_id",$dir);
1205 //If exists, copy it
1206 if ($data) {
1207 $status = backup_copy_file($rootdir."/".$dir,
1208 $CFG->dataroot."/temp/backup/".$preferences->backup_unique_code."/user_files/".$dir);
1209 }
1210 }
1211 }
1212 }
1213 return $status;
1214 }
1215
1216 //This function copies all the course files under the course directory (except the moddata
1217 //directory to the "course_files" directory under temp/backup
1218 function backup_copy_course_files ($preferences) {
1219
1220 global $CFG;
1221
1222 $status = true;
1223
1224 //First we check to "course_files" exists and create it as necessary
1225 //in temp/backup/$backup_code dir
1226 $status = check_and_create_course_files_dir($preferences->backup_unique_code);
1227
8f7ab281 1228 //Now iterate over files and directories except $CFG->moddata and backupdata to be
01a16f7e 1229 //copied to backup
1230
1231 $rootdir = $CFG->dataroot."/".$preferences->backup_course;
1232
1233 $name_moddata = $CFG->moddata;
8f7ab281 1234 $name_backupdata = "backupdata";
01a16f7e 1235 //Check if directory exists
1236 if (is_dir($rootdir)) {
1237 $list = list_directories_and_files ($rootdir);
1238 if ($list) {
1239 //Iterate
1240 foreach ($list as $dir) {
1241 if ($dir !== $name_moddata and $dir !== $name_backupdata) {
1242 $status = backup_copy_file($rootdir."/".$dir,
1243 $CFG->dataroot."/temp/backup/".$preferences->backup_unique_code."/course_files/".$dir);
1244 }
1245 }
1246 }
1247 }
1248 return $status;
1249 }
1250
1251 //This function creates the zip file containing all the backup info
1252 //moodle.xml, moddata, user_files, course_files.
1253 //The zipped file is created in the backup directory and named with
1254 //the "oficial" name of the backup
1255 //It uses "pclzip" if available or system "zip" (unix only)
9c1ae5ae 1256 function backup_zip ($preferences) {
01a16f7e 1257
1258 global $CFG;
1259
1260 $status = true;
1261
1262 //Base dir where everything happens
1263 $basedir = $CFG->dataroot."/temp/backup/".$preferences->backup_unique_code;
1264 //Backup zip file name
1265 $name = $preferences->backup_name;
1266 //List base_dir files and directories
1267 $filelist = list_directories_and_files ($basedir);
1268
1269 if (empty($CFG->zip)) { // Use built-in php-based zip function
2aa7d924 1270 //echo "<br>Using pclzip"; //Debug
7641819d 1271 $files = array();
1272 foreach ($filelist as $file) {
1273 //If directory, append "/"
300ae26c 1274 //Commented. Not needed wit version 2.0 of pclzip !!
41923e75 1275 //if (is_dir($basedir."/".$file)) {
1276 // $file = $file."/";
1277 //}
7641819d 1278 //Include into array
d968b8e6 1279 //echo "<br>Adding file/dir ".$file; //Debug
7641819d 1280 $files[] = $basedir."/".$file;
1281 }
9c1ae5ae 1282 include_once("$CFG->dirroot/lib/pclzip/pclzip.lib.php");
300ae26c 1283 //include_once("$CFG->dirroot/lib/pclzip/pclerror.lib.php"); //Debug
1284 //include_once("$CFG->dirroot/lib/pclzip/pcltrace.lib.php"); //Debug
1285 //PclTraceOn(2); //Debug
7641819d 1286 $archive = new PclZip("$basedir/$name");
1287 if (($list = $archive->create($files,PCLZIP_OPT_REMOVE_PATH,$basedir)) == 0) {
1288 error($archive->errorInfo(true));
1289 $status = false;
1290 }
300ae26c 1291 //PclTraceDisplay(); //Debug
1292 //PclTraceOff(); //Debug
7641819d 1293 } else { // Use external zip program
2aa7d924 1294 //echo "<br>Using external zip"; //Debug
7641819d 1295 $files = "";
1296 foreach ($filelist as $file) {
1297 $files .= basename($file);
1298 $files .= " ";
1299 }
1300 $command = "cd $basedir ; $CFG->zip -r $name $files";
2aa7d924 1301 //echo "<br>Executing command: ".$command; //Debug
7641819d 1302 $status = Exec($command);
1303 }
01a16f7e 1304
2aa7d924 1305 //echo "<br>Status: ".$status; //Debug
01a16f7e 1306 return $status;
1307
1308 }
1309
1310 //This function copies the final zip to the course dir
1311 function copy_zip_to_course_dir ($preferences) {
1312
1313 global $CFG;
1314
37afa39a 1315 $status = true;
1316
af9cd955 1317 //Define zip location (from)
01a16f7e 1318 $from_zip_file = $CFG->dataroot."/temp/backup/".$preferences->backup_unique_code."/".$preferences->backup_name;
af9cd955 1319
37afa39a 1320 //Initialise $to_zip_file
1321 $to_zip_file="";
af9cd955 1322
37afa39a 1323 //If $preferences->backup_destination isn't empty, then copy to custom directory
1324 if (!empty($preferences->backup_destination)) {
1325 $to_zip_file = $preferences->backup_destination."/".$preferences->backup_name;
1326 } else {
1327 //Define zip destination (course dir)
1328 $to_zip_file = $CFG->dataroot."/".$preferences->backup_course;
1329
1330 //echo "<p>From: ".$from_zip_file."<br>"; //Debug
1331
1332 //echo "<p>Checking: ".$to_zip_file."<br>"; //Debug
1333
1334 //Checks course dir exists
1335 $status = check_dir_exists($to_zip_file,true);
1336
1337 //Define zip destination (backup dir)
1338 $to_zip_file = $to_zip_file."/backupdata";
1339
1340 //echo "<p>Checking: ".$to_zip_file."<br>"; //Debug
1341
1342 //Checks backup dir exists
1343 $status = check_dir_exists($to_zip_file,true);
af9cd955 1344
37afa39a 1345 //Define zip destination (zip file)
1346 $to_zip_file = $to_zip_file."/".$preferences->backup_name;
1347 }
af9cd955 1348
04ab6cab 1349 //echo "<p>To: ".$to_zip_file."<br>"; //Debug
af9cd955 1350
01a16f7e 1351 //Copy zip file
1352 if ($status) {
1353 $status = backup_copy_file ($from_zip_file,$to_zip_file);
1354 }
1355
1356 return $status;
1357 }
1358?>