Администратор объектных данных
Администратор объектных данных (ODM) предназначен для хранения информации о системе. Эта информация представлена в виде объектов с набором свойств.
ODM может применяться и для работы с данными прикладных программ.
ODM хранит следующую информацию о системе:
- Информацию о конфигурации устройств
- Информацию для интерфейса SMIT (меню, опции и окна диалога)
- Реестров продуктов для процедур установки и обновления
- Информацию о конфигурации линий связи
- Информацию о ресурсах системы
Администратор объектных данных позволяет добавлять, блокировать, сохранять, изменять, считывать, просматривать и удалять объекты и классы объектов. Команды ODM предназначены для выполнения этих задач из командной строки. Функции ODM можно вызывать из приложений.
Некоторые классы объектов поставляются вместе с системой. Эти классы обсуждаются в документации по системным продуктам, к которым они относятся.
Хранение объектов и классов объектов ODM
Основными элементами ODM являются объекты и классы объектов. Для работы с объектами и классами применяются команды и функции ODM. Они позволяют создавать и добавлять классы объектов и объекты для хранения и управления данными.
| Термин | Описание |
|---|---|
| класс объектов | Группа объектов с общим определением. Класс объектов содержит один или несколько дескрипторов. Его структура аналогична таблице. Классы объектов, создаваемые командой odmcreate или функцией odm_create_class, сохраняются в виде определения массива структур на языке C. |
| объект | Элемент класса объектов. Предназначен для хранения данных и работы с ними. Он аналогичен логической записи базы данных. Объекты, добавляемые в класс с помощью команды odmadd или функции odm_add_obj, сохраняются в виде структур языка C в том же файле. Каталог для хранения таких файлов задается при создании класса объектов. |
Класс объектов можно рассматривать как массив структур, а объект - как структуру, которая является элементом массива. При добавлении объекта в класс его дескрипторам присваиваются некоторые значения. Для просмотра и изменения значений дескрипторов объектов в ODM предусмотрены специальные функции.
Ниже приведен пример работы с классом объектов и его представителями.
- Для создания класса объектов
Fictional_Characters введите:
class Fictional_Characters { char Story_Star[20]; char Birthday[20]; short Age; char Friend[20]; };В данном примере класс объектов Fictional_Characters содержит четыре дескриптора: Story_Star, Birthday и Friend типа char длиной не более 20 символов, а также Age типа short. Для создания файлов ODM, соответствующих описанному классу, необходимо обработать текстовый файл с помощью команды odmcreate или функции odm_create_class.
- После создания класса объектов в него можно добавить объекты с помощью команды
odmadd или функции odm_add_obj.
Например, вы можете ввести в команде
odmadd следующий текст для добавления объектов Золушка и
Белоснежка в класс Fictional_Characters с указанием
значений унаследованных ими дескрипторов:
Fictional_Characters: Story_Star = "Золушка" Birthday = "Однажды" Age = 19 Friend = "мышь" Fictional_Characters: Story_Star = "Белоснежка" Birthday = "Однажды" Age = 18 Friend = "Фея"Таблица Fictional_Characters показывает схему класса объектов Fictional_Characters с двумя объектами: Золушка и Белоснежка.
Табл. 1. Fictional Characters Story Star (char) Birthday (char) Age (short) Friend (char) Золушка Однажды 19 Мышь Белоснежка Однажды 18 Фея Данные, полученные для 'Story_Star = "Золушка"' Золушка: Birthday = Однажды Age = 19 Friend = Мышь - После создания класса объектов Fictional_Characters и добавления объектов Золушка и Белоснежка
для выражения 'Story_Star = "Золушка"' будут получены следующие сведения:
Золушка: Birthday = Однажды Age = 19 Friend = мышь
С помощью команд ODM
При создании или удалении класса объектов с помощью команды odmcreate или odmdrop нужно указывать каталог с файлом определения класса одним из следующих способов:
- Для записи файла в каталог по умолчанию, то есть /etc/objrepos, укажите $ODMDIR.
- Укажите путь к каталогу в переменной среды ODMDIR с помощью команды export.
- Вызовите команду unset для удаления значения переменной среды ODMDIR, а затем перейдите в каталог, выбранный для хранения классов объектов, с помощью команды cd. После этого вызовите команды ODM из этого каталога. Файл, определяющий классы, будет размещен в текущем каталоге.
При вызове команды odmdelete, odmadd, odmchange, odmshow или odmget для работы с классами и объектами укажите каталог с классами объектов одним из следующих способов:
- Для работы с классами объектов в каталоге по умолчанию /etc/objrepos, укажите переменную $ODMDIR
- Укажите путь к каталогу в переменной среды ODMDIR с помощью команды export.
- Сохраните в переменной среды ODMPATH список
каталогов, разделенных двоеточиями, в которых должен выполняться поиск классов
и объектов. Это можно сделать с помощью команды export. Например:
Поиск в каталогах из $ODMPATH выполняется только в том случае, если в каталоге, указанном в $ODMDIR, нет файла определения классов.$ export ODMPATH = /usr/lib/objrepos:/tmp/myrepos
Создание классов объектов
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
- Создайте определение одного или нескольких классов объектов в текстовом файле. В разделе Пример исходного кода и вывода ODM приведен пример такого файла с несколькими определениями.
- Укажите каталог для хранения созданных объектов.
В разделе "Хранение объектов и классов объектов ODM" описаны принципы выбора каталога для хранения объектов и классов при их создании. Большая часть системных объектов и классов объектов хранится в каталоге /usr/lib/objrepos.
Создайте пустой класс объектов с помощью команды odmcreate, указав текстовый файл с определениями классов объектов в качестве входного файла ClassDescriptionFile.
Добавление объектов в класс
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
- Создайте класс, в который будут добавляться объекты. Инструкции по выполнению этой задачи приведены в разделе Создание классов объектов.
- Создайте определения одного или нескольких объектов. В разделе Пример исходного кода и вывода ODM приведен пример текстового файла, содержащего несколько определений объектов.
- Укажите каталог для хранения созданных объектов.
В разделе "Хранение объектов и классов объектов ODM" описаны принципы выбора каталога для хранения объектов и классов при их создании. Большая часть системных объектов и классов объектов хранится в каталоге /usr/lib/objrepos.
- Добавьте объекты в класс с помощью команды odmadd, указав текстовый файл с определениями объектов в качестве входного файла InputFile.
Блокировка классов объектов
ODM не выполняет автоматической блокировки классов и объектов. За установку и снятие блокировок отвечает приложение, работающее с классами объектов. Для управления блокировкой объектов и классов в ODM предусмотрены функции odm_lock и odm_unlock.
| Функция | Описание |
|---|---|
| odm_lock | Обрабатывает строку, которая содержит путь к классу объектов или каталогу классов объектов. Функция возвращает идентификатор блокировки и устанавливает флаг, указывающий, что заданные объекты или классы используются. |
После установки флага блокировки функцией odm_lock другие процессы могут по-прежнему обращаться к классу объектов. Если существует вероятность конфликта, приложение должно явно проверять наличие флага и ожидать снятия блокировки перед тем, как обратиться к классу объектов.
Другое приложение не может установить блокировку для уже заблокированного объекта или каталога. Однако при блокировке каталога другое приложение может установить блокировку его подкаталога или файлов из этого каталога.
Для разблокирования класса объектов вызовите функцию odm_unlock, указав идентификатор блокировки, возвращенный функцией odm_lock.
Сохранение объектов и классов
Классы объектов, создаваемые командой odmcreate или функцией odm_create_class, сохраняются в виде определения массива структур на языке C. Объекты, добавляемые в класс с помощью команды odmadd или функции odm_add_obj, сохраняются в виде структур языка C в том же файле.
Каталог для хранения таких файлов задается при создании класса объектов.
Способ хранения зависит от способа создания классов и объектов (с помощью команд или функций).
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
С помощью функций odm_create_class и odm_add_obj
Функции odm_create_class и odm_add_obj применяются для создания классов и объектов:
- Если ваше приложение использует для хранения классов объектов каталог, отличный от
ODMDIR, измените значение этой переменной среды с помощью функции
odm_set_path.
Настоятельно
рекомендуется всегда вызывать эту функцию в приложении для настройки каталога
хранения при создании классов и объектов.
ИЛИ
- Перед запуском приложения вызовите команду set и задайте
необходимый каталог в переменной среды ODMDIR.
ИЛИ
- Сохраните файл в каталоге (/usr/lib/objrepos), который содержит большинство системных классов объектов.
Дескрипторы ODM
Дескриптор Администратора объектных данных (ODM) аналогичен переменной, у которой есть тип и имя. При создании класса объектов его дескрипторы определяются как переменные с типами дескрипторов ODM. При добавлении объекта в класс он получает копии всех дескрипторов своего класса. Значения присваиваются объявленным ранее дескрипторам объекта.
ODM поддерживает несколько типов дескрипторов:
| Описание | Определение |
|---|---|
| терминальный дескриптор | Определяет символьный или числовой тип данных. |
| дескриптор связи | Определяет связи между классами объектов. |
| дескриптор метода | Определяет операцию или метод объекта. |
Дескрипторы объектов и их значения применяются в качестве критериев выбора объектов из класса. Критерий выбора задается в формате, описанном в разделе Поиск объектов ODM. Терминальный дескриптор типа binary не может применяться в критериях поиска из-за его неопределенной длины.
Терминальные дескрипторы ODM
Терминальные дескрипторы соответствуют простым типам данных в ODM. Терминальный дескриптор является переменной, имеющий тип терминального дескриптора ODM. Поддерживаются следующие типы терминальных дескрипторов:
| Описание | Определение |
|---|---|
| short | 2-байтовое число со знаком. |
| long | 4-байтовое число со знаком. |
| ulong | Беззнаковое 4-байтовое число. |
| binary | Строка бит фиксированной длины. Тип binary является пользовательским типом, определенным на этапе создания ODM. Этот тип не может использоваться в критериях поиска. |
| char | Строка символов фиксированной длины, оканчивающаяся символом NULL. |
| vchar | Строка символов произвольной длины, оканчивающаяся символом NULL. Терминальный тип дескрипторов vchar может применяться в критериях поиска. |
| long64/ODM_LONG_LONG/int64 | 8-байтовое число со знаком. |
| ulong64/ODM_ULONG_LONG/uint64 | Беззнаковое 8-байтовое число. |
Дескриптор связи ODM
Дескриптор связи ODM определяет связь между объектами из разных классов. Дескриптор связи - это переменная, имеющая тип дескриптора связи ODM.
В следующем фрагменте кода создаются классы объектов Friend_Table и Fictional_Characters:
class Friend_Table {
char Friend_of[20];
char Friend[20];
};
class Fictional_Characters {
char Story_Star[20];
char Birthday[20];
short Age;
link Friend_Table Friend_Table Friend_of Friends_of;
};В классе объектов Fictional_Characters определен дескриптор связи между дескриптором Friends_of и классом объектов Friend_Table. При выборке объектов по этой ссылке ODM использует значение дескриптора Friends_of и выполняет поиск объектов класса Friend_Table с соответствующим значением дескрипторов Friend_of. Дескриптор связи класса объектов Fictional_Characters определяет класс, на который он ссылается (Friend_Table), дескриптор этого класса, с которым нужно создать связь (Friend_of), и исходный дескриптор (Friends_of) класса Fictional_Characters.
Ниже приведен пример определений объектов, которые могут быть добавлены в классы Fictional_Characters и Friend_Table:
Fictional_Characters:
Story_Star = "Золушка"
Birthday = "Однажды"
Age = 19
Friends_of = "Золушка"
Fictional_Characters:
Story_Star = "Белоснежка"
Birthday = "Однажды"
Age = 18
Friends_of = "Белоснежка"
Friend_Table:
Friend_of = "Золушка"
Friend = "Фея"
Friend_Table:
Friend_of = "Золушка"
Friend = "мышь" Friend_Table:
Friend_of = "Белоснежка"
Friend = "Ворчун" Friend_Table:
Friend_of = "Белоснежка"
Friend = "Соня" Friend_Table:
Friend_of = "Золушка"
Friend = "Принц" Friend_Table:
Friend_of = "Белоснежка"
Friend = "Счастливчик"Следующие таблицы иллюстрируют схему классов Fictional_Characters и Friend_Table, их объектов, а также связей между ними.
| Story_Star (char) | Birthday (char) | Age (short) | Friends_of (link) |
|---|---|---|---|
| Золушка | Однажды | 19 | Золушка |
| Белоснежка | Однажды | 18 | Белоснежка |
Данные для 'Story_Star = "Золушка"
Золушка:
Birthday = Однажды
Age = 19
Friends_of = Золушка
Friend_of = Золушка
Существует прямая связь между столбцами "Friends_of" и "Friend_of" этих таблиц. В следующей таблице приведен пример отношения связей двух классов объектов.
| Friend_of (char) | Friend (char) |
|---|---|
| Золушка | Фея |
| Золушка | Мышь |
| Белоснежка | Ворчун |
| Белоснежка | Соня |
| Золушка | Принц |
| Белоснежка | Счастливчик |
После создания классов Fictional_Characters и Friend_Table и добавления объектов поиск по критерию Story_Star = 'Золушка' даст следующие результаты:
Золушка:
Birthday = Однажды
Age = 19
Friends_of = Золушка
Friend_of = ЗолушкаДля того чтобы получить дополнительную информацию о связях между классами объектов, вызовите команду odmget для класса Friend_Table. Для условия Friend_of = 'Золушка' будут выданы следующие данные:
Friend_Table:
Friend_of = "Золушка"
Friend = "Фея"
Friend_Table:
Friend_of = "Золушка"
Friend = "мышь"
Friend_Table:
Friend_of = "Золушка"
Friend = "Принц"Дескриптор метода ODM
Дескриптор метода ODM позволяет определить класс объектов, содержащий методы или операции. Дескриптор метода - это переменная, имеющая тип дескриптора метода ODM.
Значением дескриптора метода или операции является строка символов, содержащая команду, программу или сценарий оболочки, который запускается при вызове метода. Для каждого объекта класса может быть определен индивидуальный метод. Сами операции не являются частью ODM - они определяются и создаются прикладным программистом.
Для вызова метода, связанного с объектом, предназначена функция odm_run_method. Вызов метода является блокирующей операцией - работа ODM приостанавливается до окончания операции.
Например, для создания класса объектов Supporting_Cast_Ratings можно задать следующее определение:
class Supporting_Cast_Ratings {
char Others[20];
short Dexterity;
short Speed;
short Strength;
method Do_This;
};В данном примере класс объектов Supporting_Cast_Ratings содержит дескриптор метода Do_This. Значением дескриптора метода может быть строка, задающая команду, программу или сценарий, вызываемый с помощью функции odm_run_method.
Ниже приведен пример добавления объектов в класс Supporting_Cast_Ratings:
Supporting_Cast_Ratings:
Friend = "Соня"
Dexterity = 1
Speed = 1
Strength = 3
Do_This = "echo Скорость Сони - 1"
Supporting_Cast_Ratings:
Others = "Фея"
Dexterity = 10
Speed = 10
Strength = 10
Do_This = "odmget -q "Others='Фея'" Supporting_Cast_Ratings"В следующей таблице приведена схема класса Supporting_Cast_Ratings с дескриптором метода Do_This и операциями, заданными для отдельных объектов этого класса.
| Others (char) | Dexterity (short) | Speed (short) | Stength (short) | Do_This (method) |
|---|---|---|---|---|
| Соня | 1 | 1 | 3 | echo Скорость Сони - 1 |
| Фея | 10 | 10 | 10 | odmget —q "Others='Фея'"Supporting_Cast_Ratings"
|
Метод odm_run_method объекта Соня выдает следующую строку
(с помощью команды echo):
"Скорость Сони = 1"После создания класса Supporting_Cast_Ratings и добавления объектов вызов метода (с помощью функции odm_run_method) объекта Соня приведет к тому, что команда echo напечатает текст:
Скорость Сони = 1Поиск объектов ODM
Во многих функциях ODM требуется выбрать для обработки один или несколько объектов заданного класса. При выборе объектов для определенных функций вы можете указать критерий поиска в форме спецификатора.
- qualifier
- В вызове функций ODM - строка, заканчивающаяся символом NULL, определяющая критерий выборки объектов.
Имена дескрипторов и условия выбора, заданные в этом параметре, определяют, какие объекты класса будут выбраны для дальнейшей обработки. Спецификатор содержит один или несколько предикатов, объединенных логическими операторами. Каждый предикат состоит из имени дескриптора, оператора сравнения и константы.
Ниже приведен пример спецификатора, содержащего три предиката, объединенных двумя логическими операторами:
SUPPNO=30 AND (PARTNO>0 AND PARTNO<101)В этом примере спецификатором является вся строка. Три предиката SUPPNO=30, PARTNO>0 и PARTNO<101 связаны логическим оператором AND. В первом предикате SUPPNO - имя дескриптора, = (знак равенства) - это оператор сравнения, а 30 - константа, с которой сравнивается значение дескриптора.
Каждый предикат задает ограничение на значения дескрипторов объектов класса. Выбираются все объекты, дескрипторы которых удовлетворяют указанному ограничению. Первый предикат указывает, что должны быть выбраны все объекты, у которых дескриптор (SUPPNO) равен (=) константе (30).
Часть спецификатора в скобках
PARTNO>0 AND PARTNO<101содержит два предиката, объединенных логической операцией AND (И). Эти предикаты указывают, что значение дескриптора PARTNO должно быть больше 0, но меньше 101. Это условие построено из двух предикатов, объединенных оператором И. Например, если дескриптор PARTNO обозначает номер детали в реестре компании, то вторая часть спецификатора определяет набор деталей с номерами от 0 до 101.
В другом примере спецификатор
lname='Smith' AND Company.Dept='099' AND Salary<2500позволяет выбрать всех служащих (все объекты ODM) с фамилией Иванов, работающих в отделе 099 и получающих зарплату менее 2500 долл. Обратите внимание на то, что имя дескриптора Dept указано со спецификатором класса Company для создания уникального идентификатора.
Имена дескрипторов в предикатах ODM
В ODM имя дескриптора не обязательно должно быть уникальным. Одно имя дескриптора может использоваться в нескольких классах. В этом случае для того, чтобы однозначно идентифицировать дескриптор, вместе с его именем указывается имя класса.
Операторы сравнения в предикатах ODM
Ниже приведен список допустимых операторов сравнения:
| Оператор | Определение |
|---|---|
| = | Равно |
| != | Не равно |
| > | Больше |
| >= | Больше или равно |
| < | Меньше |
| <= | Меньше или равно |
| LIKE | Поиск строк по шаблону |
Сравниваться могут только совместимые типы данных.
Оператор сравнения LIKE
Операция LIKE позволяет найти дескрипторы типа char, соответствующие заданному шаблону. Например, предикат
NAME LIKE 'ANNE'задает поиск значения ANNE в дескрипторах NAME всех объектов класса. Это выражение эквивалентно
NAME = 'ANNE'Оператор LIKE поддерживает следующие символы подстановки:
- Символ ? (вопросительный знак)
обозначает один символ. Предикат
задает критерий поиска трехбуквенных строк с символом A посередине в дескрипторе NAME объекта. Этому критерию удовлетворяют значения PAM, DAN и PAT.NAME LIKE '?A?' - Символ * (звездочка) обозначает произвольную строку из нуля
или более символов. Предикат
задает поиск значений, включающих текст ANNE, в дескрипторах NAME всех объектов класса. Этому критерию удовлетворяют значения LIZANNE, ANNETTE и ANNE.NAME LIKE '*ANNE*' - Символы [ ] (квадратные скобки) обозначают один из символов, заключенных в скобки. Предикат
задает поиск значений, начинающихся с символа S или T в дескрипторе NAME.NAME LIKE '[ST]*'Символ - (знак минус) позволяет задать диапазон значений. Предикат
задает поиск значений, начинающихся с символа A, D, E, F, G, S или T.NAME LIKE '[AD-GST]*' - Символы [!] (восклицательный знак в квадратных скобках) соответствуют любому
символу, кроме указанных в скобках. Предикат
задает поиск всех значений, кроме начинающихся с символа S или T, в дескрипторе NAME.NAME LIKE '[!ST]*'Критерий поиска может содержать любую комбинацию символов подстановки.
Константы в предикатах ODM
В предикате ODM можно указывать числовые и строковые константы:
- Числовые константы в предикатах ODM представляют собой число (с десятичной
точкой или без), перед которым может стоять знак минус, а после - символ
экспоненциальной записи E или e.
Если указан символ E или e,
после него должно стоять значение порядка, которое также может иметь знак.
Ниже приведены примеры допустимых числовых констант:
2 2.545 0.5 -2e5 2.11E0 +4.555e-10 4E0 -10 999 +42Значение E0 указывает отсутствие экспоненты.
-
Строковые константы в предикатах ODM должны быть заключены в одиночные кавычки:
'smith' '91'Строковые константы могут быть произвольной длины. Одинарные кавычки внутри строки символов нужно удваивать. Например:
'DON''T GO'обозначает строку
DON'T GO
Логический оператор AND в предикатах
В предикатах ODM может применяться логический оператор AND (И). Он может быть задан в форме AND или and.
Логический оператор AND может соединять несколько предикатов. Например, спецификатор
predicate1 AND predicate2 AND predicate3обозначает предикат-1, объединенный с предикатом-2, а затем - с предикатом-3.