[Groonga-commit] groonga/groonga [master] db.c follows grn_dat

Back to archive index

null+****@clear***** null+****@clear*****
2011年 6月 18日 (土) 12:16:54 JST


Daijiro MORI	2011-06-18 03:16:54 +0000 (Sat, 18 Jun 2011)

  New Revision: 518ddacf5a4509f9494afc23f9a27a28d5f0649e

  Log:
    db.c follows grn_dat

  Modified files:
    include/groonga.h
    lib/dat.cpp
    lib/dat.h
    lib/db.c
    lib/groonga_in.h
    lib/proc.c

  Modified: include/groonga.h (+3 -0)
===================================================================
--- include/groonga.h    2011-06-18 00:33:32 +0000 (ee17621)
+++ include/groonga.h    2011-06-18 03:16:54 +0000 (44aba09)
@@ -339,6 +339,7 @@ typedef unsigned short int grn_obj_flags;
 #define GRN_OBJ_TABLE_TYPE_MASK        (0x07)
 #define GRN_OBJ_TABLE_HASH_KEY         (0x00)
 #define GRN_OBJ_TABLE_PAT_KEY          (0x01)
+#define GRN_OBJ_TABLE_DAT_KEY          (0x02)
 #define GRN_OBJ_TABLE_NO_KEY           (0x03)
 #define GRN_OBJ_TABLE_VIEW             (0x04)
 
@@ -401,6 +402,7 @@ typedef unsigned short int grn_obj_flags;
 #define GRN_PATSNIP                    (0x0c)
 #define GRN_CURSOR_TABLE_HASH_KEY      (0x10)
 #define GRN_CURSOR_TABLE_PAT_KEY       (0x11)
+#define GRN_CURSOR_TABLE_DAT_KEY       (0x12)
 #define GRN_CURSOR_TABLE_NO_KEY        (0x13)
 #define GRN_CURSOR_TABLE_VIEW          (0x14)
 #define GRN_CURSOR_COLUMN_INDEX        (0x18)
@@ -409,6 +411,7 @@ typedef unsigned short int grn_obj_flags;
 #define GRN_EXPR                       (0x22)
 #define GRN_TABLE_HASH_KEY             (0x30)
 #define GRN_TABLE_PAT_KEY              (0x31)
+#define GRN_TABLE_DAT_KEY              (0x32)
 #define GRN_TABLE_NO_KEY               (0x33)
 #define GRN_TABLE_VIEW                 (0x34)
 #define GRN_DB                         (0x37)

  Modified: lib/dat.cpp (+49 -17)
===================================================================
--- lib/dat.cpp    2011-06-18 00:33:32 +0000 (5fcbcd1)
+++ lib/dat.cpp    2011-06-18 03:16:54 +0000 (639565a)
@@ -14,7 +14,6 @@
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
-#include "groonga_in.h"
 #include "dat.h"
 #include "util.h"
 
