[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Глава 17. Администратор объектных данных (ODM)

Администратор объектных данных (ODM) предназначен для хранения информации о системе. Эта информация представлена в виде объектов с набором свойств. ODM может применяться и для работы с данными прикладных программ.

ODM хранит следующую информацию о системе:

Администратор объектных данных позволяет добавлять, блокировать, сохранять, изменять, считывать, просматривать и удалять объекты и классы объектов. Команды ODM предназначены для выполнения этих задач из командной строки. Функции ODM можно вызывать из приложений.

Некоторые классы объектов поставляются вместе с системой. Эти классы обсуждаются в документации по системным продуктам, к которым они относятся.

В этой главе рассматриваются следующие вопросы:


Объекты и классы объектов ODM

Основными элементами ODM являются объекты и классы объектов. Для работы с объектами и классами применяются команды и функции ODM (Список команд и функций ODM). Они позволяют создавать и добавлять классы объектов и объекты для хранения и управления данными.

класс объектов Группа объектов с общим определением. Класс объектов содержит один или несколько дескрипторов (Дескрипторы ODM).
объект Элемент определенного ранее класса объектов, предназначенный для хранения данных и работы с ними.

Класс объектов можно рассматривать как массив структур, а объект - как структуру, которая является элементом массива. При добавлении объекта в класс его дескрипторам присваиваются некоторые значения. Для просмотра и изменения значений дескрипторов объектов в ODM предусмотрены специальные функции.

Ниже приведен пример работы с классом объектов и его представителями.

Пример:

  1. Для создания класса объектов 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.

  2. После создания класса объектов в него можно добавить объекты с помощью команды 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 с двумя объектами: Золушка и Белоснежка.


    Табл. 17-1. Схема класса объектов Fictional_Characters с объектами Золушка и Белоснежка

    Fictional Characters
    Имя (char) День рождения (char) Возраст (short) Друг (char)
    Золушка Однажды 19 Мышь
    Белоснежка Однажды 18 Жидкость для мытья посуды
    Данные, полученные для 'Story_Star = "Cinderella"'
         Золушка:
              Birthday        = Однажды
              Age             = 19
              Friend = Мышь
    
  3. После создания класса объектов Fictional_Characters и добавления объектов Золушка и Белоснежка для выражения 'Story_Star = "Золушка"' будут получены следующие сведения:

    Золушка:
            Birthday        = Однажды
            Age             = 19
            Friend          = Мышь
    

Создание классов объектов

Предварительные требования

Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
  1. Создайте определение одного или нескольких классов объектов в текстовом файле. В разделе Пример исходного кода и вывода ODM приведен пример такого файла с несколькими определениями.
  2. Укажите каталог для хранения созданных объектов.

В разделе "Хранение объектов и классов объектов ODM" описаны принципы выбора каталога для хранения объектов и классов при их создании. Большая часть системных объектов и классов объектов хранится в каталоге /usr/lib/objrepos.

Процедура

Создайте пустой класс объектов с помощью команды odmcreate, указав текстовый файл с определениями классов объектов в качестве входного файла ClassDescriptionFile.

Добавление объектов в класс

Предварительные требования

Внимание: Изменение файлов, определяющих системные классы и объекты, может привести к появлению неполадок в системе. Обратитесь к администратору перед тем, как использовать каталог /usr/lib/objrepos для хранения объектов и классов.
  1. Создайте класс, в который будут добавляться объекты. Инструкции по выполнению этой задачи приведены в разделе Создание классов объектов.
  2. Создайте определения одного или нескольких объектов. В разделе Пример исходного кода и вывода ODM приведен пример текстового файла, содержащего несколько определений объектов.
  3. Укажите каталог для хранения созданных объектов.

В разделе "Хранение объектов и классов объектов 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

При создании или удалении класса объектов с помощью команды odmcreate или odmdrop нужно указывать каталог с файлом определения класса одним из следующих способов:

  1. Для записи файла в каталог по умолчанию, то есть /usr/lib/objrepos, укажите $ODMDIR.
  2. Укажите путь к каталогу в переменной среды ODMDIR с помощью команды set.
  3. Вызовите команду unset для удаления значения переменной среды ODMDIR, а затем перейдите в каталог, выбранный для хранения классов и объектов, с помощью команды cd. После этого вызовите команды ODM из этого каталога. Файл, определяющий классы и объекты, будет размещен в текущем каталоге.

При вызове команды odmdelete, odmadd, odmchange, odmshow или odmget для работы с классами и объектами укажите каталог с файлом определения класса одним из следующих способов:

  1. Для записи файла в каталог по умолчанию, то есть /usr/lib/objrepos, укажите $ODMDIR.
  2. Укажите путь к каталогу в переменной среды ODMDIR с помощью команды set.
  3. Вызовите команду unset для удаления значения переменной среды ODMDIR, а затем перейдите в каталог, выбранный для хранения классов и объектов, с помощью команды cd. После этого вызовите команды ODM из этого каталога. Файл, определяющий классы и объекты, будет размещен в текущем каталоге.
  4. Сохраните в переменной среды ODMPATH список каталогов, разделенных двоеточиями, в которых должен выполняться поиск классов и объектов. Это можно сделать с помощью команды set. Например:

    $ export ODMPATH = /usr/lib/objrepos:/tmp/myrepos
    

    Поиск в каталогах из $ODMPATH выполняется только в том случае, если файл определения классов не найден в каталоге, заданном в переменной $ODMDIR.

С помощью функций odm_create_class и odm_add_obj

Функции odm_create_class и odm_add_obj применяются для создания классов и объектов:


Дескрипторы ODM

Дескриптор Администратора объектных данных (ODM) аналогичен переменной, у которой есть тип и имя. При создании класса объектов его дескрипторы определяются как переменные с типами дескрипторов ODM. При добавлении объекта в класс он получает копии всех дескрипторов своего класса. Значения присваиваются объявленным ранее дескрипторам объекта.

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, их объектов и связей между ними.


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 - они определяются и создаются прикладным программистом.

Для вызова метода, связанного с объектом, предназначена функция 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 требуется выбрать для обработки один или несколько объектов заданного класса. При выборе объектов для определенных функций вы можете указать критерий поиска в форме спецификатора.

спецификатор В вызове функций 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

В ODM имя дескриптора не обязательно должно быть уникальным. Одно имя дескриптора может использоваться в нескольких классах. В этом случае для того, чтобы однозначно идентифицировать дескриптор, вместе с его именем указывается имя класса.

Операторы сравнения в предикатах ODM

Ниже приведен список допустимых операторов сравнения:

= Равно
!= Не равно
> Больше
>= Больше или равно
< Меньше
<= Меньше или равно
LIKE Поиск строк по шаблону

Сравниваться могут только совместимые типы данных.

Оператор сравнения LIKE

Операция LIKE позволяет найти дескрипторы типа char, соответствующие заданному шаблону. Например, предикат

NAME LIKE 'ANNE'

задает поиск значения ANNE в дескрипторах NAME всех объектов класса. Это выражение эквивалентно

NAME = 'ANNE'

Оператор LIKE поддерживает следующие символы подстановки:

Константы в предикатах ODM

В предикате ODM можно указывать числовые и строковые константы.

Числовые константы в предикатах ODM

Числовые константы в предикатах ODM представляют собой число (с десятичной точкой или без), перед которым может стоять знак минус, а после - символ экспоненциальной записи E или e. Если символ указан, после него должно стоять значение порядка, которое также может быть со знаком.

Ниже приведены примеры допустимых числовых констант:

2            2.545   0.5   -2e5   2.11E0
+4.555e-10   4E0     -10    999   +42

Значение E0 указывает отсутствие экспоненты.

Строковые константы в предикатах ODM

Строковые константы в предикатах ODM должны быть заключены в одиночные кавычки:

'smith'   '91'

Строковые константы могут быть произвольной длины. Одинарные кавычки внутри строки символов нужно удваивать. Например:

'DON''T GO'

обозначает строку

DON'T GO

Логический оператор AND в предикатах

В предикатах ODM может применяться логический оператор AND (И). Он может быть задан в форме AND или and.

Логический оператор AND может соединять несколько предикатов. Например, спецификатор

предикат-1 AND предикат-2 AND предикат-3

обозначает предикат-1, объединенный с предикатом-2, а затем - с предикатом-3.

Связанная информация

Список команд и функций ODM

Пример исходного кода и вывода 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.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]