Информация об объектах, описанных в LSB
Для стандарта LSB в качестве хранилища объектов, описываемых стандартом, основной информации о них и связей между ними используется так называемая база данных стандарта LSB (LSB Specification Database). Более точно, в этой базе данных содержится информация о следующих объектах:
- библиотеки (таблица Library);
- классы (таблица ClassInfo);
- интерфейсы - LSB является бинарным стандартом и описывает интерфейсы, предоставляемые каждой библиотекой. Все интерфейсы хранятся в таблице Interface и могут иметь следующие типы:
- Function (функции);
- Data (данные);
- Common ("общие интерфейсы", к которым относятся stdin, stdout и им подобные);
- Alias (интерфейсы, являющиеся синонимами других интерфейсов);
- заголовочные файлы (таблица Header);
- константы (таблица Constant);
- типы данных (таблица Type);
- команды (таблица Command; под командами здесь понимаются как встроенные команды shell, так и различные утилиты);
- секции исполняемых файлов формата ELF (таблицы ElfSections и SectionTypes);
- теги rpm-файлов (таблица RpmTag).
Рис.1.ER-диаграмма сущностей, описываемых стандартом LSB.
Также в базе данных хранятся связи между указанными объектами - каждая константа привязана к заголовочному файлу, в котором она объявляется, интерфейс - к библиотеке, в которой он содержится, либо к классу, если это метод класса, и т.д. ER-диаграмма существующей базы данных приведена на Рис. 1. Все сущности группируются в так называемые модули согласно своему назначению (например, модуль LSB_Сpp содержит все, относящееся к стандартной библиотеке C++, LSB_Toolkit_Qt3 - все, относящееся к библиотеке Qt3, и т.д.). Информация о форматах файлов ELF и RPM относится к модулю LSB_Core, однако база данных этого факта никак не отражает - об этом "знают" только скрипты, генерирующие текст стандарта.
Связи типа "многие ко многим" реализуются посредством использования отдельных таблиц. Самой сложной структурой обладает взаимосвязь таблиц ClassInfo и Interface. Для ее реализации используется несколько вспомогательных таблиц, содержащих информацию о виртуальных таблицах класса (таблица Vtable; каждый класс может иметь одну либо две виртуальные таблицы) и о наследовании (таблица BaseTypes реализует обычное наследование, при описании множественного наследования используется также таблица VMIBaseTypes).
Для удобства интерфейсы и классы, входящие в одну библиотеку, разбиваются на группы согласно их назначению.
Информация о таких группах, на которые разбиваются библиотеки, содержится в таблице LibGroup. Так, например, библиотека librt (функции реального времени) разделена на три группы:
- Shared Memory Objects (функции для работы с разделяемой памятью);
- Clock (функции для работы с часами);
- Timers (функции для работы с таймерами).
- accepted_reply (типы, которые описывают ответ на rpc-запрос, принятый сервером);
- rejected_reply (типы, которые описывают ответ на rpc-запрос, отвергнутый сервером);
- reply_body (типы, описывающие тело ответа на rpc-запрос);
- call_body (типы, описывающие тело rpc-запроса);
- rpc_msg (типы, описывающие весь rpc-запрос);
- base types (основные типы);
- default HeaderGroup (сюда относится все, не вошедшее в перечисленные выше группы).