@@ -42,16 +41,19 @@ class Trie {
 
 extern "C" {
 
-static void grn_dat_init(grn_dat *dat) {
+static void
+grn_dat_init(grn_dat *dat) {
   dat->handle = NULL;
 }
 
-static void grn_dat_end(grn_dat *dat) {
+static void
+grn_dat_end(grn_dat *dat) {
   delete static_cast<grn::dat::Trie *>(dat->handle);
   dat->handle = NULL;
 }
 
-grn_dat *grn_dat_create(grn_ctx *ctx, const char *path, unsigned int,
+grn_dat *
+grn_dat_create(grn_ctx *ctx, const char *path, unsigned int,
                         unsigned int, unsigned int) {
   grn_dat *dat = static_cast<grn_dat *>(GRN_MALLOC(sizeof(grn_dat)));
   if (dat == NULL) {
@@ -66,7 +68,8 @@ grn_dat *grn_dat_create(grn_ctx *ctx, const char *path, unsigned int,
   return dat;
 }
 
-grn_dat *grn_dat_open(grn_ctx *ctx, const char *path) {
+grn_dat *
+grn_dat_open(grn_ctx *ctx, const char *path) {
   grn_dat *dat = static_cast<grn_dat *>(GRN_MALLOC(sizeof(grn_dat)));
   if (dat == NULL) {
     return NULL;
@@ -80,58 +83,87 @@ grn_dat *grn_dat_open(grn_ctx *ctx, const char *path) {
   return dat;
 }
 
-grn_rc grn_dat_close(grn_ctx *ctx, grn_dat *dat) {
+grn_rc
+grn_dat_close(grn_ctx *ctx, grn_dat *dat) {
   grn_dat_end(dat);
   GRN_FREE(dat);
   return GRN_SUCCESS;
 }
 
-grn_rc grn_dat_remove(grn_ctx *ctx, const char *path) {
+grn_rc
+grn_dat_remove(grn_ctx *ctx, const char *path) {
   return GRN_SUCCESS;
 }
 
-grn_id grn_dat_get(grn_ctx *ctx, grn_dat *dat, const void *key,
+grn_id
+grn_dat_get(grn_ctx *ctx, grn_dat *dat, const void *key,
                    unsigned int key_size, void **value) {
   return GRN_ID_NIL;
 }
 
-grn_id grn_dat_add(grn_ctx *ctx, grn_dat *dat, const void *key,
+grn_id
+grn_dat_add(grn_ctx *ctx, grn_dat *dat, const void *key,
                    unsigned int key_size, void **value, int *added) {
   return GRN_ID_NIL;
 }
 
-int grn_dat_get_key(grn_ctx *ctx, grn_dat *dat, grn_id id,
+int
+grn_dat_get_key(grn_ctx *ctx, grn_dat *dat, grn_id id,
                     void *keybuf, int bufsize) {
   return 0;
 }
 
-unsigned int grn_dat_size(grn_ctx *ctx, grn_dat *dat) {
+int
+grn_dat_get_key2(grn_ctx *ctx, grn_dat *dat, grn_id id, grn_obj *bulk)
+{
+  return 0;
+}
+
+unsigned int
+grn_dat_size(grn_ctx *ctx, grn_dat *dat)
+{
   if (dat == NULL) {
     return GRN_INVALID_ARGUMENT;
   }
   return static_cast<grn::dat::Trie *>(dat->handle)->num_keys();
 }
 
-grn_dat_cursor *grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
+grn_dat_cursor *
+grn_dat_cursor_open(grn_ctx *ctx, grn_dat *dat,
                                     const void *min, unsigned int min_size,
                                     const void *max, unsigned int max_size,
-                                    int offset, int limit, int flags) {
+                                    int offset, int limit, int flags)
+{
   return NULL;
 }
 
-grn_id grn_dat_cursor_next(grn_ctx *ctx, grn_dat_cursor *c) {
+grn_id
+grn_dat_cursor_next(grn_ctx *ctx, grn_dat_cursor *c)
+{
   return GRN_ID_NIL;
 }
 
-void grn_dat_cursor_close(grn_ctx *ctx, grn_dat_cursor *c) {
+void
+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) {
+int
+grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, void **key)
+{
   return 0;
 }
 
-grn_id grn_dat_curr_id(grn_ctx *ctx, grn_dat *dat) {
+grn_id
+grn_dat_curr_id(grn_ctx *ctx, grn_dat *dat)
+{
   return 0;
 }
 
+const char *
+_grn_dat_key(grn_ctx *ctx, grn_dat *dat, grn_id id, uint32_t *key_size)
+{
+  return NULL;
+}
+
 }  // extern "C"

  Modified: lib/dat.h (+21 -10)
===================================================================
--- lib/dat.h    2011-06-18 00:33:32 +0000 (2357306)
+++ lib/dat.h    2011-06-18 03:16:54 +0000 (6dbc855)
@@ -21,27 +21,38 @@
 #include "groonga_in.h"
 #endif /* GROONGA_IN_H */
 
+#include "db.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 typedef void *grn_dat_handle;
+typedef struct _grn_dat grn_dat;
+typedef struct _grn_dat_cursor grn_dat_cursor;
 
 struct _grn_dat {
+  grn_db_obj obj;
   grn_dat_handle handle;
 //  grn_db_obj obj;
-//  grn_io *io;
-//  struct grn_dat_header *header;
-//  grn_encoding encoding;
+  grn_io *io;
+  struct grn_dat_header *header;
+  grn_encoding encoding;
 //  uint32_t key_size;
 //  uint32_t value_size;
-//  grn_obj *tokenizer;
+  grn_obj *tokenizer;
+};
+
+struct grn_dat_header {
+  uint32_t flags;
+  grn_encoding encoding;
+  grn_id tokenizer;
 };
 
 struct _grn_dat_cursor {
-//  grn_db_obj obj;
-//  grn_id curr_rec;
-//  grn_dat *pat;
+  grn_db_obj obj;
+  grn_id curr_rec;
+  grn_dat *dat;
 //  grn_ctx *ctx;
 //  unsigned int size;
 //  unsigned int sp;
@@ -51,9 +62,6 @@ struct _grn_dat_cursor {
 //  uint8_t curr_key[GRN_TABLE_MAX_KEY_SIZE];
 };
 
-typedef struct _grn_dat grn_dat;
-typedef struct _grn_dat_cursor grn_dat_cursor;
-
 GRN_API grn_dat *grn_dat_create(grn_ctx *ctx, const char *path, unsigned int key_size,
                                 unsigned int value_size, unsigned int flags);
 
@@ -69,6 +77,7 @@ GRN_API grn_id grn_dat_add(grn_ctx *ctx, grn_dat *dat, const void *key,
                            unsigned int key_size, void **value, int *added);
 
 GRN_API int grn_dat_get_key(grn_ctx *ctx, grn_dat *dat, grn_id id, void *keybuf, int bufsize);
+GRN_API int grn_dat_get_key2(grn_ctx *ctx, grn_dat *dat, grn_id id, grn_obj *bulk);
 
 GRN_API unsigned int grn_dat_size(grn_ctx *ctx, grn_dat *dat);
 
@@ -83,6 +92,8 @@ GRN_API int grn_dat_cursor_get_key(grn_ctx *ctx, grn_dat_cursor *c, void **key);
 
 grn_id grn_dat_curr_id(grn_ctx *ctx, grn_dat *dat);
 
+const char *_grn_dat_key(grn_ctx *ctx, grn_dat *dat, grn_id id, uint32_t *key_size);
+
 #ifdef __cplusplus
 }
 #endif

  Modified: lib/db.c (+228 -9)
===================================================================
--- lib/db.c    2011-06-18 00:33:32 +0000 (0644020)
+++ lib/db.c    2011-06-18 03:16:54 +0000 (49388b3)
@@ -18,6 +18,7 @@
 #include "db.h"
 #include "hash.h"
 #include "pat.h"
+#include "dat.h"
 #include "ii.h"
 #include "ql.h"
 #include "token.h"
@@ -255,8 +256,9 @@ grn_obj_touch(grn_ctx *ctx, grn_obj *obj, grn_timeval *tv)
     case GRN_DB :
       ((grn_db *)obj)->keys->io->header->lastmod = tv->tv_sec;
       break;
-    case GRN_TABLE_PAT_KEY :
     case GRN_TABLE_HASH_KEY :
+    case GRN_TABLE_PAT_KEY :
+    case GRN_TABLE_DAT_KEY :
     case GRN_TABLE_NO_KEY :
     case GRN_COLUMN_VAR_SIZE :
     case GRN_COLUMN_FIX_SIZE :
@@ -522,8 +524,9 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned name_size,
       }
       break;
     case GRN_TABLE_HASH_KEY :
-    case GRN_TABLE_NO_KEY :
     case GRN_TABLE_PAT_KEY :
+    case GRN_TABLE_DAT_KEY :
+    case GRN_TABLE_NO_KEY :
       key_size = sizeof(grn_id);
       break;
     default :
@@ -551,8 +554,9 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned name_size,
       }
       break;
     case GRN_TABLE_HASH_KEY :
-    case GRN_TABLE_NO_KEY :
     case GRN_TABLE_PAT_KEY :
+    case GRN_TABLE_DAT_KEY :
+    case GRN_TABLE_NO_KEY :
       value_size = sizeof(grn_id);
       break;
     default :
@@ -609,6 +613,13 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned name_size,
       res = (grn_obj *)grn_pat_create(ctx, path, key_size, value_size, flags);
     }
     break;
+  case GRN_OBJ_TABLE_DAT_KEY :
+    if (key_type && key_type->header.type == GRN_TABLE_VIEW) {
+      res = grn_view_transcript(ctx, path, key_type, value_type, flags);
+    } else {
+      res = (grn_obj *)grn_dat_create(ctx, path, key_size, value_size, flags);
+    }
+    break;
   case GRN_OBJ_TABLE_NO_KEY :
     if (value_type && value_type->header.type == GRN_TABLE_VIEW) {
       res = grn_view_transcript(ctx, path, key_type, value_type, flags);
@@ -670,6 +681,9 @@ grn_table_open(grn_ctx *ctx, const char *name, unsigned name_size, const char *p
       case GRN_TABLE_PAT_KEY :
         res = (grn_obj *)grn_pat_open(ctx, path);
         break;
+      case GRN_TABLE_DAT_KEY :
+        res = (grn_obj *)grn_dat_open(ctx, path);
+        break;
       case GRN_TABLE_NO_KEY :
         res = (grn_obj *)grn_array_open(ctx, path);
         break;
@@ -702,6 +716,19 @@ grn_table_lcp_search(grn_ctx *ctx, grn_obj *table, const void *key, unsigned key
       });
     }
     break;
+  case GRN_TABLE_DAT_KEY :
+    {
+      grn_dat *dat = (grn_dat *)table;
+      WITH_NORMALIZE(dat, key, key_size, {
+        grn_dat_cursor *c;
+        if ((c = grn_dat_cursor_open(ctx, dat, NULL, 0, key, key_size,
+                                     0, 1, GRN_CURSOR_PREFIX))) {
+          id = grn_dat_cursor_next(ctx, c);
+          grn_dat_cursor_close(ctx, c);
+        }
+      });
+    }
+    break;
   case GRN_TABLE_HASH_KEY :
     {
       grn_hash *hash = (grn_hash *)table;
@@ -775,6 +802,16 @@ grn_table_add(grn_ctx *ctx, grn_obj *table, const void *key, unsigned key_size,
         if (added) { *added = added_; }
       }
       break;
+    case GRN_TABLE_DAT_KEY :
+      {
+        grn_dat *dat = (grn_dat *)table;
+        WITH_NORMALIZE(dat, key, key_size, {
+          /* FIXME: lock is not supported yet */
+          id = grn_dat_add(ctx, dat, key, key_size, NULL, &added_);
+        });
+        if (added) { *added = added_; }
+      }
+      break;
     case GRN_TABLE_HASH_KEY :
       {
         grn_hash *hash = (grn_hash *)table;
@@ -980,6 +1017,11 @@ grn_table_get(grn_ctx *ctx, grn_obj *table, const void *key, unsigned int key_si
         id = grn_pat_get(ctx, (grn_pat *)table, key, key_size, NULL);
       });
       break;
+    case GRN_TABLE_DAT_KEY :
+      WITH_NORMALIZE((grn_dat *)table, key, key_size, {
+        id = grn_dat_get(ctx, (grn_dat *)table, key, key_size, NULL);
+      });
+      break;
     case GRN_TABLE_HASH_KEY :
       WITH_NORMALIZE((grn_hash *)table, key, key_size, {
         id = grn_hash_get(ctx, (grn_hash *)table, key, key_size, NULL);
@@ -999,6 +1041,9 @@ grn_table_at(grn_ctx *ctx, grn_obj *table, grn_id id)
     case GRN_TABLE_PAT_KEY :
       id = grn_pat_at(ctx, (grn_pat *)table, id);
       break;
+    case GRN_TABLE_DAT_KEY :
+      if (id > grn_dat_curr_id(ctx, (grn_dat *)table)) { id = GRN_ID_NIL; }
+      break;
     case GRN_TABLE_HASH_KEY :
       id = grn_hash_at(ctx, (grn_hash *)table, id);
       break;
@@ -1026,6 +1071,11 @@ grn_table_add_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size,
         id = grn_pat_add(ctx, (grn_pat *)table, key, key_size, value, added);
       });
       break;
+    case GRN_TABLE_DAT_KEY :
+      WITH_NORMALIZE((grn_dat *)table, key, key_size, {
+        id = grn_dat_add(ctx, (grn_dat *)table, key, key_size, value, added);
+      });
+      break;
     case GRN_TABLE_HASH_KEY :
       WITH_NORMALIZE((grn_hash *)table, key, key_size, {
         id = grn_hash_add(ctx, (grn_hash *)table, key, key_size, value, added);
@@ -1053,6 +1103,11 @@ grn_table_get_v(grn_ctx *ctx, grn_obj *table, const void *key, int key_size,
         id = grn_pat_get(ctx, (grn_pat *)table, key, key_size, value);
       });
       break;
+    case GRN_TABLE_DAT_KEY :
+      WITH_NORMALIZE((grn_dat *)table, key, key_size, {
+        id = grn_dat_get(ctx, (grn_dat *)table, key, key_size, value);
+      });
+      break;
     case GRN_TABLE_HASH_KEY :
       WITH_NORMALIZE((grn_hash *)table, key, key_size, {
         id = grn_hash_get(ctx, (grn_hash *)table, key, key_size, value);
@@ -1076,6 +1131,9 @@ grn_table_get_key(grn_ctx *ctx, grn_obj *table, grn_id id, void *keybuf, int buf
     case GRN_TABLE_PAT_KEY :
       r = grn_pat_get_key(ctx, (grn_pat *)table, id, keybuf, buf_size);
       break;
+    case GRN_TABLE_DAT_KEY :
+      r = grn_dat_get_key(ctx, (grn_dat *)table, id, keybuf, buf_size);
+      break;
     case GRN_TABLE_NO_KEY :
       {
         grn_array *a = (grn_array *)table;
@@ -1106,6 +1164,9 @@ grn_table_get_key2(grn_ctx *ctx, grn_obj *table, grn_id id, grn_obj *bulk)
     case GRN_TABLE_PAT_KEY :
       r = grn_pat_get_key2(ctx, (grn_pat *)table, id, bulk);
       break;
+    case GRN_TABLE_DAT_KEY :
+      r = grn_dat_get_key2(ctx, (grn_dat *)table, id, bulk);
+      break;
     case GRN_TABLE_NO_KEY :
       {
         grn_array *a = (grn_array *)table;
@@ -1267,6 +1328,9 @@ grn_table_delete(grn_ctx *ctx, grn_obj *table, const void *key, unsigned key_siz
           }
         });
         break;
+      case GRN_TABLE_DAT_KEY :
+        rc = GRN_OPERATION_NOT_SUPPORTED;
+        break;
       case GRN_TABLE_HASH_KEY :
         WITH_NORMALIZE((grn_hash *)table, key, key_size, {
           grn_hash *hash = (grn_hash *)table;
@@ -1305,6 +1369,9 @@ _grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id,
       case GRN_TABLE_PAT_KEY :
         rc = grn_pat_delete_by_id(ctx, (grn_pat *)table, id, optarg);
         break;
+      case GRN_TABLE_DAT_KEY :
+        rc = GRN_OPERATION_NOT_SUPPORTED;
+        break;
       case GRN_TABLE_HASH_KEY :
         rc = grn_hash_delete_by_id(ctx, (grn_hash *)table, id, optarg);
         break;
@@ -1330,6 +1397,9 @@ grn_obj_io(grn_obj *obj)
     case GRN_TABLE_PAT_KEY :
       io = ((grn_pat *)obj)->io;
       break;
+    case GRN_TABLE_DAT_KEY :
+      io = ((grn_dat *)obj)->io;
+      break;
     case GRN_TABLE_HASH_KEY :
       io = ((grn_hash *)obj)->io;
       break;
@@ -1439,6 +1509,9 @@ grn_table_truncate(grn_ctx *ctx, grn_obj *table)
       }
       rc = grn_pat_truncate(ctx, (grn_pat *)table);
       break;
+    case GRN_TABLE_DAT_KEY :
+      rc = GRN_OPERATION_NOT_SUPPORTED;
+      break;
     case GRN_TABLE_HASH_KEY :
       for (hooks = DB_OBJ(table)->hooks[GRN_HOOK_INSERT]; hooks; hooks = hooks->next) {
         default_set_value_hook_data *data = (void *)NEXT_ADDR(hooks);
@@ -1472,6 +1545,12 @@ grn_table_get_info(grn_ctx *ctx, grn_obj *table, grn_obj_flags *flags,
       if (tokenizer) { *tokenizer = ((grn_pat *)table)->tokenizer; }
       rc = GRN_SUCCESS;
       break;
+    case GRN_TABLE_DAT_KEY :
+      if (flags) { *flags = ((grn_dat *)table)->obj.header.flags; }
+      if (encoding) { *encoding = ((grn_dat *)table)->encoding; }
+      if (tokenizer) { *tokenizer = ((grn_dat *)table)->tokenizer; }
+      rc = GRN_SUCCESS;
+      break;
     case GRN_TABLE_HASH_KEY :
       if (flags) { *flags = ((grn_hash *)table)->obj.header.flags; }
       if (encoding) { *encoding = ((grn_hash *)table)->encoding; }
@@ -1502,6 +1581,9 @@ grn_table_size(grn_ctx *ctx, grn_obj *table)
     case GRN_TABLE_PAT_KEY :
       n = grn_pat_size(ctx, (grn_pat *)table);
       break;
+    case GRN_TABLE_DAT_KEY :
+      n = grn_dat_size(ctx, (grn_dat *)table);
+      break;
     case GRN_TABLE_HASH_KEY :
       n = GRN_HASH_SIZE((grn_hash *)table);
       break;
@@ -1726,6 +1808,10 @@ grn_table_cursor_target_id(grn_ctx *ctx, grn_table_cursor *tc, grn_obj *id)
     GRN_RECORD_PUT(ctx, id, ((grn_pat_cursor *)tc)->pat->obj.id);
     len = sizeof(grn_id);
     break;
+  case GRN_CURSOR_TABLE_DAT_KEY :
+    GRN_RECORD_PUT(ctx, id, ((grn_dat_cursor *)tc)->dat->obj.id);
+    len = sizeof(grn_id);
+    break;
   case GRN_CURSOR_TABLE_HASH_KEY :
     GRN_RECORD_PUT(ctx, id, ((grn_hash_cursor *)tc)->hash->obj.id);
     len = sizeof(grn_id);
@@ -1764,6 +1850,9 @@ grn_table_cursor_curr(grn_ctx *ctx, grn_table_cursor *tc)
     case GRN_CURSOR_TABLE_PAT_KEY :
       id = ((grn_pat_cursor *)tc)->curr_rec;
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      id = ((grn_dat_cursor *)tc)->curr_rec;
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       id = ((grn_hash_cursor *)tc)->curr_rec;
       break;
@@ -1891,6 +1980,11 @@ grn_table_cursor_open(grn_ctx *ctx, grn_obj *table,
                                                    min, min_size,
                                                    max, max_size, offset, limit, flags);
       break;
+    case GRN_TABLE_DAT_KEY :
+      tc = (grn_table_cursor *)grn_dat_cursor_open(ctx, (grn_dat *)table,
+                                                   min, min_size,
+                                                   max, max_size, offset, limit, flags);
+      break;
     case GRN_TABLE_HASH_KEY :
       tc = (grn_table_cursor *)grn_hash_cursor_open(ctx, (grn_hash *)table,
                                                     min, min_size,
@@ -1928,6 +2022,10 @@ grn_table_cursor_open_by_id(grn_ctx *ctx, grn_obj *table,
       tc = (grn_table_cursor *)grn_pat_cursor_open(ctx, (grn_pat *)table,
                                                    NULL, 0, NULL, 0, 0, -1, flags);
       break;
+    case GRN_TABLE_DAT_KEY :
+      tc = (grn_table_cursor *)grn_dat_cursor_open(ctx, (grn_dat *)table,
+                                                   NULL, 0, NULL, 0, 0, -1, flags);
+      break;
     case GRN_TABLE_HASH_KEY :
       tc = (grn_table_cursor *)grn_hash_cursor_open(ctx, (grn_hash *)table,
                                                     NULL, 0, NULL, 0, 0, -1, flags);
@@ -1969,6 +2067,9 @@ grn_table_cursor_close(grn_ctx *ctx, grn_table_cursor *tc)
     case GRN_CURSOR_TABLE_PAT_KEY :
       grn_pat_cursor_close(ctx, (grn_pat_cursor *)tc);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      grn_dat_cursor_close(ctx, (grn_dat_cursor *)tc);
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       grn_hash_cursor_close(ctx, (grn_hash_cursor *)tc);
       break;
@@ -1998,6 +2099,9 @@ grn_table_cursor_next(grn_ctx *ctx, grn_table_cursor *tc)
     case GRN_CURSOR_TABLE_PAT_KEY :
       id = grn_pat_cursor_next(ctx, (grn_pat_cursor *)tc);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      id = grn_dat_cursor_next(ctx, (grn_dat_cursor *)tc);
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       id = grn_hash_cursor_next(ctx, (grn_hash_cursor *)tc);
       break;
@@ -2053,6 +2157,9 @@ grn_table_cursor_get_key(grn_ctx *ctx, grn_table_cursor *tc, void **key)
     case GRN_CURSOR_TABLE_PAT_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);
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       len = grn_hash_cursor_get_key(ctx, (grn_hash_cursor *)tc, key);
       break;
@@ -2076,6 +2183,10 @@ grn_table_cursor_get_value(grn_ctx *ctx, grn_table_cursor *tc, void **value)
     case GRN_CURSOR_TABLE_PAT_KEY :
       len = grn_pat_cursor_get_value(ctx, (grn_pat_cursor *)tc, value);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      *value = NULL;
+      len = 0;
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       len = grn_hash_cursor_get_value(ctx, (grn_hash_cursor *)tc, value);
       break;
@@ -2103,6 +2214,9 @@ grn_table_cursor_set_value(grn_ctx *ctx, grn_table_cursor *tc,
     case GRN_CURSOR_TABLE_PAT_KEY :
       rc = grn_pat_cursor_set_value(ctx, (grn_pat_cursor *)tc, value, flags);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      rc = GRN_OPERATION_NOT_SUPPORTED;
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       rc = grn_hash_cursor_set_value(ctx, (grn_hash_cursor *)tc, value, flags);
       break;
@@ -2129,6 +2243,9 @@ grn_table_cursor_delete(grn_ctx *ctx, grn_table_cursor *tc)
     case GRN_CURSOR_TABLE_PAT_KEY :
       rc = grn_pat_cursor_delete(ctx, (grn_pat_cursor *)tc, NULL);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      rc = GRN_OPERATION_NOT_SUPPORTED;
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       rc = grn_hash_cursor_delete(ctx, (grn_hash_cursor *)tc, NULL);
       break;
@@ -2155,6 +2272,9 @@ grn_table_cursor_table(grn_ctx *ctx, grn_table_cursor *tc)
     case GRN_CURSOR_TABLE_PAT_KEY :
       obj = (grn_obj *)(((grn_pat_cursor *)tc)->pat);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      obj = (grn_obj *)(((grn_dat_cursor *)tc)->dat);
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       obj = (grn_obj *)(((grn_hash_cursor *)tc)->hash);
       break;
@@ -2278,6 +2398,31 @@ grn_table_search(grn_ctx *ctx, grn_obj *table, const void *key, uint32_t key_siz
       });
     }
     break;
+  case GRN_TABLE_DAT_KEY :
+    {
+      grn_dat *dat = (grn_dat *)table;
+      grn_id id;
+      WITH_NORMALIZE(dat, key, key_size, {
+        switch (mode) {
+        case GRN_OP_EXACT :
+          {
+            id = grn_dat_get(ctx, dat, key, key_size, NULL);
+          }
+          if (id) { grn_table_add(ctx, res, &id, sizeof(grn_id), NULL); }
+          break;
+        case GRN_OP_PREFIX :
+          rc = GRN_OPERATION_NOT_SUPPORTED;
+          break;
+        case GRN_OP_LCP :
+          rc = GRN_OPERATION_NOT_SUPPORTED;
+          break;
+        default :
+          rc = GRN_INVALID_ARGUMENT;
+          ERR(rc, "invalid mode %d", mode);
+        }
+      });
+    }
+    break;
   case GRN_TABLE_HASH_KEY :
     {
       grn_hash *hash = (grn_hash *)table;
@@ -2302,6 +2447,9 @@ grn_table_next(grn_ctx *ctx, grn_obj *table, grn_id id)
     case GRN_TABLE_PAT_KEY :
       r = grn_pat_next(ctx, (grn_pat *)table, id);
       break;
+    case GRN_TABLE_DAT_KEY :
+      r = (id >= grn_dat_curr_id(ctx, (grn_dat *)table)) ? GRN_ID_NIL : id + 1;
+      break;
     case GRN_TABLE_HASH_KEY :
       r = grn_hash_next(ctx, (grn_hash *)table, id);
       break;
@@ -2322,6 +2470,7 @@ grn_obj_search(grn_ctx *ctx, grn_obj *obj, grn_obj *query,
   if (GRN_DB_OBJP(obj)) {
     switch (obj->header.type) {
     case GRN_TABLE_PAT_KEY :
+    case GRN_TABLE_DAT_KEY :
     case GRN_TABLE_HASH_KEY :
       {
         const void *key = GRN_BULK_HEAD(query);
@@ -2609,6 +2758,9 @@ grn_table_setoperation(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, grn_obj *
   case GRN_TABLE_PAT_KEY :
     value_size = ((grn_pat *)table1)->value_size;
     break;
+  case GRN_TABLE_DAT_KEY :
+    value_size = 0;
+    break;
   case GRN_TABLE_NO_KEY :
     value_size = ((grn_array *)table1)->value_size;
     break;
@@ -2624,6 +2776,9 @@ grn_table_setoperation(grn_ctx *ctx, grn_obj *table1, grn_obj *table2, grn_obj *
       value_size = ((grn_pat *)table2)->value_size;
     }
     break;
+  case GRN_TABLE_DAT_KEY :
+    value_size = 0;
+    break;
   case GRN_TABLE_NO_KEY :
     if (value_size < ((grn_array *)table2)->value_size) {
       value_size = ((grn_array *)table2)->value_size;
@@ -2769,6 +2924,8 @@ _grn_table_key(grn_ctx *ctx, grn_obj *table, grn_id id, uint32_t *key_size)
     return _grn_hash_key(ctx, (grn_hash *)table, id, key_size);
   case GRN_TABLE_PAT_KEY :
     return _grn_pat_key(ctx, (grn_pat *)table, id, key_size);
+  case GRN_TABLE_DAT_KEY :
+    return _grn_dat_key(ctx, (grn_dat *)table, id, key_size);
   case GRN_TABLE_NO_KEY :
     {
       grn_array *a = (grn_array *)table;
@@ -2870,8 +3027,9 @@ grn_column_create(grn_ctx *ctx, grn_obj *table,
     }
     break;
   case GRN_TABLE_HASH_KEY :
-  case GRN_TABLE_NO_KEY :
   case GRN_TABLE_PAT_KEY :
+  case GRN_TABLE_DAT_KEY :
+  case GRN_TABLE_NO_KEY :
     value_size = sizeof(grn_id);
     break;
   default :
@@ -3409,6 +3567,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
             done++;
             break;
           case GRN_TABLE_PAT_KEY :
+          case GRN_TABLE_DAT_KEY :
           case GRN_TABLE_HASH_KEY :
             (*rp)->action = GRN_ACCESSOR_GET_KEY;
             break;
@@ -3447,6 +3606,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
               done++;
               break;
             case GRN_TABLE_PAT_KEY :
+            case GRN_TABLE_DAT_KEY :
             case GRN_TABLE_HASH_KEY :
             case GRN_TABLE_NO_KEY :
               (*rp)->action = GRN_ACCESSOR_GET_KEY;
@@ -3494,6 +3654,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
               }
               break;
             case GRN_TABLE_PAT_KEY :
+            case GRN_TABLE_DAT_KEY :
             case GRN_TABLE_HASH_KEY :
             case GRN_TABLE_NO_KEY :
              (*rp)->action = GRN_ACCESSOR_GET_KEY;
@@ -3518,6 +3679,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
           } else {
             switch (obj->header.type) {
             case GRN_TABLE_PAT_KEY :
+            case GRN_TABLE_DAT_KEY :
             case GRN_TABLE_HASH_KEY :
               (*rp)->action = GRN_ACCESSOR_GET_KEY;
               break;
@@ -3552,6 +3714,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
           } else {
             switch (obj->header.type) {
             case GRN_TABLE_PAT_KEY :
+            case GRN_TABLE_DAT_KEY :
             case GRN_TABLE_HASH_KEY :
               (*rp)->action = GRN_ACCESSOR_GET_KEY;
               break;
@@ -3614,6 +3777,7 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
           }
           switch (obj->header.type) {
           case GRN_TABLE_PAT_KEY :
+          case GRN_TABLE_DAT_KEY :
           case GRN_TABLE_HASH_KEY :
           case GRN_TABLE_NO_KEY :
             (*rp)->action = GRN_ACCESSOR_GET_KEY;
@@ -4554,6 +4718,9 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id,
         }
       }
       break;
+    case GRN_TABLE_DAT_KEY :
+      rc = GRN_OPERATION_NOT_SUPPORTED;
+      break;
     case GRN_TABLE_HASH_KEY :
       {
         grn_obj buf;
@@ -4752,6 +4919,9 @@ grn_obj_get_value_(grn_ctx *ctx, grn_obj *obj, grn_id id, uint32_t *size)
   case GRN_TABLE_PAT_KEY :
     value = grn_pat_get_value_(ctx, (grn_pat *)obj, id, size);
     break;
+  case GRN_TABLE_DAT_KEY :
+    ERR(GRN_FUNCTION_NOT_IMPLEMENTED, "GRN_TABLE_DAT_KEY not supported");
+    break;
   case GRN_TABLE_HASH_KEY :
     value = grn_hash_get_value_(ctx, (grn_hash *)obj, id, size);
     break;
@@ -4834,6 +5004,9 @@ grn_obj_get_value(grn_ctx *ctx, grn_obj *obj, grn_id id, grn_obj *value)
       value->header.domain = grn_obj_get_range(ctx, obj);
     }
     break;
+  case GRN_TABLE_DAT_KEY :
+    ERR(GRN_FUNCTION_NOT_IMPLEMENTED, "GRN_TABLE_DAT_KEY not supported");
+    break;
   case GRN_TABLE_HASH_KEY :
     {
       grn_hash *hash = (grn_hash *)obj;
@@ -5057,6 +5230,10 @@ grn_obj_get_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *valueb
           enc = ((grn_pat *)obj)->encoding;
           grn_bulk_write(ctx, valuebuf, (const char *)&enc, sizeof(grn_encoding));
           break;
+        case GRN_TABLE_DAT_KEY :
+          enc = ((grn_dat *)obj)->encoding;
+          grn_bulk_write(ctx, valuebuf, (const char *)&enc, sizeof(grn_encoding));
+          break;
         case GRN_TABLE_HASH_KEY :
           enc = ((grn_hash *)obj)->encoding;
           grn_bulk_write(ctx, valuebuf, (const char *)&enc, sizeof(grn_encoding));
@@ -5087,6 +5264,9 @@ grn_obj_get_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *valueb
       case GRN_TABLE_PAT_KEY :
         valuebuf = ((grn_pat *)obj)->tokenizer;
         break;
+      case GRN_TABLE_DAT_KEY :
+        valuebuf = ((grn_dat *)obj)->tokenizer;
+        break;
       }
       break;
     default :
@@ -5158,6 +5338,7 @@ update_source_hook(grn_ctx *ctx, grn_obj *obj)
       switch (source->header.type) {
       case GRN_TABLE_HASH_KEY :
       case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
         grn_obj_add_hook(ctx, source, GRN_HOOK_INSERT, 0, NULL, &data);
         grn_obj_add_hook(ctx, source, GRN_HOOK_DELETE, 0, NULL, &data);
         break;
@@ -5207,6 +5388,7 @@ delete_source_hook(grn_ctx *ctx, grn_obj *obj)
       switch (source->header.type) {
       case GRN_TABLE_HASH_KEY :
       case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
         del_hook(ctx, source, GRN_HOOK_INSERT, &data);
         del_hook(ctx, source, GRN_HOOK_DELETE, &data);
         break;
@@ -5390,6 +5572,11 @@ grn_obj_set_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *value)
         ((grn_pat *)obj)->header->tokenizer = grn_obj_id(ctx, value);
         rc = GRN_SUCCESS;
         break;
+      case GRN_TABLE_DAT_KEY :
+        ((grn_dat *)obj)->tokenizer = value;
+        ((grn_dat *)obj)->header->tokenizer = grn_obj_id(ctx, value);
+        rc = GRN_SUCCESS;
+        break;
       }
     }
   default :
@@ -5617,8 +5804,9 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj)
           if (tbl) {
             switch (tbl->header.type) {
             case GRN_TABLE_HASH_KEY :
-            case GRN_TABLE_NO_KEY:
             case GRN_TABLE_PAT_KEY:
+            case GRN_TABLE_DAT_KEY:
+            case GRN_TABLE_NO_KEY:
               grn_obj_remove(ctx, tbl);
             }
           }
@@ -5644,6 +5832,17 @@ grn_obj_remove(grn_ctx *ctx, grn_obj *obj)
     }
     grn_obj_touch(ctx, db, NULL);
     break;
+  case GRN_TABLE_DAT_KEY :
+    remove_index(ctx, obj, GRN_HOOK_INSERT);
+    remove_columns(ctx, obj);
+    grn_obj_close(ctx, obj);
+    if (path) {
+      grn_ja_put(ctx, ((grn_db *)db)->specs, id, NULL, 0, GRN_OBJ_SET, NULL);
+      grn_obj_delete_by_id(ctx, db, id, 1);
+      grn_dat_remove(ctx, path);
+    }
+    grn_obj_touch(ctx, db, NULL);
+    break;
   case GRN_TABLE_HASH_KEY :
     remove_index(ctx, obj, GRN_HOOK_INSERT);
     remove_columns(ctx, obj);
@@ -5911,6 +6110,11 @@ grn_ctx_at(grn_ctx *ctx, grn_id id)
                   vp->ptr = (grn_obj *)grn_pat_open(ctx, buffer);
                   UNPACK_INFO();
                   break;
+                case GRN_TABLE_DAT_KEY :
+                  GET_PATH(spec, buffer, s, id);
+                  vp->ptr = (grn_obj *)grn_dat_open(ctx, buffer);
+                  UNPACK_INFO();
+                  break;
                 case GRN_TABLE_NO_KEY :
                   GET_PATH(spec, buffer, s, id);
                   vp->ptr = (grn_obj *)grn_array_open(ctx, buffer);
@@ -5945,8 +6149,9 @@ grn_ctx_at(grn_ctx *ctx, grn_id id)
                   break;
                 case GRN_EXPR :
                   {
+                    uint8_t *u = (uint8_t *)p;
                     size = grn_vector_get_element(ctx, &v, 4, &p, NULL, NULL);
-                    vp->ptr = grn_expr_open(ctx, spec, p, p + size);
+                    vp->ptr = grn_expr_open(ctx, spec, u, u + size);
                   }
                   break;
                 }
@@ -6058,6 +6263,9 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj)
     case GRN_CURSOR_TABLE_PAT_KEY :
       grn_pat_cursor_close(ctx, (grn_pat_cursor *)obj);
       break;
+    case GRN_CURSOR_TABLE_DAT_KEY :
+      grn_dat_cursor_close(ctx, (grn_dat_cursor *)obj);
+      break;
     case GRN_CURSOR_TABLE_HASH_KEY :
       grn_hash_cursor_close(ctx, (grn_hash_cursor *)obj);
       break;
@@ -6084,6 +6292,9 @@ grn_obj_close(grn_ctx *ctx, grn_obj *obj)
     case GRN_TABLE_PAT_KEY :
       rc = grn_pat_close(ctx, (grn_pat *)obj);
       break;
+    case GRN_TABLE_DAT_KEY :
+      rc = grn_dat_close(ctx, (grn_dat *)obj);
+      break;
     case GRN_TABLE_HASH_KEY :
       rc = grn_hash_close(ctx, (grn_hash *)obj);
       break;
@@ -6470,8 +6681,9 @@ grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj)
           if (tbl) {
             switch (tbl->header.type) {
             case GRN_TABLE_HASH_KEY :
-            case GRN_TABLE_NO_KEY:
             case GRN_TABLE_PAT_KEY:
+            case GRN_TABLE_DAT_KEY:
+            case GRN_TABLE_NO_KEY:
               grn_obj_clear_lock(ctx, tbl);
             }
           }
@@ -6481,8 +6693,9 @@ grn_obj_clear_lock(grn_ctx *ctx, grn_obj *obj)
     }
     break;
   case GRN_TABLE_HASH_KEY :
-  case GRN_TABLE_NO_KEY :
   case GRN_TABLE_PAT_KEY :
+  case GRN_TABLE_DAT_KEY :
+  case GRN_TABLE_NO_KEY :
     {
       grn_hash *cols;
       if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0,
@@ -7204,6 +7417,7 @@ grn_column_index(grn_ctx *ctx, grn_obj *obj, grn_operator op,
           grn_obj *tokenizer, *lexicon = grn_ctx_at(ctx, target->header.domain);
           if (!lexicon) { continue; }
           if (lexicon->header.type != GRN_TABLE_PAT_KEY) { continue; }
+          /* FIXME: GRN_TABLE_DAT_KEY should be supported */
           grn_table_get_info(ctx, lexicon, NULL, NULL, &tokenizer);
           if (tokenizer) { continue; }
         }
@@ -7229,6 +7443,7 @@ grn_column_index(grn_ctx *ctx, grn_obj *obj, grn_operator op,
           if (a->obj->header.type == GRN_TABLE_PAT_KEY) {
             if (buf_size) { indexbuf[n++] = obj; }
           }
+          /* FIXME: GRN_TABLE_DAT_KEY should be supported */
         }
       }
       break;
@@ -7282,6 +7497,7 @@ grn_column_index(grn_ctx *ctx, grn_obj *obj, grn_operator op,
               grn_obj *tokenizer, *lexicon = grn_ctx_at(ctx, target->header.domain);
               if (!lexicon) { continue; }
               if (lexicon->header.type != GRN_TABLE_PAT_KEY) { continue; }
+              /* FIXME: GRN_TABLE_DAT_KEY should be supported */
               grn_table_get_info(ctx, lexicon, NULL, NULL, &tokenizer);
               if (tokenizer) { continue; }
             }
@@ -7707,6 +7923,7 @@ bracket_close(grn_ctx *ctx, grn_loader *loader)
       switch (loader->table->header.type) {
       case GRN_TABLE_HASH_KEY :
       case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
         if (loader->key_offset != -1 && ndata == ncols + 1) {
           id = loader_add(ctx, value + loader->key_offset);
         } else if (loader->key_offset == -1) {
@@ -7783,7 +8000,8 @@ bracket_close(grn_ctx *ctx, grn_loader *loader)
         int i = 0;
         while (ndata--) {
           if ((loader->table->header.type == GRN_TABLE_HASH_KEY ||
-               loader->table->header.type == GRN_TABLE_PAT_KEY) &&
+               loader->table->header.type == GRN_TABLE_PAT_KEY ||
+               loader->table->header.type == GRN_TABLE_DAT_KEY) &&
               i == loader->key_offset) {
               /* skip this value, because it's already used as key value */
              value = values_next(ctx, value);
@@ -7825,6 +8043,7 @@ brace_close(grn_ctx *ctx, grn_loader *loader)
       switch (loader->table->header.type) {
       case GRN_TABLE_HASH_KEY :
       case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
         {
           grn_obj *v, *key_value = 0;
           for (v = value; v + 1 < ve; v = values_next(ctx, v)) {

  Modified: lib/groonga_in.h (+2 -0)
===================================================================
--- lib/groonga_in.h    2011-06-18 00:33:32 +0000 (356b192)
+++ lib/groonga_in.h    2011-06-18 03:16:54 +0000 (b65bb8d)
@@ -20,7 +20,9 @@
 #define GROONGA_IN_H
 
 #ifdef __GNUC__
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif /* _GNU_SOURCE */
 #endif /* __GNUC__ */
 
 #if defined(__NetBSD__) && !defined(_NETBSD_SOURCE)

  Modified: lib/proc.c (+18 -2)
===================================================================
--- lib/proc.c    2011-06-18 00:33:32 +0000 (698dc8e)
+++ lib/proc.c    2011-06-18 03:16:54 +0000 (fb7d14e)
@@ -438,6 +438,9 @@ grn_parse_table_create_flags(grn_ctx *ctx, const char *nptr, const char *end)
     } else if (!memcmp(nptr, "TABLE_PAT_KEY", 13)) {
       flags |= GRN_OBJ_TABLE_PAT_KEY;
       nptr += 13;
+    } else if (!memcmp(nptr, "TABLE_DAT_KEY", 13)) {
+      flags |= GRN_OBJ_TABLE_DAT_KEY;
+      nptr += 13;
     } else if (!memcmp(nptr, "TABLE_NO_KEY", 12)) {
       flags |= GRN_OBJ_TABLE_NO_KEY;
       nptr += 12;
@@ -507,6 +510,9 @@ grn_table_create_flags_to_text(grn_ctx *ctx, grn_obj *buf, grn_obj_flags flags)
   case GRN_OBJ_TABLE_PAT_KEY:
     GRN_TEXT_PUTS(ctx, buf, "TABLE_PAT_KEY");
     break;
+  case GRN_OBJ_TABLE_DAT_KEY:
+    GRN_TEXT_PUTS(ctx, buf, "TABLE_DAT_KEY");
+    break;
   case GRN_OBJ_TABLE_NO_KEY:
     GRN_TEXT_PUTS(ctx, buf, "TABLE_NO_KEY");
     break;
@@ -924,6 +930,7 @@ print_tableinfo(grn_ctx *ctx, grn_obj *table)
   switch (table->header.type) {
   case GRN_TABLE_HASH_KEY:
   case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_DAT_KEY:
   case GRN_TABLE_NO_KEY:
   case GRN_TABLE_VIEW:
     break;
@@ -1292,6 +1299,7 @@ proc_get_resolve_parameters(grn_ctx *ctx, grn_user_data *user_data, grn_obj **ta
     break;
   case GRN_TABLE_HASH_KEY:
   case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_DAT_KEY:
   case GRN_TABLE_VIEW:
     if (key_length && id_length) {
       ERR(GRN_INVALID_ARGUMENT,
@@ -1450,6 +1458,7 @@ dump_index_column_sources(grn_ctx *ctx, grn_obj *outbuf, grn_obj *column)
       if (i) { GRN_TEXT_PUTC(ctx, outbuf, ','); }
       switch (source->header.type) {
       case GRN_TABLE_PAT_KEY:
+      case GRN_TABLE_DAT_KEY:
       case GRN_TABLE_HASH_KEY:
       case GRN_TABLE_VIEW:
         GRN_TEXT_PUTS(ctx, outbuf, "_key");
@@ -1541,6 +1550,7 @@ reference_column_p(grn_ctx *ctx, grn_obj *column)
   switch (range->header.type) {
   case GRN_TABLE_HASH_KEY:
   case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_DAT_KEY:
   case GRN_TABLE_NO_KEY:
   case GRN_TABLE_VIEW:
     return GRN_TRUE;
@@ -1614,6 +1624,7 @@ dump_records(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table)
   switch (table->header.type) {
   case GRN_TABLE_HASH_KEY:
   case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_DAT_KEY:
   case GRN_TABLE_NO_KEY:
     break;
   case GRN_TABLE_VIEW:
@@ -1649,7 +1660,8 @@ dump_records(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table)
     GRN_BULK_REWIND(&column_name);
     grn_column_name_(ctx, columns[i], &column_name);
     if (((table->header.type == GRN_TABLE_HASH_KEY ||
-          table->header.type == GRN_TABLE_PAT_KEY) &&
+          table->header.type == GRN_TABLE_PAT_KEY ||
+          table->header.type == GRN_TABLE_DAT_KEY) &&
          GRN_TEXT_LEN(&column_name) == 3 &&
          !memcmp(GRN_TEXT_VALUE(&column_name), "_id", 3)) ||
         (table->header.type == GRN_TABLE_NO_KEY &&
@@ -1791,6 +1803,7 @@ dump_table(grn_ctx *ctx, grn_obj *outbuf, grn_obj *table,
   switch (table->header.type) {
   case GRN_TABLE_HASH_KEY:
   case GRN_TABLE_PAT_KEY:
+  case GRN_TABLE_DAT_KEY:
     domain = grn_ctx_at(ctx, table->header.domain);
     if (domain) {
       default_flags |= domain->header.flags;
@@ -1869,6 +1882,7 @@ dump_scheme(grn_ctx *ctx, grn_obj *outbuf)
         switch (object->header.type) {
         case GRN_TABLE_HASH_KEY:
         case GRN_TABLE_PAT_KEY:
+        case GRN_TABLE_DAT_KEY:
         case GRN_TABLE_NO_KEY:
         case GRN_TABLE_VIEW:
           dump_table(ctx, outbuf, object, &pending_columns);
@@ -2049,6 +2063,7 @@ proc_check(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
     case GRN_TABLE_PAT_KEY :
       grn_pat_check(ctx, (grn_pat *)obj);
       break;
+    case GRN_TABLE_DAT_KEY :
     case GRN_TABLE_HASH_KEY :
     case GRN_TABLE_NO_KEY :
     case GRN_COLUMN_FIX_SIZE :
@@ -2150,8 +2165,9 @@ proc_truncate(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
           "no such table: <%.*s>", table_name, table_name_len);
     } else {
       switch (table->header.type) {
-      case GRN_TABLE_PAT_KEY :
       case GRN_TABLE_HASH_KEY :
+      case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_DAT_KEY :
       case GRN_TABLE_NO_KEY :
         grn_table_truncate(ctx, table);
         break;




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