对象数据管理器

对象数据管理器 (ODM) 是用于存储系统信息的数据管理器。 信息作为带有相关特性的对象被存储和维护。

您也能使用 ODM 管理应用程序的数据。

ODM 管理的系统数据包括:

  • 设备配置信息
  • SMIT(菜单、选择器和对话框)的显示信息
  • 安装和更新过程的重要产品数据
  • 通信配置信息
  • 系统资源信息

您能使用 ODM 创建、添加、锁定、存储、更改、获取、显示、删除和丢弃对象和对象类。 ODM 命令为这些函数提供命令行接口。 ODM 子例程从应用程序中访问这些函数。

为系统提供了一些对象类。 在提供这些对象类的特定系统产品的文档中讨论了这些对象类。

ODM 对象类和对象存储

ODM 的基本组件是对象类和对象。 要管理对象类和对象,您可以使用 ODM 命令和子例程。 特别是,您可使用这些接口的创建和添加功能来构建存储和管理您自己的数据的对象类。

术语 描述
对象类 (object class) 一组有相同定义的对象。 对象类由一个或者多个描述符组成。 它与表相似。 您使用 odmcreate 命令或者 odm_create_class 子例程创建的每一个对象类均被作为结构数组的 C 语言定义存储在文件中。
对象 对象类的成员。 它是需要存储和管理数据的实体。 它与数据库中的逻辑记录类似。

您使用 odmadd 命令或者 odm_add_obj 子例程添加到对象类中的每个对象被作为 C 语言结构存储在同一个文件中。 创建对象类时,您确定要存储此文件的目录。

对象类在概念上与结构数组类似,每一个对象是一个结构,该结构是数组元素。 当对象被添加到对象类中时,会将值与对象描述符关联。 对象描述符和它们的关联值可以使用 ODM 工具定位和更改。

下面是操作对象类和对象的示例。

  1. 创建名为Fictional_Characters,请输入:
    class Fictional_Characters {
            char    Story_Star[20];
            char    Birthday[20];
            short   Age;
            char    Friend[20];
    };

    在此示例中, Fictional_Characters对象类包含四个描述符:Story_Star,BirthdayFriend,其描述符类型为字符,最大长度为 20 个字符; 以及Age,描述符类型为 short。 要创建 ODM 所需的对象类文件,您可以使用 odmcreate 命令或者 odm_create_class 子例程处理此文件。

  2. 一旦您创建对象类,您可以使用 odmadd 命令或者 odm_add_obj 子例程将对象添加到类。 例如,使用 odmadd 命令输入以下代码以添加对象CinderellaSnow WhiteIBM Think 大会之Fictional_Characters对象类以及它们继承的描述符的值:
    Fictional_Characters:
            Story_Star      = "Cinderella"
            Birthday        = "Once upon a time"
            Age             = 19
            Friend          = "mice"
    
    Fictional_Characters:
            Story_Star = "Snow White"
            Birthday = "Once upon a time"
            Age = 18
            Friend = "Fairy Godmother"

    Fictional_字符表显示了Fictional_Characters具有两个添加的对象的对象类CinderellaSnow White.

    表 1. 虚构的人物
    Story Star (char) Birthday (char) Age (short) Friend (char)
    Cinderella Once upon a time 19 Mice
    Snow White Once upon a time 18 Fairy Godmother
    Retrieved data for 'Story_Star = "Cinderella"'
         Cinderella:
              Birthday = Once upon a time
              Age = 19
              Friend = Mice
  3. 之后Fictional_Characters创建对象类并创建对象CinderellaSnow White添加,检索到的数据'Story_Star = "Cinderella"'是:
    Cinderella:
            Birthday        = Once upon a time
            Age             = 19
            Friend          = mice

使用 ODM 命令

使用 odmcreateodmdrop 命令创建或删除对象类时,请使用下列其中一项来指定将从其中访问类定义文件的目录:

  1. 将文件存储在 $ODMDIR指示的缺省目录中,即 /etc/objrepos 目录。
  2. 使用 export 命令来设置 ODMDIR 环境变量以指定存储目录。
  3. 使用 unset 命令来取消设置 ODMDIR 环境变量和 cd 命令,以将当前目录更改为要存储对象类的目录。 然后,在该目录中运行 ODM 命令。 定义对象类的文件将被存储在当前目录下。

使用 odmdeleteodmaddodmchange时, odmshowodmget 命令以使用类和对象,使用下列其中一项来指定包含对象类的目录:

  1. $ODMDIR 指示的缺省目录(即 /usr/lib/objrepos 目录)中的对象类一起工作。
  2. 使用 export 命令设置 ODMDIR 环境变量来指定目录。
  3. 从命令行使用 export 命令将 ODMPATH 环境变量设为一个字符串,该字符串包含将在其中搜索对象类的、用冒号隔开的目录的列表。 例如:
    $ export ODMPATH = /usr/lib/objrepos:/tmp/myrepos
    仅当 $ODMDIR 所指定的目录中不包含对象类时,才搜索 $ODMPATH 中的目录。

