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;