[Groonga-commit] groonga/groonga [master] give a temporary implementation to grn_dat_cursor_get_key().

Back to archive index

null+****@clear***** null+****@clear*****
2011年 11月 4日 (金) 09:47:17 JST


Susumu Yata	2011-11-04 00:47:17 +0000 (Fri, 04 Nov 2011)

  New Revision: 7fef76de368d07f1466ad6acf3041d43e970e66a

  Log:
    give a temporary implementation to grn_dat_cursor_get_key().

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

  Modified: lib/dat.cpp (+39 -7)
===================================================================
--- lib/dat.cpp    2011-11-03 13:41:51 +0000 (5b13b4b)
+++ lib/dat.cpp    2011-11-04 00:47:17 +0000 (d093f68)
@@ -235,7 +235,7 @@ grn_dat_get(grn_ctx *ctx, grn_dat *dat, const void *key,
     return GRN_ID_NIL;
   }
 #ifndef WIN32
-  const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+  const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie);
   grn::dat::UInt32 key_pos;
   try {
     if (trie->search(key, key_size, &key_pos)) {
@@ -319,7 +319,7 @@ grn_dat_get_key(grn_ctx *ctx, grn_dat *dat, grn_id id, void *keybuf, int bufsize
     return 0;
   }
 #ifndef WIN32
-  const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+  const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie);
   const grn::dat::Key &key = trie->ith_key(id);
   if (!key.is_valid()) {
     return 0;
@@ -340,7 +340,7 @@ grn_dat_get_key2(grn_ctx *ctx, grn_dat *dat, grn_id id, grn_obj *bulk)
     return 0;
   }
 #ifndef WIN32
-  const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+  const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie);
   const grn::dat::Key &key = trie->ith_key(id);
   if (!key.is_valid()) {
     return 0;
@@ -399,12 +399,25 @@ grn_dat_delete(grn_ctx *ctx, grn_dat *dat, const void *key, unsigned int key_siz
   return GRN_SUCCESS;
 }
 
+//grn_rc
+//grn_dat_update_by_id(grn_ctx *ctx, grn_dat *dat, grn_id id,
+//                     const void *key, unsigned int key_size)
+//{
+//}
+
+//grn_rc
+//grn_dat_update(grn_ctx *ctx, grn_dat *dat,
+//               const void *src_key, unsigned int src_key_size,
+//               const void *dest_key, unsigned int dest_key_size)
+//{
+//}
+
 unsigned int
 grn_dat_size(grn_ctx *ctx, grn_dat *dat)
 {
 #ifndef WIN32
   if (dat && dat->trie) {
-    return static_cast<grn::dat::Trie *>(dat->trie)->num_keys();
+    return static_cast<const grn::dat::Trie *>(dat->trie)->num_keys();
   }
 #endif
   return 0;
@@ -433,7 +446,7 @@ grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
   }
   grn_dat_cursor_init(ctx, dc);
 
-  const grn::dat::Trie * const trie = static_cast<grn::dat::Trie *>(dat->trie);
+  const grn::dat::Trie * const trie = static_cast<const grn::dat::Trie *>(dat->trie);
   try {
     if ((flags & GRN_CURSOR_BY_ID) != 0) {
       dc->cursor = grn::dat::CursorFactory::open(*trie,
@@ -520,11 +533,30 @@ 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)
 {
-  // Hmm... grn_dat_cursor has to maintain the latest key?
-  // Or, this function should return 0 if it is deleted?
+  // 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);
+  if (key.is_valid()) {
+    *key = key.ptr();
+    return (int)key.length();
+  }
+#endif
   return 0;
 }
 
+//grn_rc
+//grn_dat_cursor_delete(grn_ctx *ctx, grn_dat_cursor *c,
+//                      grn_table_delete_optarg *optarg)
+//{
+//  return GRN_SUCCESS;
+//}
+
 grn_id
 grn_dat_curr_id(grn_ctx *ctx, grn_dat *dat)
 {

  Modified: lib/dat.h (+1 -1)
===================================================================
--- lib/dat.h    2011-11-03 13:41:51 +0000 (4427acc)
+++ lib/dat.h    2011-11-04 00:47:17 +0000 (e5ff21b)
@@ -93,7 +93,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, void **key);
 //GRN_API grn_rc grn_dat_cursor_delete(grn_ctx *ctx, grn_dat_cursor *c,
 //                                     grn_table_delete_optarg *optarg);
 




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