checkpoint
此函数通过创建索引节点和/或其他必要任务来完成一个或多个 put
操作,从而将对象的新值或更新后的值整合到数据库中。
MCO_RET classname_checkpoint(
/*IN*/ classname * handle
);
参数
handle
classname *
类句柄类型变量的地址。
返回
MCO_S_OK
日志含义对象更新成功。
MCO_E_ACCESS
事务句柄为MCO_READ_ONLY
。
MCO_E_TRANSACT
发生事务错误。
MCO_E_DELETED
该对象已被删除。
MCO_E_NOMEM
数据库内存分配错误。
MCO_S_DUPLICATE
尝试在唯一索引中插入重复值。
MCO_ERR_OBJECT_HANDLE
无效的对象句柄。
MCO_ERR_TRN
封闭事务中出现错误。
MCO_ERR_INDEX
插入索引结构时出错。
示例
以下代码片段展示了如何使用 classname_checkpoint()
来更新索引,以便在事务提交之前查找新创建或更新的数据库对象。
/* 模式文件的片段 */
class A {
uint4 id;
char<256> name;
tree <id> idx;
};
/* 应用程序代码片段 */
int main(int argc, char* argv[])
{
MCO_RET rc;
...
mco_db_h db = 0;
mco_trans_h t;
mco_cursor_t csr;
A a1, a2;
A a_out;
char * name = "Test #N";
uint4 id = 999;
uint4 id_out = 0;
char name_out[64] = "";
...
rc = mco_trans_start(connection, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
if ( MCO_S_OK == rc )
{
// Insert two instances of A
A_new(t, &a1);
A_id_put(&a1, id);
name[6] = '1';
A_name_put(&a1, name, strlen(name));
A_new(t, &a2);
A_id_put(&a2, id + 1);
name[6] = '2';
A_name_put(&a2, name, strlen(name));
// Checkpoint to create index entries
A_checkpoint(&a1);
A_checkpoint(&a2);
// Lookup inserted objects by index
rc = A_idx_index_cursor(t, &csr);
if (MCO_S_OK == rc)
{
printf("\nInside transaction; objects inserted into index: \n");
for (rc = mco_cursor_first(t, &csr); rc == MCO_S_OK; rc = mco_cursor_next(t, &csr))
{
A_from_cursor(t, &csr, &a_out);
A_id_get(&a_out, &id_out);
A_name_get(&a_out, name_out, sizeof(name_out));
printf("\tid=%d, name {%s} \n", id_out, name_out);
}
}
// Rollback the transaction so no inserts are committed
mco_trans_rollback(t);
}
// Start a new transaction to check for inserted items
rc = mco_trans_start(db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t);
if (MCO_S_OK == rc)
{
// Lookup to verify that no objects were inserted - transaction rolled back
rc = A_idx_index_cursor(t, &csr);
if (MCO_S_OK == rc)
{
printf("\nObjects inserted: \n");
for (rc = mco_cursor_first(t, &csr); rc == MCO_S_OK; rc = mco_cursor_next(t, &csr))
{
A_from_cursor(t, &csr, &a_out);
A_id_get(&a_out, &id_out);
A_name_get(&a_out, name_out, sizeof(name_out));
printf("\tid=%d, name {%s} \n", id_out, name_out);
}
}
else
{
sample_rc_check("\n Attempt to open a cursor after rollback:", rc);
}
}
mco_trans_rollback(t);
...
}