[Groonga-commit] groonga/groonga [master] add grn::dat::Key * to grn_dat_cursor for grn_dat_cursor_get_key(). add const to the 3rd argument of grn_dat_cursor_get_key().

Back to archive index

null+****@clear***** null+****@clear*****
2011年 11月 7日 (月) 11:13:41 JST


Susumu Yata	2011-11-07 02:13:41 +0000 (Mon, 07 Nov 2011)

  New Revision: 91339bb547fd22a6f2d395afd99b9bd66a5ac544

  Log:
    add grn::dat::Key * to grn_dat_cursor for grn_dat_cursor_get_key(). add const to the 3rd argument of grn_dat_cursor_get_key().

  Modified files:
    lib/dat.cpp
    lib/dat.h
    lib/db.c

  Modified: lib/dat.cpp (+14 -10)
===================================================================
--- lib/dat.cpp    2011-11-07 01:49:54 +0000 (51ae757)
+++ lib/dat.cpp    2011-11-07 02:13:41 +0000 (bd35658)
@@ -194,6 +194,7 @@ void grn_dat_cursor_init(grn_ctx *, grn_dat_cursor *cursor) {
   GRN_DB_OBJ_SET_TYPE(cursor, GRN_CURSOR_TABLE_DAT_KEY);
   cursor->dat = NULL;
   cursor->cursor = NULL;
+  cursor->key = &grn::dat::Key::invalid_key();
   cursor->curr_rec = GRN_ID_NIL;
 }
 
@@ -203,6 +204,7 @@ void grn_dat_cursor_fin(grn_ctx *, grn_dat_cursor *cursor) {
 #endif
   cursor->dat = NULL;
   cursor->cursor = NULL;
+  cursor->key = &grn::dat::Key::invalid_key();
   cursor->curr_rec = GRN_ID_NIL;
 }
 
@@ -686,6 +688,7 @@ grn_dat_cursor_next(grn_ctx *ctx, grn_dat_cursor *c)
   try {
     grn::dat::Cursor * const cursor = static_cast<grn::dat::Cursor *>(c->cursor);
     const grn::dat::Key &key = cursor->next();
+    c->key = &key;
     c->curr_rec = key.is_valid() ? key.id() : GRN_ID_NIL;
   } catch (const grn::dat::Exception &ex) {
     ERR(grn_dat_translate_error_code(ex.code()),
@@ -706,18 +709,13 @@ grn_dat_cursor_close(grn_ctx *ctx, grn_dat_cursor *c)
 }
 
 int
-grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, void **key)
+grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, const void **key)
 {
-  // Hmm... grn_dat_cursor should maintain the latest key?
-  // If not, this function returns 0 when it is deleted after the last next().
-  // Also, the key must not be modified.
   if (!c || !c->cursor) {
     return 0;
   }
 #ifdef WIN32
-  const grn::dat::Trie * const trie =
-      static_cast<const grn::dat::Trie *>(c->cursor->dat->trie);
-  const grn::dat::Key &key = trie->ith_key(c->curr_rec);
+  const grn::dat::Key &key = static_cast<const grn::dat::Key *>(c->key);
   if (key.is_valid()) {
     *key = key.ptr();
     return (int)key.length();
@@ -734,9 +732,15 @@ grn_dat_cursor_delete(grn_ctx *ctx, grn_dat_cursor *c,
     return GRN_INVALID_ARGUMENT;
   }
 #ifdef WIN32
-  grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(c->cursor->dat->trie);
-  if (trie->remove(c->curr_rec)) {
-    return GRN_SUCCESS;
+  try {
+    grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(c->cursor->dat->trie);
+    if (trie->remove(c->curr_rec)) {
+      return GRN_SUCCESS;
+    }
+  } catch (const grn::dat::Exception &ex) {
+    ERR(grn_dat_translate_error_code(ex.code()),
+        const_cast<char *>("grn::dat::Trie::remove failed"));
+    return GRN_INVALID_ARGUMENT;
   }
 #endif
   return GRN_INVALID_ARGUMENT;

  Modified: lib/dat.h (+2 -1)
===================================================================
--- lib/dat.h    2011-11-07 01:49:54 +0000 (0337a36)
+++ lib/dat.h    2011-11-07 02:13:41 +0000 (0652180)
@@ -53,6 +53,7 @@ struct _grn_dat_cursor {
   grn_db_obj obj;
   grn_dat *dat;
   void *cursor;
+  const void *key;
   grn_id curr_rec;
 };
 
@@ -93,7 +94,7 @@ GRN_API grn_dat_cursor *grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
 GRN_API grn_id grn_dat_cursor_next(grn_ctx *ctx, grn_dat_cursor *c);
 GRN_API void grn_dat_cursor_close(grn_ctx *ctx, grn_dat_cursor *c);
 
-GRN_API int grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, void **key);
+GRN_API int grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, const void **key);
 GRN_API grn_rc grn_dat_cursor_delete(grn_ctx *ctx, grn_dat_cursor *c,
                                      grn_table_delete_optarg *optarg);
 

  Modified: lib/db.c (+1 -1)
===================================================================
--- lib/db.c    2011-11-07 01:49:54 +0000 (0ce5d1c)
+++ lib/db.c    2011-11-07 02:13:41 +0000 (1c7ca2b)
@@ -2180,7 +2180,7 @@ grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key)
       len = grn_pat_cursor_get_key(ctx, (grn_pat_cursor *)tc, key);
       break;
     case GRN_CURSOR_TABLE_DAT_KEY :
-      len = grn_dat_cursor_get_key(ctx, (grn_dat_cursor *)tc, key);
+      len = grn_dat_cursor_get_key(ctx, (grn_dat_cursor *)tc, (const void **)key);
       break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       len = grn_hash_cursor_get_key(ctx, (grn_hash_cursor *)tc, key);




Groonga-commit メーリングリストの案内
Back to archive index