task_db

advertisement
Задача Хранилище Документов
Необходимо реализовать на языке Си (Ansi C89) функциональность модельного
хранилища документов.
Хранилище представляет собой набор документов. Каждый документ имеет уникальное
имя и содержит набор значений атрибутов. Атрибут идентифицируется именем. Имена
всех атрибутов одного документа различны. Документы хранилища могут содержать
произвольные наборы атрибутов. Значением атрибута является строка. Определение
имени атрибута эквивалентно определению идентификатора в языке Си. Максимальная
длина значения атрибута не ограничена, значение может быть также пустым. Документ
также может быть пустым (не содержать ни одного значения).
Интерфейс по работе с хранилищем должен быть реализован с использованием командной
строки. Имя исполняемого файла: db.
Документы хранятся в виде файлов в каталоге ./data (относительно местоположения
исполняемого файла db).
Для выполнения какого-либо действия с хранилищем должен быть запущен исполняемый
файл db с указанием команды и ее параметров.
Общий вид формата команд:
db <команда> <параметр1> <параметр2> … <параметрN>
После выполнения команды функция main должна возвращать EXIT_SUCCESS (в случае
успешной работы) либо EXIT_FAILURE (в случае ошибки) и возвращать управление ОС.
В случае ошибки программа должна распечатать сообщение о типе ошибки в стандартный
поток ошибок (stderr).
Необходимо реализовать следующие команды по работе с хранилищем:
Создать новый документ
сreateDoc <имя документа>
Создается пустой файл с именем <имя документа>.
Если документ с именем <имя документа> уже существует в хранилище – ошибка.
Удалить документ
deleteDoc <имя документа>
Файл с именем <имя документа> удаляется.
Если документ с именем <имя документа> не существует в хранилище – ошибка.
Удалить атрибут из документа
delAttr <имя документа> <имя атрибута>
Из документа с именем <имя документа> удаляется атрибут с именем <имя атрибута>.
Отсутствие документа или атрибута в документе является ошибкой.
Добавить атрибут в документ
insertAttr <имя документа> <имя атрибута> <значение атрибута>
Отсутствие документа и существование атрибута – ошибка.
Обновить значение атрибута в документе
updateAttr <имя документа> <имя атрибута> <значение атрибута>
Отсутствие документа или атрибута в документе – ошибка.
Найти все документы, содержащие заданное значение некоторого атрибута
findDocByAttrValue <имя атрибута> <значение атрибута>
На экран выводится список имен документов (через запятую), содержащих заданное
значение некоторого атрибута
Обновить (создать) индекс(дополнительная необязательная команда)
updateIndex
Обновляет (создает) файл индекса (путем удаления и создания заново). Индекс содержит
информацию о вхождении значений атрибутов в документы. Если файл индекса не
существовал на момент вызова updateIndex – это не является ошибкой.
Примечание: Если хранилище было проиндексировано (существует файл ./data/index.dat)
команда findDocByAttrValue должна использовать для поиска файл индекса, иначе ответ
должен быть дан на основе просмотра содержимого документов.
Примечание: для проверки на существование файла можно использовать проверку на
равенство 0 возвращаемого значения системного вызова POSIX stat.
Примечание: индекс обновляется (создается) только лишь командой updateIndex,
используется только лишь командой findDocByAttrValue. Команды редактирования /
удаления документов и атрибутов не изменяют индекс.
Примечание: использование некорректных имен (документов и атрибутов) также
является ошибкой и должно приводить к EXIT_FAILURE.
Примечание: имена документов и атрибутов являются чувствительными к регистру.
Формат хранения документа
{<имя
атрибута1>,значение1},{<имя
атрибута2>,значение2},…,{<имя
атрибутаN>,значениеN}
Примечание: значения хранятся в виде строки, заключенной в двойные кавычки, в случае,
если символ кавычки встречается в строке, он должен быть продублирован, например:
“Пьеса ““Вишневый сад“““.
Примеры файлов-документов:
Файл “ivanov”:
{lastName,”Ivanov”},{firstName,”Ivan”},{age,”25”}
Файл “petrov”:
{lastName,”Petrov”},{age,”25”}
Файл “sidorov”:
{lastName,”Sidorov”},{age,”27”}
Формат хранения индекса
{<имя атрибута1>,значение1,{<имя документа 11>, <имя документа 12>,…,<имя
документа 1N>},значение2,{<имя документа 21>, <имя документа 22>,…,<имя документа
2N>},…,значениеM,{<имя документа M1>,<имя документа M2>,…,<имя документа
MN>}},{<имя атрибута2>, …},…,{<имя атрибутаK>, …}
Пример файла-индекса:
{lastName,”Ivanov”,{ivanov},”Petrov”,{petrov},”Sidorov”,{sidorov}},{firstName,”Ivan”,{ivan
ov}},{age,”25”,{ivanov,petrov},”27”,{sidorov}}
Примечание:
Проверять корректность данных в файлах документов (и индекса) не требуется.
Считается, что эти файлы редактируются только с использованием db.
Примечание:
Для получения списка файлов каталога в POSIX (Portable Operating System Interface) ОС
можно использовать функцию readdir().
Требования к реализации
1. Хороший «Си»: продуманные прототипы
управления, структуры данных, модульность.
2
функций,
имена,
конструкции
2. Наличие комментариев, описывающих действия, выполняемые функцией, список
ее параметров и возвращаемое значение (можно использовать doxygen).
3. Наличие тестирующего покрытия в виде т.н. test case’ов, представляющих собой
сценарии использования методов программы. Test case можно писать в виде
обычных функций на Си, при этом будет полезен assert.h из стандартной
библиотеки. При желании при написании test case'ов можно использовать
библиотеку cunit, другой альтернативой является создание тестов на shell.
4. На основе п.2 и 3 должен быть составлен письменный отчет с описанием функций
программы (включая их распределение по модулям) и тестирующему покрытию
(список test case'ов с их описанием).
5. Приветствуется наличие makefile для сборки программы.
6. До сдачи программа должна быть отправлена по электронной почте на адрес:
prak@mlab.cs.msu.su (проверка на плагиат).
Срок выдачи задания: 18 сентября
Срок сдачи задания: 7 и 14 октября
3
Download