创建对象类

注意:更改定义系统对象类和对象的文件可能造成系统问题。 在使用 /usr/lib/objrepos 目录作为对象类和对象的存储目录之前,请咨询您的系统管理员。

  1. 在 ASCII 文件中创建一个或者多个对象类的定义。 ODM 示例代码和输出 显示了包含多个对象类定义的 ASCII 文件。
  2. 指定了生成的对象必须存储的目录。

"ODM 对象类和 Object Storage" 讨论了在对象类创建时用于确定要在其中存储生成的对象类和对象的目录的条件。 大多数系统对象类和对象都存储在 /usr/lib/objrepos 目录下。

运行odmcreate命令,并将对象类定义的 ASCII 文件指定为ClassDescriptionFile输入文件,即可生成一个空对象类。

将对象添加到对象类

注意:更改定义系统对象类和对象的文件可能造成系统问题。 在使用 /usr/lib/objrepos 目录作为对象类和对象的存储目录之前,请咨询您的系统管理员。

  1. 创建将添加对象的目标对象类。 有关创建对象类的指示信息,请参阅 创建对象类
  2. 创建一个或者多个对象的定义。 ODM 示例代码和输出 显示了包含多个对象定义的 ASCII 文件。
  3. 指定包含对象类的目录,生成的对象将被存储到该对象类中。

    "ODM 对象类和 Object Storage" 讨论在对象类创建时用于确定用于存储生成的对象类和对象的目录的条件。 大多数系统对象类和对象都存储在 /usr/lib/objrepos 目录下。

  4. 通过运行带有指定为 InputFile 输入文件的对象定义的 ASCII 文件的 odmadd 命令,将对象添加到对象类。

锁定对象类

ODM 并不隐式锁定对象类或者对象。 协调锁定和解锁是访问对象类的应用程序的职责。 但是,ODM 提供 odm_lockodm_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_classodm_add_obj 子例程用于创建对象类和对象:

  • 如果您的应用程序有特定的要求要存储非 ODMDIR 环境变量所指定的对象类,请使用 odm_set_path 子例程重置路径。 强烈建议您在从应用程序创建对象类或者对象时,使用此子例程显式设置存储路径。

  • 在运行您的应用程序之前,请从命令行使用 set 命令设置 ODMDIR 环境变量以指定存储目录。

  • 将文件存储在用于存储许多系统对象类 ( /usr/lib/objrepos 目录) 的对象存储库中。

ODM 描述符

对象数据管理器 (ODM) 描述符在概念上与带有名称和类型的变量相似。 创建对象类时,用关联的 ODM 描述符类型象变量名一样定义其描述符。 当对象被添加到对象类中时,它获得所有对象类描述符的副本。 值也与已声明的对象描述符关联。

ODM 支持多种描述符类型:

描述信息 定义
终端描述符 定义字符或者数字数据类型。
链接描述符 定义对象类之间的关系
方法描述符 定义对象的操作或者方法

使用对象描述符及其关联的值定义从对象类中检索个别对象的条件。 按照 ODM 对象搜索中的定义,格式化传递到 ODM 的选择条件。 不要因为 binary 终端描述符的任意长度而在搜索条件中使用它。

ODM 终端描述符

终端描述符定义 ODM 使用的最原始的数据类型。 终端描述符主要是用 ODM 终端描述符类型定义的变量。 ODM 提供的终端描述符类型有:

描述信息 定义
简短 指定有符号的 2 字节数字。
长整型 指定有符号的 4 字节数字。
ulong 指定无符号的 4 字节数字。
二元 指定固定长度二进制位串。 二进制终端描述符类型是在创建 ODM 时由用户定义的。 二进制终端描述符类型不可用于选择标准。
char 指定固定长度以 null 结束的字符串。
vchar 指定可变长度以 null 结束的字符串。 vchar 终端描述符类型可用于选择标准。
long64/ODM_LONG_LONG/int64 指定有符号的 8 字节数字。
ulong64/ODM_ULONG_LONG/uint64 指定无符号的 8 字节数字。

ODM 链接描述符

ODM 链接描述符在对象类中的对象和另一个对象类中的对象之间建立关系。 链接描述符是用 ODM 链接描述符类型定义的变量。

