mco_register_collations
此函数在数据库需要特定排序规则时,向运行时注册排序规则函数。
需要两个回调函数:一个在运行时比较两个数据库字段(视为字符数组)时被调用,另一个生成哈希值。
MCO_RET mco_register_collations(
/*IN*/ const_char * dbname,
/*IN*/ mco_collation_funcs_h colls
);参数
dbname
const_char *
数据库名称。
colls
mco_collation_funcs_h
一个 mco_collation_funcs_t 结构(参阅排序回调结构页面)。通常这是对生成的函数 dbname_get_collations() 的调用,该函数会返回一个 mco_collation_funcs_t 结构,该结构使用指定排序规则的比较和哈希函数的地址进行初始化。这两个排序规则函数的存根由 mcocomp 生成,然后可以根据需要进行自定义。
请注意,在生成排序规则文件(假设为 colldb_coll.c)之后,下次在该模式上运行 mcocomp 时,将生成一个新的排序规则文件(colldb_coll.c,new),其中包含存根函数。这是为了避免覆盖添加到第一个排序规则文件中的任何自定义内容。
返回
MCO_S_OK
排序函数已成功注册。
MCO_E_INSTANCES_LIMIT
注册表已满。
示例
/* 模式定义代码片段 */
declare database colldb;
class Record
{
string name;
uint4 value;
unique tree <name collate C1> tcoll;
};
Collation file (colldb_coll.c) snippet:
/* collation compare function */
int2 C1_collation_compare ( mco_collate_h c1, uint2 len1, mco_collate_h c2, uint2 len2)
{
/* 在此处添加您的实现代码 */
return 0;
}
/* 应用程序代码片段 */
const char * dbname = "colldb";
int main(int argc, char* argv[])
{
mco_db_h db;
MCO_RET rc;
char *mem = malloc( DBSIZE );
if( (rc = mco_runtime_start()) != MCO_S_OK)
exit(-1);
rc = mco_db_open( dbname, simpledb_get_dictionary(), mem, DBSIZE, (uint2)PAGESIZE );
if( (MCO_S_OK == rc)
{
/* register alloc callback */
mco_register_collations( dbname, colldb_get_collations() );
/* connect to database */
rc = mco_db_connect(dbName, &db);
...
}
...
}