UDA元字典
访问头文件
以下是 mcouda.h 中定义的用于 UDA 访问的 mco_metadict_header_t 结构的定义:
n_maxentries:词典条目的最大数量。
n_allocated:已分配的条目数量。
entries:定义字典的
mco_metadict_entry_t
结构数组。
对象结构
以下是 mco_uda_object_handle_t 结构体的定义,该结构体用于诸如 mco_uda_put()
、mco_uda_get()
和 mco_uda_from_cursor()
等函数的调用,其定义在 mcouda.h 中:
typedef struct tag_mco_uda_object_handle_t_ {
MCO_Hf obj; // 对象的句柄
unsigned short struct_no; // 结构编号
} mco_uda_object_handle_t, * mco_uda_object_handle_p;
字典结构信息
以下是 mcouda.h 中定义的用于 UDA 访问的 mco_dict_struct_info_t 结构的定义:
name:结构/类名。
flags:描述此字段的位掩码标志。可能值也在 mcouda.h 中定义:
MCO_DICT_SI_CLASS
MCO_DICT_SI_OID
MCO_DICT_SI_AUTOID
MCO_DICT_SI_LIST
MCO_DICT_SI_PERSISTENT
MCO_DICT_SI_EVENT_NEW
MCO_DICT_SI_EVENT_DEL
MCO_DICT_SI_EVENT_UPD
MCO_DICT_SI_EVENT_DELALL
MCO_DICT_SI_EVENT_CHECKPOINT
MCO_DICT_SI_EVENT_CLASS_UPDATE
MCO_DICT_SI_COMPACT
MCO_DICT_SI_PACKED
MCO_DICT_SI_DIRECT
index_count
field_count
event_count
class_code
new_event_no
delete_event_no
delete_all_event_no
checkpoint_event_no
class_update_event_no
字典条目
UDA 字典条目由同样在 mcouda.h 中定义的 mco_metadict_entry_t 结构体来定义:
- dict_no:词典的编号。
- flags
- name
- dict
- user_data
字段信息
以下是 mcouda.h中定义的用于 UDA 访问的 mco_dict_field_info_t 结构的定义:
field_no
name:模式DDL定义中的字段名。
type
flags:描述此字段的位掩码标志。可能值也在
mcouda.h
中定义:
mcouda.hMCO_DICT_FI_OPTIONAL
MCO_DICT_FI_INDEXED
MCO_DICT_FI_VECTOR
MCO_DICT_FI_ARRAY
MCO_DICT_FI_EVENT_UPD
MCO_DICT_FI_HAS_INIT_DATA
MCO_DICT_FI_NULLABLE
MCO_DICT_FI_NULL_INDICATOR
索引信息
以下是 mcouda.h中定义的用于 UDA 访问的 mco_dict_index_info_t 结构的定义:
index_no
name:模式 DDL 定义中的索引名称。
flags:描述此字段的位掩码标志。可能值也在
mcouda.h
中定义:
mcouda.hMCO_DICT_II_UNIQUE
MCO_DICT_II_VOLUNTARY
MCO_DICT_II_LIST
MCO_DICT_II_AUTOID
MCO_DICT_II_TREE
MCO_DICT_II_HASH
MCO_DICT_II_USERDEF
MCO_DICT_II_KDTREE
MCO_DICT_II_RTREE
MCO_DICT_II_PATRICIA
MCO_DICT_II_NULLABLE
MCO_DICT_II_TRIGRAM
n_fields
index
n_keys_estimate
索引字段
以下是用于 UDA 访问的 mco_dict_index_ifield_info_t
结构的定义,该定义在 mcouda.h中给出:
ifield_no
field_no
flags:描述此字段的位掩码标志。可能值也在
mcouda.h
中定义:
mcouda.hMCO_DICT_IFI_DESCENDING
MCO_DICT_IFI_NULLABLE
coll_no
嵌套索引字段mco_dict_nested_ifield_info_t
以下是用于 UDA 访问的 mco_dict_nested_ifield_info_t
结构的定义,该定义在 mcouda.h中给出:
- ifield_no
- level
- struct_no
- field_no
- flags:描述此字段的位掩码标志。可能值也在
mcouda.h
中定义:- void:当前未定义任何标志 mcouda.h
- coll_no
类存储
以下是 mcouda.h中定义的用于调用 mco_uda_db_open()
的 mco_dict_class_storage_t
结构的定义:
class_code:在生成的头文件中定义的整数类代码。
persistence:
uint1
类型的值,用于指示该类是否重新定义。可选值包括:MCO_UDA_CLASS_DEFAULT = 0:保持此类与数据库模式中定义的一致。(默认)
MCO_UDA_CLASS_TRANSIENT = 1:覆盖模式定义,并将此类设为瞬态。
MCO_UDA_CLASS_PERSISTENT = 2:覆盖模式定义,使此类成为持久类。
事件处理
数据库事件可以通过注册事件处理程序来进行管理。函数 mco_uda_register_event_handler()
需要一个类型为 mco_uda_event_handler
的参数,如下在 mcouda.h中定义:
typedef MCO_RET (*mco_uda_event_handler)(
mco_trans_h t,
mco_uda_object_handle_p obj,
const mco_dict_event_info_t *event_info,
/* inout */ void *param
);
以下是一个事件处理程序实现的示例:
MCO_RET sync_event_handler(mco_trans_h t, mco_uda_object_handle_p obj, const mco_dict_event_info_t *event_info, void *param)
{
mco_dict_struct_info_t struct_info;
mco_dict_field_info_t field_info;
mco_uda_value_t val;
autoid_t obj_autoid;
mco_dict_struct(metadict, 0, obj->struct_no, &struct_info);
mco_dict_field_name(metadict, 0, obj->struct_no, "autoid", &field_info);
val.type = MCO_DD_AUTOID;
mco_uda_get(obj, field_info.field_no, 0, &val);
obj_autoid = val.v.u8;
if (event_info->type == MCO_EVENT_UPDATE || event_info->type == MCO_EVENT_CLASS_UPDATE)
{
mco_dict_field(metadict, 0, obj->struct_no, event_info->field_no, &field_info);
printf("Sync. event for obj %" INT8_FORMAT "d: class %s, event_no=%d, type=UPDATE, when=%s, field=%s, value=",
obj_autoid, struct_info.name, event_info->event_no, ((int)param == MCO_AFTER_UPDATE) ? "AFTER" : "BEFORE", field_info.name);
print_obj_field(obj, &field_info);
} else {
printf("Sync. event for obj %" INT8_FORMAT "d: class %s, event_no=%d, type=", obj_autoid, struct_info.name, event_info->event_no);
switch (event_info->type) {
case MCO_EVENT_NEW : printf("NEW"); break;
case MCO_EVENT_DELETE : printf("DELETE"); break;
case MCO_EVENT_DELETE_ALL : printf("DELETE_ALL"); break;
case MCO_EVENT_CHECKPOINT : printf("CHECKPOINT"); break;
default : printf("UNKNOWN"); dbg_exit(1);
}
}
printf("\n");
return MCO_S_OK;
}