在 UNIX 上有效
authxapi_GetObjectListValue 函数检索分配给数据库中存储对象的属性的值列表。 无法使用该函数检索具有单值的属性。 可以使用 authxapi_GetObjectProperty 检索单值属性。
如果函数成功,则返回 0。 如果失败,则设置全局变量 errno,并返回以下错误代码之一:
返回值 |
ERRNO |
含义 |
---|---|---|
AUTHXAPI_E_EINVAL |
EINVAL |
指针无效 (NULL) |
AUTHXAPI_E_INVOBJ |
EINVAL |
对象描述符无效 |
AUTHXAPI_E_INVPROP |
EINVAL |
属性描述符无效 |
AUTHXAPI_E_NOCLASS |
ENOENT |
未找到所需的类 |
AUTHXAPI_E_NOOBJ |
ENOENT |
未找到所需的对象 |
AUTHXAPI_E_NOPROP |
ENOENT |
未找到所需的属性 |
AUTHXAPI_E_PTYPE |
EINVAL |
属性类型为列表 |
AUTHXAPI_E_DBERROR |
EIO |
怀疑数据库损坏 |
AUTHXAPI_E_NOVAL |
ENOENT |
没有与该对象关联的属性的值 |
int authxapi_GetObjectListValue (const char *szClass, const char *szObj, SEOSDB_ODF *p_odf, const char *szProp, SEOSDB_PDF *p_pdf, void ***val, unsigned int *psize, unsigned int *count);
资源所属的类名。
要检索其属性值的对象的名称。
指向对象描述符的指针,在之前调用退出 API get 函数期间由此函数提取或由调用方提供该描述符。
要检索其值的属性的名称。
指向属性描述符的指针,在之前调用退出 API get 函数期间由此函数提取或由调用方提供该描述符。
指向已分配一系列指针内存地址的变量的指针。 这一系列指针指向要检索的数据值。 authxapi_GetObjectListValue 函数分配此处使用的内存。
分配给值列表中每个元素的内存区域的大小(以字节为单位)。
值列表中的元素数目。 如果未找到元素,则可能为 0。
注意:
虽然使用对象描述符比使用对象名称更快,但是将对象描述符存储在全局变量中并在此函数的后续调用中使用它们并不安全。 这是因为更新数据库可能会删除这些对象。
将属性描述符存储在全局变量中并在此函数的后续调用中使用它们是安全的,因为在 seosd 后台进程处于活动状态时,属性定义并不会更改。
authxapi_GetObjectListValue 函数分配一个 void 指针向量,每个均指向包含值列表中单个元素的一个已分配缓冲区。 必须将任何类型的列表变量声明为指向指针的指针(如 int **)。 然后,将指向该列表变量的指针传递给 authxapi_GetObjectListValue,强制转换为 (void ***)。 例如:
{ int **list; unsigned int psize, count; int rc; ... rc = authxapi_GetObjectListValue(szClass, szObj, &odf, szProp, &pdf, (void ***)&list, &psize, &count); ... }
当 authxapi_GetObjectListValue 返回时,该列表变量将指向新分配的内存区域,该内存区域包含指向每个列表项的指针(从 0 开始顺序存储)。 每个列表项都存储在另一个新分配的内存区域中。 确保使用 authxapi_FreeListValues 释放 authxapi_GetObjectListValue 分配的所有内存。
例如,对于包含 N 个数据元素的列表,内存分配如下:
参数 |
说明 |
[elem0] |
第 1 个数据元素 |
[elem1] |
第 2 个数据元素 |
[elemN] |
第 N+1 个数据元素 |
示例:检索属性资源的值列表
以下退出 API 函数从数据库资源的列表类型属性检索值列表,然后遍历该值列表。‑ 不显示实际使用所检索信息的代码。
#include stdio.h #include authxapi.h #include seostype.h
int MyExitFunction(void *exit_data, SEOS_EXITRES *result) { SEOS_EXITGENR *genr_data; SEOSDB_ODF odf; SEOSDB_PDF pdf; SEOS_ACL **access_list, *acl_element; int rc; unsigned int psize, count, counter; genr_data = (SEOS_EXITGENR *)exit_data; /* 忽略不感兴趣的类 */ if (strcmp(genr_data‑>szClass, “MyResClass”)) return 0; /* 提取访问的资源的 ACL 属性 */ /* 的信息。 */ rc = authxapi_GetObjectListValue(“MyResClass”, genr_data‑>szRes &odf, “ACL”, &pdf, (void ***)access_list, &psize, &count); if (rc == 0) { /* 我们现在具有 ACL。 让我们看一个 */ /*遍历列表的演示。 */ for (counter = 0; counter < count; counter++) { acl_element = access_list[counter]; /* * > > > User Code Here < < < */ } authxapi_FreeListValues((void ***) &access_list, &count); } return 0; }
版权所有 © 2013 CA。
保留所有权利。
|
|