Για τις ενέργειες αντιγράφου ασφαλείας και ανάκτησης μαθήματος, πρέπει για κάθε υποσύστημα να υπάρχει ο σχετικός κώδικας στα αρχεία modules/course_info/archive_course.php και modules/course_info/restore_course.php. Επίσης, σε κάθε αλλαγή στη δομή των πινάκων της βάσης δεδομένων θα πρέπει να γίνονται οι αντίστοιχες αλλαγές και στα παραπάνω αρχεία, αν χρειάζεται.
Οι προσθήκες που χρειάζονται εδώ είναι γενικά απλές. Τα δεδομένα στο αντίγραφο ασφαλείας περιέχονται σε αρχεία που έχουν το ίδιο όνομα με τους πίνακες στη βάση, τα οποία περιέχουν σε μορφή serialized PHP array τα αποτελέσματα ενός query από τη βάση με τα δεδομένα για το τρέχον μάθημα. Στο αρχείο archive_course.php ορίζεται ο πίνακας archive_conditions
που περιέχει τους όρους WHERE του ερωτήματος SQL για κάθε πίνακα:
$archive_conditions = array( 'course' => "id = $course_id", 'user' => "id IN (SELECT user_id FROM course_user WHERE course_id = $course_id)", 'course_user' => "course_id = $course_id", 'course_department' => "course = $course_id", 'course_module' => $sql_course, [...] 'exercise' => $sql_course, 'exercise_question' => $sql_course, 'exercise_answer' => "question_id IN (SELECT id FROM exercise_question WHERE course_id = $course_id)", 'exercise_user_record' => "eid IN (SELECT id FROM exercise WHERE course_id = $course_id)", 'exercise_with_questions' => "question_id IN (SELECT id FROM exercise_question WHERE course_id = $course_id) OR exercise_id IN (SELECT id FROM exercise WHERE course_id = $course_id)");
Όπως φαίνεται στο παραπάνω υπόδειγμα, στους όρους γενικά χρησιμοποιείται η μεταβλητή $course_id
ενώ καθώς σε πολλές περιπτώσεις ο όρος είναι WHERE course_id = $course_id
, είναι προκαθορισμένη η μεταβλητή $sql_course
με τον περιορισμό αυτό.
Στο αρχείο restore_course.php γίνονται όλες οι κλήσεις που χρειάζονται για την μεταφορά των δεδομένων ξανά στη βάση από τα αρχεία όπου είχαν αποθηκευτεί. Για το σκοπό αυτό, χρησιμοποιείται γενικά η συνάρτηση restore_table($basedir, $table, $options)
που διευκολύνει όλες τις αλλαγές που μπορεί να χρειαστούν τα δεδομένα κατά τη μεταφορά τους. Το όρισμα $basedir
παίρνει παντού την τιμή $restoreThis
και είναι το προκαθορισμένο path του καταλόγου με τα αρχεία προς ανάκτηση. Το $table
περιέχει το όνομα του πίνακα. Τέλος, το $options
περιέχει έναν πίνακα με τις ενέργειες που πρέπει να γίνουν για τον πίνακα αυτό. Οι δυνατές ενέργειες είναι οι εξής:
set
: Θέτει την τιμή ενός πεδίου των δεδομένων. Χρησιμοποιείται συχνά για την αλλαγή του course_id
. Παράδειγμα: array('set' => array('course_id' => $course_id), ...)
delete
: Διαγράφει την τιμή ενός πεδίου. Χρησιμοποιείται συχνά για την αλλαγή του id του πίνακα, το οποίο κατά την ανάκτηση παίρνει αυτόματα αύξουσες τιμές, στην περίπτωση που δεν υπάρχουν αναφορές στα id του συγκεκριμένου πίνακα. Παράδειγμα: array('delete' => array('id'), ...)
return_mapping
: Φροντίζει ένα πεδίο auto increment να πάρει νέα τιμή, και επιστρέφει έναν πίνακα που απεικονίζει την παλιά τιμή σε αυτή που πήρε κατά την εισαγωγή. Χρησιμοποιείται στην περίπτωση που _υπάρχουν_ αναφορές στο id. Παράδειγμα: $collection_map = restore_table($restoreThis, 'collection', array('return_mapping' => 'id', ...));
map
: Χρησιμοποιεί τον πίνακα απεικόνισης από το return_mapping για τη μετατροπή των τιμών ενός πεδίου. Χρησιμοποιείται για τη διόρθωση των αναφορών στο id ενός άλλου πίνακα. Παράδειγμα: restore_table($restoreThis, 'collection_item', array('map' => array('collection_id' => ), ...));