UDA自定义函数
结构定义
在调用 mco_uda_register_udf()
时需要一个类型为 mco_uda_userdef_funcs_t 的结构体。其在 mcouda.h 中的定义如下:
typedef struct mco_uda_userdef_funcs_t_ {
mco_uda_compare_userdef_f fcomp;
mco_uda_compare_extkey_userdef_f fcomp_ext;
mco_uda_hash_userdef_f fhash;
mco_uda_hash_extkey_userdef_f fhash_ext;
} mco_uda_userdef_funcs_t, *mco_uda_userdef_funcs_h;
UDA 用户定义函数对于从 UDA 函数中调用的用户定义索引是必需的。它们在 mcouda.h 中定义了以下原型:
typedef int2 (*mco_uda_compare_userdef_f)(
mco_uda_object_handle_p obj1,
unsigned short index1,
mco_uda_object_handle_p obj2,
unsigned short index2,
void *user_context
);
typedef int2 (*mco_uda_compare_extkey_userdef_f)(
mco_uda_object_handle_p obj,
unsigned short index,
mco_uda_value_t *keys,
uint2 keys_count,
void *user_context
);
typedef uint4 (*mco_uda_hash_userdef_f)(
mco_uda_object_handle_p obj,
unsigned short index,
void *user_context
);
typedef uint4 (*mco_uda_hash_extkey_userdef_f)(
mco_uda_value_t *keys,
uint2 keys_count,
void *user_context
);
请注意,比较函数应根据对象值是否小于、等于或大于外部键值分别返回 <0、= 或 >0。以下是 UDA 用户定义函数实现的示例:
/* 用户自定义的比较和哈希函数 */
int2 cmp_obj_obj(mco_uda_object_handle_p obj1, unsigned short index1,
mco_uda_object_handle_p obj2, unsigned short index2, void *param_)
{
mco_uda_value_t val1, val2;
char buf1[20], buf2[20];
userdef_param_t *param = (userdef_param_t *) param_; /* Get context */
/* 获取第一个对象的值 */
val1.type = MCO_DD_STRING;
val1.v.p.size = sizeof(buf1);
val1.v.p.p.c = buf1;
mco_uda_get(obj1, param->fld_no, index1, &val1);
/* 获取第二个对象的值 */
val2.type = MCO_DD_STRING;
val2.v.p.size = sizeof(buf2);
val2.v.p.p.c = buf2;
mco_uda_get(obj2, param->fld_no, index2, &val2);
/* 比较数值 */
return STR_CMP(buf1, buf2);
}
int2 cmp_obj_ext(mco_uda_object_handle_p obj, unsigned short index,
mco_uda_value_t *keys, uint2 keys_count, void *param_)
{
mco_uda_value_t val;
char buf[20];
userdef_param_t *param = (userdef_param_t *) param_;
/* 获取对象的值 */
val.type = MCO_DD_STRING;
val.v.p.size = sizeof(buf);
val.v.p.p.c = buf;
mco_uda_get(obj, param->fld_no, index, &val);
/* 比较对象的值和外部键 */
return STR_CMP(buf, keys[0].v.p.p.c);
}
uint4 hash_obj(mco_uda_object_handle_p obj, unsigned short index, void *param_)
{
mco_uda_value_t val;
char buf[20];
userdef_param_t *param = (userdef_param_t *) param_;
/* 获取对象的值 */
val.type = MCO_DD_STRING;
val.v.p.size = sizeof(buf);
val.v.p.p.c = buf;
mco_uda_get(obj, param->fld_no, index, &val);
/* 哈希值 */
return strlen(buf);
}
uint4 hash_ext(mco_uda_value_t *keys, uint2 keys_count, void *param)
{
/* 哈希外键 */
return strlen(keys[0].v.p.p.c);
}