例如,下面的代码可通过 ODM 创建工具处理以生成 Friend_TableFictional_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_则字符 对象类使用链接描述符使 友好 描述符链接到Friend_Table对象类。 为了解析链路,Friends_of 描述符使用其 Friend_of 描述符中的匹配数据检索 Friend_Table 对象类中的对象。 Fictional_Characters 对象类中的链接描述符定义了 Fictional_Characters 对象类中正被链接到的类 (Friend_Table)、正被链接到的描述符 (Friend_of) 和链接描述符名 (Friends_of)。

下面的代码可用于将对象添加到 Fictional_CharactersFriend_Table 对象类:

Fictional_Characters:
        Story_Star      = "Cinderella"
        Birthday        = "Once upon a time"
        Age             = 19
        Friends_of      = "Cinderella"
Fictional_Characters:
        Story_Star      = "Snow White"
        Birthday        = "Once upon a time"
        Age             = 18
        Friends_of      = "Snow White"
Friend_Table:
        Friend_of       = "Cinderella"
        Friend          = "Fairy Godmother"
Friend_Table:
        Friend_of       = "Cinderella"
        Friend          = "mice"
Friend_Table:
        Friend_of       = "Snow White"
        Friend          = "Sneezy"
Friend_Table:
        Friend_of       = "Snow White"
        Friend          = "Sleepy"
Friend_Table:
        Friend_of       = "Cinderella"
        Friend          = "Prince"
Friend_Table:
        Friend_of       = "Snow White"
        Friend          = "Happy"

下面的表显示了 Fictional_CharactersFriend_Table 对象类、添加到类中的对象以及它们之间的链接关系的概念图。

Story_Star (char) Birthday (char) Age (short) Friends_of (link)
Cinderella Once upon a time 19 Cinderella
Snow White Once upon a time 18 Snow White
Retrieved data for 'Story_Star = "Cinderella"
     Cinderella:
          Birthday = Once upon a time
          Age = 19
          Friends_of = Cinderella
          Friend_of = Cinderella  

在两个表的“Friends_of”和“Friend_of”列之间有直接链接。 下表提供了两个对象类之间的链接关系的概念图。

Friend_of (char) Friend (char)
Cinderella Fairy Godmother
Cinderella mice
Snow White Sneezy
Snow White Sleepy
Cinderella Prince
Snow White Happy

创建 Fictional_字符friend_Table 对象类并添加对象后,将检索到以下对象的数据:Story_Star = 'Cinderella'将是:

Cinderella:
        Birthday         = Once upon a time
        Age              = 19
        Friends_of       = Cinderella
        Friend_of        = Cinderella

要查看链接对象类之间的扩展关系,请在 friend_Table 对象类上使用 odmget 命令。 检索到的数据Friend_of = 'Cinderella'对象类将为:

Friend_Table:
        Friend_Of = "Cinderella"
        Friend = "Fairy Godmother"

Friend_Table:
        Friend_of = "Cinderella"
        Friend= "mice"

Friend_Table:
        Friend_of = "Cinderella"
        Friend = "Prince"

ODM 方法描述符

ODM 方法描述符定义对象类,该对象类的对象可具有关联方法或者操作。 方法描述符是用 ODM 方法描述符类型定义的变量。

对象的操作或者方法描述符值是字符串,它可以是任何命令、程序或者方法调用所运行的 shell 脚本。 可为对象类中的每个对象定义不同的方法或者操作。 操作本身不是 ODM 的一部分;它们由应用程序员定义并编写代码。

对象的方法通过调用 odm_run_method 子例程来调用。 调用方法是同步事件,导致 ODM 操作停止直到完成操作。

例如,下面的代码能被输入到 ODM 创建工具以生成 Supporting_Cast_Ratings 对象类:

class Supporting_Cast_Ratings {
        char    Others[20];
        short   Dexterity;
        short   Speed;
        short   Strength;
        method  Do_This;
};

在示例中,Do_This描述符是为 Supporting_Cast_Ratings 对象类定义的方法描述符。 方法描述符的值可以是指定命令,程序或 shell 脚本以供 odm_run_method 子例程将来调用的字符串。

下面的代码是如何将对象添加到 Supporting_Cast_Ratings 对象类的示例:

Supporting_Cast_Ratings:
        Others          = "Sleepy"
        Dexterity       = 1
        Speed           = 1
        Strength        = 3
        Do_This   = "echo Sleepy has speed of 1"
Supporting_Cast_Ratings:
        Others          = "Fairy Godmother"
        Dexterity       = 10
        Speed           = 10
        Strength        = 10
        Do_This   = "odmget -q "Others='Fairy Godmother'" Supporting_Cast_Ratings"

下表显示了概念图Supporting_Cast_Ratings对象类Do_This与类中的各个对象相关联的方法描述符和操作。

