排序函数回调
当调用 mco_register_collations()
或 mco_uda_register_collation()
时,必须传递一个 mco_collation_funcs_t 结构,其中包含以下定义的两个回调函数:
typedef struct mco_collation_funcs_t_
{
mco_compare_collation_f comp;
mco_hash_collation_f hash;
} mco_collation_funcs_t, *mco_collation_funcs_h;
在 mco.h
中定义了以下排序比较函数原型:
typedef int2 (*mco_compare_collation_f) (
mco_collate_h c1, // 用于比较的第一个 mco_collate_t 结构体的地址。
uint2 len1, // 比较操作中第一个操作数的长度。
mco_collate_h c2, // 用于比较的第二个 mco_collate_t 结构体的地址。
uint2 len2 // 比较操作中第二个操作数的长度。
);
比较函数应根据对象值是否小于、等于或大于外部键值分别返回 < 0、= 0 或 > 0。排序哈希函数在 mco.h
中定义了以下原型
typedef mco_hash_counter_t (*mco_hash_collation_f) (
mco_collate_h c, // 包含要哈希的字符数组的 mco_collate_t 结构体的地址。
uint2 len // 要进行哈希处理的字符数组的长度。
);
以下是排序函数实现的示例:
/* 自定义比较和哈希函数 */
int2 coll_cmp(mco_collate_h c1, uint2 len1, mco_collate_h c2, uint2 len2)
{
mco_uda_value_t val1, val2;
char buf1[20], buf2[20];
/* 获取第一个对象的值 */
val1.type = MCO_DD_STRING;
val1.v.p.size = sizeof(buf1);
val1.v.p.p.c = buf1;
mco_uda_collate_get(c1, &val1);
/* 获取第二个对象的值 */
val2.type = MCO_DD_STRING;
val2.v.p.size = sizeof(buf2);
val2.v.p.p.c = buf2;
mco_uda_collate_get(c2, &val2);
/* 比较数值 */
return STR_CMP(buf1, buf2);
}
uint4 coll_hash(mco_collate_h c, uint2 len)
{
mco_uda_value_t val;
char buf[20];
/* 获取对象的值 */
val.type = MCO_DD_STRING;
val.v.p.size = sizeof(buf);
val.v.p.p.c = buf;
mco_uda_collate_get(c, &val);
/* hash value */
return strlen(buf);
}