Администратор объектных данных (ODM) предназначен для хранения информации о системе. Эта информация представлена в виде объектов с набором свойств. ODM может применяться и для работы с данными прикладных программ.
ODM хранит следующую информацию о системе:
Администратор объектных данных позволяет добавлять, блокировать, сохранять, изменять, считывать, просматривать и удалять объекты и классы объектов. Команды ODM предназначены для выполнения этих задач из командной строки. Функции ODM можно вызывать из приложений.
Некоторые классы объектов поставляются вместе с системой. Эти классы обсуждаются в документации по системным продуктам, к которым они относятся.
В этой главе рассматриваются следующие вопросы:
Основными элементами ODM являются
объекты и классы объектов. Для работы с объектами и классами
применяются команды и функции ODM (Список команд и функций ODM). Они позволяют создавать и добавлять классы объектов
и объекты для хранения и управления данными.
класс объектов | Группа объектов с общим определением. Класс объектов содержит один или несколько дескрипторов (Дескрипторы ODM). |
объект | Элемент определенного ранее класса объектов, предназначенный для хранения данных и работы с ними. |
Класс объектов можно рассматривать как массив структур, а объект - как структуру, которая является элементом массива. При добавлении объекта в класс его дескрипторам присваиваются некоторые значения. Для просмотра и изменения значений дескрипторов объектов в ODM предусмотрены специальные функции.
Ниже приведен пример работы с классом объектов и его представителями.
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.
Fictional_Characters: Story_Star = "Золушка" Birthday = "Однажды" Age = 19 Friend = "мышь" Fictional_Characters: Story_Star = "Белоснежка" Birthday = "Однажды" Age = 18 Friend = "Жидкость для мытья посуды"
Таблица Fictional_Characters показывает схему класса объектов Fictional_Characters с двумя объектами: Золушка и Белоснежка.
Табл. 17-1. Схема класса объектов Fictional_Characters с объектами Золушка и Белоснежка
Fictional Characters | |||
Имя (char) | День рождения (char) | Возраст (short) | Друг (char) |
Золушка | Однажды | 19 | Мышь |
Белоснежка | Однажды | 18 | Жидкость для мытья посуды |
Данные, полученные для 'Story_Star = "Cinderella"' Золушка: Birthday = Однажды Age = 19 Friend = Мышь
Золушка: Birthday = Однажды Age = 19 Friend = Мышь
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
В разделе "Хранение объектов и классов объектов ODM" описаны принципы выбора каталога для хранения объектов и классов при их создании. Большая часть системных объектов и классов объектов хранится в каталоге /usr/lib/objrepos.
Создайте пустой класс объектов с помощью команды odmcreate, указав текстовый файл с определениями классов объектов в качестве входного файла ClassDescriptionFile.
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
В разделе "Хранение объектов и классов объектов ODM" описаны принципы выбора каталога для хранения объектов и классов при их создании. Большая часть системных объектов и классов объектов хранится в каталоге /usr/lib/objrepos.
Добавьте объекты в пустой класс с помощью команды odmadd, указав текстовый файл с определениями объектов в качестве входного файла InputFile.
ODM не выполняет автоматической
блокировки классов и объектов. За установку и снятие блокировок
отвечает приложение, работающее с классами объектов. Для управления
блокировкой объектов и классов в ODM предусмотрены функции odm_lock
и odm_unlock.
После установки флага блокировки функцией odm_lock другие процессы могут по-прежнему обращаться к классу объектов. Если существует вероятность конфликта, приложение должно явно проверять наличие флага и ожидать снятия блокировки перед тем, как обратиться к классу объектов.
Другое приложение не может установить блокировку для уже заблокированного объекта или каталога. Однако при блокировке каталога другое приложение может установить блокировку его подкаталога или файлов из этого каталога.
Для разблокирования класса объектов вызовите функцию odm_unlock, указав идентификатор блокировки, возвращенный функцией odm_lock.
Классы объектов, создаваемые командой odmcreate или функцией odm_create_class, сохраняются в виде определения массива структур на языке C. Объекты, добавляемые в класс с помощью команды odmadd или функции odm_add_obj, сохраняются в виде структур языка C в том же файле.
Каталог для хранения таких файлов задается при создании класса объектов.
Способ хранения зависит от способа создания классов и объектов (с помощью команд или функций).
Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
При создании или удалении класса объектов с помощью команды odmcreate или odmdrop нужно указывать каталог с файлом определения класса одним из следующих способов:
При вызове команды odmdelete, odmadd, odmchange, odmshow или odmget для работы с классами и объектами укажите каталог с файлом определения класса одним из следующих способов:
$ export ODMPATH = /usr/lib/objrepos:/tmp/myrepos
Поиск в каталогах из $ODMPATH выполняется только в том случае, если файл определения классов не найден в каталоге, заданном в переменной $ODMDIR.
Функции odm_create_class и odm_add_obj применяются для создания классов и объектов:
Дескриптор Администратора объектных данных (ODM) аналогичен переменной, у которой есть тип и имя. При создании класса объектов его дескрипторы определяются как переменные с типами дескрипторов ODM. При добавлении объекта в класс он получает копии всех дескрипторов своего класса. Значения присваиваются объявленным ранее дескрипторам объекта.
ODM поддерживает несколько типов
дескрипторов:
дескриптор терминала (Терминальные дескрипторы ODM) | Определяет символьный или числовой тип данных. |
дескриптор связи (Дескриптор связи ODM) | Определяет связи между классами объектов. |
дескриптор метода (Дескриптор метода ODM) | Определяет операцию или метод объекта. |
Дескрипторы объектов и их значения применяются в качестве критериев выбора объектов из класса. Критерий выбора задается в формате, описанном в разделе Поиск объектов ODM. Терминальный дескриптор типа binary не может применяться в критериях поиска из-за его неопределенной длины.
Терминальные
дескрипторы соответствуют простым типам данных в ODM.
Терминальный дескриптор является переменной, имеющий тип терминального
дескриптора 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, их объектов и связей между ними.
Fictional_Characters | |||
Story_Star (char) | Birthday (char) | Age (short) | Friends_of (link) |
Золушка | Однажды | 19 | Золушка |
Белоснежка | Однажды | 18 | Белоснежка |
Данные для 'Story_Star = "Cinderella" Золушка: Birthday = Однажды Age = 19 Friends_of = Золушка Friend_of = Золушка
Существует прямая связь между столбцами "Friends_of" и "Friend_of" этих таблиц.
Friend_Table |
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_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='Fairy Godmother'" Supporting_Cast_Ratings"
В таблице Supporting_Cast_Ratings приведена схема класса Supporting_Cast_Ratings с дескриптором метода Do_This и операциями, заданными для отдельных объектов этого класса.
Supporting_Cast_Ratings |
Others (char) | Dexterity (short) | Speed (short) | Stength (short) | Do_This (method) |
Соня | 1 | 1 | 3 | Скорость Сони - 1 |
Жидкость для мытья посуды | 10 | 10 | 10 | odmget --q "Others='Fairy Godmother'"Supporting_Cast_Ratings" |
Метод odm_run_method объекта Соня выдает следующую строку (с помощью команды echo): "Скорость Сони = 1"
Схема класса объектов с дескриптором метода
После создания класса Supporting_Cast_Ratings и добавления объектов вызов метода (с помощью функции odm_run_method) объекта Соня приведет к тому, что команда echo напечатает текст:
Скорость Сони = 1
Во многих функциях ODM требуется
выбрать для обработки один или несколько объектов заданного класса. При
выборе объектов для определенных функций вы можете указать критерий поиска в
форме спецификатора.
спецификатор | В вызове функций 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='Иванов' AND Company.Dept='099' AND Salary<2500
позволяет выбрать всех служащих (все объекты ODM) с фамилией Иванов, работающих в отделе 099 и получающих зарплату менее 2500 долл. Обратите внимание на то, что имя дескриптора Dept указано со спецификатором класса Company для создания уникального идентификатора.
В ODM имя дескриптора не обязательно должно быть уникальным. Одно имя дескриптора может использоваться в нескольких классах. В этом случае для того, чтобы однозначно идентифицировать дескриптор, вместе с его именем указывается имя класса.
Ниже приведен список допустимых
операторов сравнения:
= | Равно |
!= | Не равно |
> | Больше |
>= | Больше или равно |
< | Меньше |
<= | Меньше или равно |
LIKE | Поиск строк по шаблону |
Сравниваться могут только совместимые типы данных.
Операция LIKE позволяет найти дескрипторы типа char, соответствующие заданному шаблону. Например, предикат
NAME LIKE 'ANNE'
задает поиск значения ANNE в дескрипторах NAME всех объектов класса. Это выражение эквивалентно
NAME = 'ANNE'
Оператор LIKE поддерживает следующие символы подстановки:
NAME LIKE '?A?'
задает критерий поиска трехбуквенных строк с символом A посередине в дескрипторе NAME объекта. Этому критерию удовлетворяют значения PAM, DAN и PAT.
NAME LIKE '*ANNE*'
задает поиск значений, включающих текст ANNE, в дескрипторах NAME всех объектов класса. Этому критерию удовлетворяют значения LIZANNE, ANNETTE и ANNE.
NAME LIKE '[ST]*'
задает поиск значений, начинающихся с символа S или T, в дескрипторе NAME.
Символ - (знак минус) позволяет задать диапазон значений. Предикат
NAME LIKE '[AD-GST]*'
задает поиск значений, начинающихся с символа A, D, E, F, G, S или T.
NAME LIKE '[!ST]*'
задает поиск значений, начинающихся с любого символа, кроме S и T, в дескрипторе NAME.
Критерий поиска может содержать любую комбинацию символов подстановки.
В предикате ODM можно указывать числовые и строковые константы.
Числовые константы в предикатах ODM представляют собой число (с десятичной точкой или без), перед которым может стоять знак минус, а после - символ экспоненциальной записи 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
В предикатах ODM может применяться логический оператор AND (И). Он может быть задан в форме AND или and.
Логический оператор AND может соединять несколько предикатов. Например, спецификатор
предикат-1 AND предикат-2 AND предикат-3
обозначает предикат-1, объединенный с предикатом-2, а затем - с предикатом-3.
Пример исходного кода и вывода ODM
ODM Error Codes в книге AIX 5L Version 5.1 Technical Reference
Функция odm_run_method
Команды odmadd, odmchange, odmcreate, odmdelete, odmdrop, odmget, odmshow
Функции odm_create_class, odm_add_obj.