Неконсистентные состояния системы
1)
Несоответствие объектов в базе и на файловой системе
Объект | В базе | На файловой системе |
Решение | submits (id, userid, taskid, filename,…) | solution/<filename> solution/<filename>.md5 |
Архив тестов | tasks (tasked) | tests/<taskid>/archive.zip tests/<taskid>/archive.zip.md5 |
Условие тура | files_for_tour (fid, tourid, filename, comment) | tours/<tourid>.zip/<filename> |
Условия задач | tasks (tasked, tourid) | tasks/<tourid>/<tasked>.<txt> |
Детализированный отчет (ошибка компиляции и тд) | submits (id) | solution/<solution_id>.zip |
Текст на печать | print (filename) | solution/<filename>.txt |
Скрипт checkUnusedFiles.pl
- Разбор xml скрипта с расположением файлов в базе данных и на файловой системе
- Составление списка файлов, найденных в базе данных для данного типа, лексическая сортировка и запись в файл $from_db
- Составление списка файлов, найденных на сервере, лексическая сортировка и запись в файл $from_fs
- С помощью утилиты unix comm чтение файлов $from_db, $from_fs и генерация вывода, состоящего из трёх колонок текста: строки, найденные только в файле $from_db; строки, найденные только в файле $from_fs; и строки, общие для обоих файлов.
- Обработка результата, удаление файлов и записей в базе данных по запросу
- Печать отчета
2)
Внешний ключ указывает на несуществующий объект (удаленный)
Private key | Foreign key |
olympiad.id | forms.olympiadid log.olympid tour.olympid users.current_olympiad userlist.olympiadid olympiad_freeze.olympiadid |
tour.tourid | files_for_tour.tourid langs_for_tour.tourid news.tourid qna.tourid virtualtours.tourid users.selected_tourid notifications.tourid tasks.tourid timeshift.tourid |
users.userid | formvalues.userid online.userid print.userid priv.userid submits.userid virtualtours.userid timeshift.userid notifications.userid qna.userid qna.ansid |
forms.id | formvalues.formid userlist.formid |
langs.langid | langs_for_tour.langid submits.langid |
tasks.taskid | submits.taskid |
cities.id | universities.cityid users.cityid |
universities.id | users.univerid |
Алгоритм устранения
A.id ->
- a_id
1) Пробегаем по всем B, смотрим, что существует соответствующий A.id = B.a_id
Если нет, то удаляем строку В или пишем предупреждение.
2) При удалении A.id удаляем все связные строки B
P.S. Удаление данных нужно не всегда, например
— в таблице userlist есть поля с фиксированными formid (1..6), означающие город, универ, название, т.е. поля по умолчанию. их нет в form.id
— не надо удалять пользователя, если у него несуществующая олимпиада или тур
Такие данные игнорируются
Скрипт checkRefIntegrity.pl
Внимание! Использовать такой скрипт надо осторожно!
3)
Существование нескольких записей ссылающихся на одну
Использование вместо отношения
1–1 отношения 1-n.
Пример: каждая запись в таблице priv ссылается на пользователя из таблицы users. Однако, в отсутствии внешних ключей в базе данных, может получиться, что несколько записей в таблице привилегий относятся к одному пользователю, что не верно.
Процесс поиска и удаления таких записей можно осуществить, например, при помощи запросов SQL:
4)
Кавычки в БД
Например title = Evgen'evich, могут возникать проблемы при сохранении дампа