Others (char) Dexterity (short) Speed (short) Stength (short) Do_This (method)
Sleepy 1 1 3 echo Sleepy has speed of 1
Fairy Godmother 10 10 10 odmget —q "Others='Fairy Godmother'"Supporting_Cast_Ratings"
odm_run_method  run of Sleepy's method displays
(using echo):
"Sleepy has speed of 1"

之后Supporting_Cast_Ratings创建对象类并添加对象,对为其定义的方法的调用 (通过 odm_run_method 子例程)Sleepy将导致显示 echo 命令:

Sleepy has speed of 1

ODM 对象搜索

很多 ODM 例程需要选择指定的对象类中的一个或者多个对象以进行处理。 当您使用某个例程选择对象时,您可以限定符的格式包含搜索条件。

限定符 (qualifier)
调用 ODM 子例程时以 null 结束的字符串参数,它给出要检索的对象的合格条件。

此参数指定的描述符名称和合格条件决定选择对象类中的哪些对象以供稍后处理。 每个限定符包含一个或者多个用逻辑运算符连接的谓词。 每个谓词由描述符名、比较运算符和常量组成。

具有三个谓词(由两个逻辑运算符连接)的限定符如下:

SUPPNO=30 AND (PARTNO>0 AND PARTNO<101)

在此示例中,整个字符串被视为限定符。 三个谓词是SUPPNO=30,PARTNO>0PARTNO<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

可用来选择每个姓为 Smith、部门为 099 且薪金低于 2500 美元的人(在 ODM 中为对象)。 请注意,Dept描述符名称是使用其限定的Company用于创建唯一描述符的对象类。

ODM 谓词中的描述符名称

在 ODM 中,描述符名称不必是唯一的。 您可以在多个对象类中使用描述符名称。 在这种情况下,您在谓词中和描述符名称一起指定对象类名称来创建对描述符的唯一引用。

ODM 谓词中的比较运算符

下面是有效的比较运算符:

运算符 定义
= 等于
!= 不等于
> 大于
>= 大于或等于
< 小于
<= 小于或等于
LIKE 类似于;在字符串数据中查找模式

仅能在兼容数据类型之间进行比较。

LIKE 比较运算符

LIKE 运算符对字符型描述符类型启用模式搜索。 例如,谓词:

NAME LIKE 'ANNE'

定义值的搜索ANNENAME指定对象类中的每个对象中的描述符。 在这种情况下,示例等于:

NAME = 'ANNE'

您也可以和下面的模式匹配字符以及约定一起使用 LIKE 运算符:

  • 使用? (问号) 表示任何单个字符。 谓词示例:
    NAME LIKE '?A?'
    定义搜索任何包含 A 作为第二个字符的三字符字符串。NAME对象的描述符。 描述符值PAM,DANPAT都满足这个搜索条件。
  • 使用 * (星号) 表示零个或多个字符的任何字符串。 谓词示例:
    NAME LIKE '*ANNE*'
    定义包含值的任何字符串的搜索ANNENAME对象的描述符。 描述符值LIZANNE,ANNETTEANNE都满足这个搜索条件。
  • 使用 [] (方括号) 来匹配括在方括号中的任何字符。 谓词示例:
    NAME LIKE '[ST]*'
    定义搜索以 S T 开头的任何描述符值NAME对象的描述符。

    使用 -(负号)指定字符的范围。 谓词示例:

    NAME LIKE '[AD-GST]*'
    定义搜索以 A、D、E、F、G、ST 中的任何字符开头的任何描述符值。
  • 使用 [!] (括在惊叹号上的方括号) 来匹配除括在方括号内的字符之一以外的任何单个字符。 谓词示例:
    NAME LIKE '[!ST]*'
    定义搜索任何描述符值,但以 ST 开头的描述符值除外NAME对象的描述符。

    您可以在字符串中将这些模式匹配字符和约定结合使用。

ODM 谓词中的常量

指定的常量可以是数字常数或者字符串常量:

  1. ODM 谓词中的数字常数由符号(可选)和后面的数字(有或者没有十进制点)以及由字母 E 或者 e 标记的指数(可选)组成。 如果使用,字母 E 或者 e 后面必须有有符号的指数。

    一些有效的数字常数为:

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

    指数 E0 可用来指定无指数。

  2. 字符串常量必须括在单引号中:

    'smith'   '91'

    所有字符串常量都被认为是可变长度的。 要在字符串常量中表示单引号,请使用两个单引号。 例如:

    'DON''T GO'

    被解释为:

    DON'T GO

用于谓词的 AND 逻辑运算符

AND 逻辑运算符可用于谓词。 使用 AND 或者 and 作为 AND 逻辑运算符。

AND 逻辑运算符连接两个或者多个谓词。 限定符示例:

predicate1 AND predicate2 AND predicate3

指定predicate1逻辑并置predicate2后跟结果,该结果在逻辑上与predicate3.