null+****@clear*****
null+****@clear*****
2011年 11月 7日 (月) 10:49:54 JST
Susumu Yata 2011-11-07 01:49:54 +0000 (Mon, 07 Nov 2011)
New Revision: 14f69fe3d6d705b2fa2faea80aaf40d572a76e13
Log:
add handling of optarg to delete_by_id() and delete().
Modified files:
lib/dat.cpp
Modified: lib/dat.cpp (+29 -2)
===================================================================
--- lib/dat.cpp 2011-11-07 01:46:06 +0000 (0f9dc32)
+++ lib/dat.cpp 2011-11-07 01:49:54 +0000 (51ae757)
@@ -443,14 +443,24 @@ grn_dat_get_key2(grn_ctx *ctx, grn_dat *dat, grn_id id, grn_obj *bulk)
grn_rc
grn_dat_delete_by_id(grn_ctx *ctx, grn_dat *dat, grn_id id,
- grn_table_delete_optarg *)
+ grn_table_delete_optarg *optarg)
{
if (!grn_dat_open_trie_if_needed(ctx, dat)) {
return ctx->rc;
} else if (!dat->trie) {
return GRN_INVALID_ARGUMENT;
}
+
#ifndef WIN32
+ if (optarg && optarg->func) {
+ const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+ if (!trie->ith_entry(id).is_valid()) {
+ return GRN_INVALID_ARGUMENT;
+ } else if (!optarg->func(ctx, reinterpret_cast<grn_obj *>(dat), id, optarg->func_arg)) {
+ return GRN_SUCCESS;
+ }
+ }
+
try {
grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
if (!trie->remove(id)) {
@@ -467,14 +477,31 @@ grn_dat_delete_by_id(grn_ctx *ctx, grn_dat *dat, grn_id id,
grn_rc
grn_dat_delete(grn_ctx *ctx, grn_dat *dat, const void *key, unsigned int key_size,
- grn_table_delete_optarg *)
+ grn_table_delete_optarg *optarg)
{
if (!grn_dat_open_trie_if_needed(ctx, dat)) {
return ctx->rc;
} else if (!dat->trie) {
return GRN_INVALID_ARGUMENT;
}
+
#ifndef WIN32
+ if (optarg && optarg->func) {
+ try {
+ const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+ grn::dat::UInt32 key_pos;
+ if (!trie->search(key, key_size, &key_pos)) {
+ return GRN_INVALID_ARGUMENT;
+ } else if (!optarg->func(ctx, reinterpret_cast<grn_obj *>(dat),
+ trie->get_key(key_pos).id(), optarg->func_arg)) {
+ return GRN_SUCCESS;
+ }
+ } catch (const grn::dat::Exception &ex) {
+ ERR(grn_dat_translate_error_code(ex.code()),
+ const_cast<char *>("grn::dat::Trie::search failed"));
+ }
+ }
+
try {
grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
if (!trie->remove(key, key_size)) {