MCO_RET mco_uda_pattern_search( /*IN*/ mco_trans_h t,
/*IN*/ unsigned short struct_no,
/*IN*/ unsigned short index_no,
/*IN*/ const mco_uda_value_t * keys,
/*IN*/ unsigned short keys_count,
/*INOUT*/ mco_cursor_t * cursor,
/*INOUT*/ void * allocated_pattern );
| |
---|
t | 事务处理 |
struct_no | 结构/类编号(必须介于 0 和 - 1 之间)mco_dict_struct_count() |
index_no | 索引号(必须介于 0 和 - 1 之间)struct_info.index_count |
keys | 搜索键数组 |
keys_count | 搜索键数组的长度请注意,键的数量、它们的顺序和类型必须与索引的 DDL 描述相对应 |
keys | 光标手柄 |
allocated_pattern | 搜索模式 |
执行数据库模式搜索。
| |
---|
MCO_E_UDA_STRUCT_NOTFOUND | 无效struct_no |
MCO_E_UDA_STRUCT_NOT_CLASS | 无效 (不是类)struct_no |
MCO_E_UDA_INDEX_NOTFOUND | 无效index_no |
MCO_E_UDA_WRONG_KEY_NUM | 值无效 - 与索引定义不匹配keys_count |
MCO_E_UDA_WRONG_KEY_TYPE | 密钥类型不匹配 |
Sample schema :
class TestClass
{
string key;
char<20> k2;
int4 k3;
int4 v1;
tree <key,k2,k3> i1;
};
/* 应用程序代码片段 */
MCO_RET psearch(mco_db_h db, char* pattern1, char* pattern2, int p3, mco_bool ignore_other_fields)
{
MCO_RET rc = MCO_S_OK;
mco_trans_h trn;
mco_cursor_t csr;
mco_uda_object_handle_t obj;
uint2 size1;
uint4 bsize;
char key[64], k2[64];
int4 k3, v1;
void * buf;
mco_pattern_policy_t p;
unsigned short s_no = get_struct_no("TestClass");
unsigned short i_no = get_index_no(s_no, "i1");
unsigned short f_no;
mco_uda_value_t keys[3], value;
/* Get memory for set of patterns */
keys[0].type = MCO_DD_STRING;
keys[0].v.p.p.c = pattern1;
keys[0].v.p.len = (uint2)strlen(pattern1);
keys[1].type = MCO_DD_CHAR;
keys[1].v.p.p.c = pattern2;
keys[1].v.p.len = (uint2)strlen(pattern2);
keys[2].type = MCO_DD_INT4;
keys[2].v.i4 = p3;
mco_uda_pattern_size(metadict, 0, s_no, i_no, keys, 3, &bsize);
buf = malloc(bsize);
/* start read-write transaction to change pattern policy */
rc = mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &trn);
if ( MCO_S_OK == rc )
{
mco_get_pattern_policy(trn, &p);
p.ignore_other_fields = ignore_other_fields; /* ignore fields other than char<n> or string */
mco_set_pattern_policy(trn, &p);
rc = mco_uda_cursor(trn, s_no, i_no, &csr);
for (rc = mco_uda_pattern_search(trn, s_no, i_no, keys, 3, &csr, buf);
rc == MCO_S_OK; rc = mco_uda_pattern_next(trn, &csr, buf))
{
mco_uda_from_cursor(trn, &csr, &test);
/* Do something with the current UDA object */
...
}
}
}
int main(int argc, char** argv)
{
MCO_RET rc;
...
char * pattern1 = "abc_1*";
char * pattern2 = "??c_?2?";
int pattern3 = 1;
...
rc = psearch(db, pattern1, pattern2, pattern3, MCO_NO);
if (MCO_S_OK == rc)
{
printf("\n\tStart search using all patterns and ignore other index components\n");
psearch(db, pattern1, pattern2, pattern3, MCO_YES);
}
...
}