null+****@clear*****
null+****@clear*****
2011年 11月 18日 (金) 17:58:12 JST
Daijiro MORI 2011-11-18 08:58:12 +0000 (Fri, 18 Nov 2011) New Revision: 964ec43bf468229b119de155bc14b3eee49706d1 Log: adopted grn_dat for table/column name management. refs #1167 Modified files: lib/db.c lib/db.h Modified: lib/db.c (+169 -88) =================================================================== --- lib/db.c 2011-11-17 19:41:18 +0000 (3ea6d1b) +++ lib/db.c 2011-11-18 08:58:12 +0000 (a4c8686) @@ -89,8 +89,14 @@ grn_db_create(grn_ctx *ctx, const char *path, grn_db_create_optarg *optarg) GRN_TINY_ARRAY_CLEAR| GRN_TINY_ARRAY_THREADSAFE| GRN_TINY_ARRAY_USE_MALLOC); - if ((s->keys = grn_pat_create(ctx, path, GRN_PAT_MAX_KEY_SIZE, 0, - GRN_OBJ_KEY_VAR_SIZE))) { +#ifdef USE_PAT_AS_DB_KEYS + s->keys = (grn_obj *)grn_pat_create(ctx, path, GRN_PAT_MAX_KEY_SIZE, + 0, GRN_OBJ_KEY_VAR_SIZE); +#else /* USE_PAT_AS_DB_KEYS */ + s->keys = (grn_obj *)grn_dat_create(ctx, path, GRN_PAT_MAX_KEY_SIZE, + 0, GRN_OBJ_KEY_VAR_SIZE); +#endif /* USE_PAT_AS_DB_KEYS */ + if (s->keys) { CRITICAL_SECTION_INIT(s->lock); GRN_DB_OBJ_SET_TYPE(s, GRN_DB); s->obj.db = (grn_obj *)s; @@ -113,8 +119,13 @@ grn_db_create(grn_ctx *ctx, const char *path, grn_db_create_optarg *optarg) grn_db_init_builtin_types(ctx); GRN_API_RETURN((grn_obj *)s); } - grn_pat_close(ctx, s->keys); +#ifdef USE_PAT_AS_DB_KEYS + grn_pat_close(ctx, (grn_pat *)s->keys); grn_pat_remove(ctx, path); +#else /* USE_PAT_AS_DB_KEYS */ + grn_dat_close(ctx, (grn_dat *)s->keys); + grn_dat_remove(ctx, path); +#endif /* USE_PAT_AS_DB_KEYS */ } grn_tiny_array_fin(&s->values); GRN_FREE(s); @@ -135,11 +146,22 @@ grn_db_open(grn_ctx *ctx, const char *path) GRN_API_ENTER; if (path && strlen(path) <= PATH_MAX - 14) { if ((s = GRN_MALLOC(sizeof(grn_db)))) { + uint32_t type = grn_io_detect_type(ctx, path); grn_tiny_array_init(ctx, &s->values, sizeof(db_value), GRN_TINY_ARRAY_CLEAR| GRN_TINY_ARRAY_THREADSAFE| GRN_TINY_ARRAY_USE_MALLOC); - if ((s->keys = grn_pat_open(ctx, path))) { + switch (type) { + case GRN_TABLE_PAT_KEY : + s->keys = (grn_obj *)grn_pat_open(ctx, path); + break; + case GRN_TABLE_DAT_KEY : + s->keys = (grn_obj *)grn_dat_open(ctx, path); + break; + default : + s->keys = NULL; + } + if (s->keys) { char buffer[PATH_MAX]; gen_pathname(path, buffer, 0); if ((s->specs = grn_ja_open(ctx, buffer))) { @@ -159,7 +181,14 @@ grn_db_open(grn_ctx *ctx, const char *path) grn_db_init_builtin_query(ctx); GRN_API_RETURN((grn_obj *)s); } - grn_pat_close(ctx, s->keys); + switch (type) { + case GRN_TABLE_PAT_KEY : + grn_pat_close(ctx, (grn_pat *)s->keys); + break; + case GRN_TABLE_DAT_KEY : + grn_dat_close(ctx, (grn_dat *)s->keys); + break; + } } grn_tiny_array_fin(&s->values); GRN_FREE(s); @@ -172,6 +201,22 @@ grn_db_open(grn_ctx *ctx, const char *path) GRN_API_RETURN(NULL); } +static grn_id +grn_db_curr_id(grn_ctx *ctx, grn_obj *db) +{ + grn_id curr_id = GRN_ID_NIL; + grn_db *s = (grn_db *)db; + switch (s->keys->header.type) { + case GRN_TABLE_PAT_KEY : + curr_id = grn_pat_curr_id(ctx, (grn_pat *)s->keys); + break; + case GRN_TABLE_DAT_KEY : + curr_id = grn_dat_curr_id(ctx, (grn_dat *)s->keys); + break; + } + return curr_id; +} + /* s must be validated by caller */ grn_rc grn_db_close(grn_ctx *ctx, grn_obj *db) @@ -186,7 +231,7 @@ grn_db_close(grn_ctx *ctx, grn_obj *db) if (ctx_used_db) { grn_ctx_loader_clear(ctx); } - GRN_TINY_ARRAY_EACH(&s->values, 1, grn_pat_curr_id(ctx, s->keys), id, vp, { + GRN_TINY_ARRAY_EACH(&s->values, 1, grn_db_curr_id(ctx, db), id, vp, { if (vp->ptr) { grn_obj_close(ctx, vp->ptr); } }); /* grn_tiny_array_fin should be refined.. */ @@ -197,7 +242,14 @@ grn_db_close(grn_ctx *ctx, grn_obj *db) } #endif grn_tiny_array_fin(&s->values); - grn_pat_close(ctx, s->keys); + switch (s->keys->header.type) { + case GRN_TABLE_PAT_KEY : + grn_pat_close(ctx, (grn_pat *)s->keys); + break; + case GRN_TABLE_DAT_KEY : + grn_dat_close(ctx, (grn_dat *)s->keys); + break; + } CRITICAL_SECTION_FIN(s->lock); if (s->specs) { grn_ja_close(ctx, s->specs); } GRN_FREE(s); @@ -222,7 +274,7 @@ grn_ctx_get(grn_ctx *ctx, const char *name, unsigned name_size) GRN_API_ENTER; if (GRN_DB_P(db)) { grn_db *s = (grn_db *)db; - if ((id = grn_pat_get(ctx, s->keys, name, name_size, NULL))) { + if ((id = grn_table_get(ctx, s->keys, name, name_size))) { obj = grn_ctx_at(ctx, id); } } @@ -241,10 +293,46 @@ grn_db_keys(grn_obj *s) return (grn_obj *)(((grn_db *)s)->keys); } +static grn_io* +grn_obj_io(grn_obj *obj) +{ + grn_io *io = NULL; + if (obj) { + if (obj->header.type == GRN_DB) { obj = ((grn_db *)obj)->keys; } + switch (obj->header.type) { + 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; + case GRN_TABLE_NO_KEY : + io = ((grn_array *)obj)->io; + break; + case GRN_TABLE_VIEW : + io = ((grn_view *)obj)->hash->io; + break; + case GRN_COLUMN_VAR_SIZE : + io = ((grn_ja *)obj)->io; + break; + case GRN_COLUMN_FIX_SIZE : + io = ((grn_ra *)obj)->io; + break; + case GRN_COLUMN_INDEX : + io = ((grn_ii *)obj)->seg; + break; + } + } + return io; +} + uint32_t grn_db_lastmod(grn_obj *s) { - return (((grn_db *)s)->keys)->io->header->lastmod; + return grn_obj_io(((grn_db *)s)->keys)->header->lastmod; } void @@ -252,7 +340,7 @@ grn_db_touch(grn_ctx *ctx, grn_obj *s) { grn_timeval tv; grn_timeval_now(ctx, &tv); - (((grn_db *)s)->keys)->io->header->lastmod = tv.tv_sec; + grn_obj_io(s)->header->lastmod = tv.tv_sec; } #define IS_TEMP(obj) (DB_OBJ(obj)->id & GRN_OBJ_TMP_OBJECT) @@ -268,7 +356,7 @@ grn_obj_touch(grn_ctx *ctx, grn_obj *obj, grn_timeval *tv) if (obj) { switch (obj->header.type) { case GRN_DB : - ((grn_db *)obj)->keys->io->header->lastmod = tv->tv_sec; + grn_obj_io(obj)->header->lastmod = tv->tv_sec; break; case GRN_TABLE_HASH_KEY : case GRN_TABLE_PAT_KEY : @@ -278,7 +366,7 @@ grn_obj_touch(grn_ctx *ctx, grn_obj *obj, grn_timeval *tv) case GRN_COLUMN_FIX_SIZE : case GRN_COLUMN_INDEX : if (!IS_TEMP(obj)) { - ((grn_db *)DB_OBJ(obj)->db)->keys->io->header->lastmod = tv->tv_sec; + grn_obj_io(DB_OBJ(obj)->db)->header->lastmod = tv->tv_sec; } break; } @@ -386,8 +474,8 @@ grn_proc_create(grn_ctx *ctx, const char *name, unsigned name_size, grn_proc_typ } if (name && name_size) { grn_db *s = (grn_db *)db; - if (!(id = grn_pat_add(ctx, s->keys, name, name_size, NULL, &added))) { - ERR(GRN_NO_MEMORY_AVAILABLE, "grn_pat_add failed"); + if (!(id = grn_table_add(ctx, s->keys, name, name_size, &added))) { + ERR(GRN_NO_MEMORY_AVAILABLE, "grn_table_add failed"); GRN_API_RETURN(NULL); } if (!added) { @@ -593,7 +681,7 @@ grn_table_create(grn_ctx *ctx, const char *name, unsigned name_size, GRN_LOG(ctx, GRN_LOG_NOTICE, "DDL:table_create %.*s", name_size, name); if (!path) { if (GRN_DB_PERSISTENT_P(db)) { - gen_pathname(((grn_db *)db)->keys->io->path, buffer, id); + gen_pathname(grn_obj_io(db)->path, buffer, id); path = buffer; } else { ERR(GRN_INVALID_ARGUMENT, "path not assigned for persistent table"); @@ -1350,7 +1438,17 @@ 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; + WITH_NORMALIZE((grn_dat *)table, key, key_size, { + grn_dat *dat = (grn_dat *)table; + if (dat->io && !(dat->io->flags & GRN_IO_TEMPORARY)) { + if (!(rc = grn_io_lock(ctx, dat->io, 10000000))) { + rc = grn_dat_delete(ctx, dat, key, key_size, NULL); + grn_io_unlock(dat->io); + } + } else { + rc = grn_dat_delete(ctx, dat, key, key_size, NULL); + } + }); break; case GRN_TABLE_HASH_KEY : WITH_NORMALIZE((grn_hash *)table, key, key_size, { @@ -1390,7 +1488,7 @@ _grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id, rc = grn_pat_delete_by_id(ctx, (grn_pat *)table, id, optarg); break; case GRN_TABLE_DAT_KEY : - rc = GRN_OPERATION_NOT_SUPPORTED; + rc = grn_dat_delete_by_id(ctx, (grn_dat *)table, id, optarg); break; case GRN_TABLE_HASH_KEY : rc = grn_hash_delete_by_id(ctx, (grn_hash *)table, id, optarg); @@ -1407,44 +1505,6 @@ _grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id, return rc; } -static grn_io* -grn_obj_io(grn_obj *obj) -{ - grn_io *io = NULL; - if (obj) { - switch (obj->header.type) { - case GRN_DB : - io = ((grn_db *)obj)->keys->io; - break; - 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; - case GRN_TABLE_NO_KEY : - io = ((grn_array *)obj)->io; - break; - case GRN_TABLE_VIEW : - io = ((grn_view *)obj)->hash->io; - break; - case GRN_COLUMN_VAR_SIZE : - io = ((grn_ja *)obj)->io; - break; - case GRN_COLUMN_FIX_SIZE : - io = ((grn_ra *)obj)->io; - break; - case GRN_COLUMN_INDEX : - io = ((grn_ii *)obj)->seg; - break; - } - } - return io; -} - grn_rc grn_table_delete_by_id(grn_ctx *ctx, grn_obj *table, grn_id id) { @@ -1598,7 +1658,7 @@ grn_table_size(grn_ctx *ctx, grn_obj *table) if (table) { switch (table->header.type) { case GRN_DB : - n = grn_pat_size(ctx, ((grn_db *)table)->keys); + n = grn_table_size(ctx, ((grn_db *)table)->keys); break; case GRN_TABLE_PAT_KEY : n = grn_pat_size(ctx, (grn_pat *)table); @@ -1991,12 +2051,8 @@ grn_table_cursor_open(grn_ctx *ctx, grn_obj *table, } } if (!ctx->rc) { + if (table->header.type == GRN_DB) { table = ((grn_db *)table)->keys; } switch (table->header.type) { - case GRN_DB : - tc = (grn_table_cursor *)grn_pat_cursor_open(ctx, ((grn_db *)table)->keys, - min, min_size, - max, max_size, offset, limit, flags); - break; case GRN_TABLE_PAT_KEY : tc = (grn_table_cursor *)grn_pat_cursor_open(ctx, (grn_pat *)table, min, min_size, @@ -2433,10 +2489,30 @@ grn_table_search(grn_ctx *ctx, grn_obj *table, const void *key, uint32_t key_siz if (id) { grn_table_add(ctx, res, &id, sizeof(grn_id), NULL); } break; case GRN_OP_PREFIX : - rc = GRN_OPERATION_NOT_SUPPORTED; + { + grn_dat_cursor *dc = grn_dat_cursor_open(ctx, dat, key, key_size, NULL, 0, + 0, -1, GRN_CURSOR_PREFIX); + if (dc) { + grn_id id; + while ((id = grn_dat_cursor_next(ctx, dc))) { + grn_table_add(ctx, res, &id, sizeof(grn_id), NULL); + } + grn_dat_cursor_close(ctx, dc); + } + } break; case GRN_OP_LCP : - rc = GRN_OPERATION_NOT_SUPPORTED; + { + grn_dat_cursor *dc = grn_dat_cursor_open(ctx, dat, NULL, 0, key, key_size, + 0, 1, GRN_CURSOR_PREFIX); + if (dc) { + grn_id id; + if ((id = grn_dat_cursor_next(ctx, dc))) { + grn_table_add(ctx, res, &id, sizeof(grn_id), NULL); + } + grn_dat_cursor_close(ctx, dc); + } + } break; default : rc = GRN_INVALID_ARGUMENT; @@ -2918,16 +2994,17 @@ grn_table_columns(grn_ctx *ctx, grn_obj *table, const char *name, unsigned name_ { int n = 0; GRN_API_ENTER; - if (GRN_OBJ_TABLEP(table) && !(DB_OBJ(table)->id & GRN_OBJ_TMP_OBJECT)) { + if (GRN_OBJ_TABLEP(table) && DB_OBJ(table)->id && + !(DB_OBJ(table)->id & GRN_OBJ_TMP_OBJECT)) { grn_db *s = (grn_db *)DB_OBJ(table)->db; if (s->keys) { grn_obj bulk; GRN_TEXT_INIT(&bulk, 0); - grn_pat_get_key2(ctx, s->keys, DB_OBJ(table)->id, &bulk); + grn_table_get_key2(ctx, s->keys, DB_OBJ(table)->id, &bulk); GRN_TEXT_PUTC(ctx, &bulk, GRN_DB_DELIMITER); grn_bulk_write(ctx, &bulk, name, name_size); - grn_pat_prefix_search(ctx, s->keys, GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk), - (grn_hash *)res); + grn_table_search(ctx, s->keys, GRN_BULK_HEAD(&bulk), GRN_BULK_VSIZE(&bulk), + GRN_OP_PREFIX, res, GRN_OP_OR); grn_obj_close(ctx, &bulk); n = grn_table_size(ctx, res); } @@ -2939,9 +3016,8 @@ const char * _grn_table_key(grn_ctx *ctx, grn_obj *table, grn_id id, uint32_t *key_size) { GRN_ASSERT(table); + if (table->header.type == GRN_DB) { table = ((grn_db *)table)->keys; } switch (table->header.type) { - case GRN_DB : - return _grn_pat_key(ctx, ((grn_db *)table)->keys, id, key_size); case GRN_TABLE_HASH_KEY : return _grn_hash_key(ctx, (grn_hash *)table, id, key_size); case GRN_TABLE_PAT_KEY : @@ -3022,8 +3098,7 @@ grn_column_create(grn_ctx *ctx, grn_obj *table, goto exit; } if ((domain = DB_OBJ(table)->id)) { - int len = grn_pat_get_key(ctx, s->keys, domain, - fullname, GRN_PAT_MAX_KEY_SIZE); + int len = grn_table_get_key(ctx, s->keys, domain, fullname, GRN_PAT_MAX_KEY_SIZE); if (name_size + 1 + len > GRN_PAT_MAX_KEY_SIZE) { ERR(GRN_INVALID_ARGUMENT, "[column][create]: too long column name: required name_size(%d) < %d" @@ -3068,7 +3143,7 @@ grn_column_create(grn_ctx *ctx, grn_obj *table, if (GRN_OBJ_PERSISTENT & flags) { if (!path) { if (GRN_DB_PERSISTENT_P(db)) { - gen_pathname(s->keys->io->path, buffer, id); + gen_pathname(grn_obj_io(db)->path, buffer, id); path = buffer; } else { int table_name_len; @@ -3181,7 +3256,7 @@ grn_column_open(grn_ctx *ctx, grn_obj *table, goto exit; } if ((domain = DB_OBJ(table)->id)) { - int len = grn_pat_get_key(ctx, s->keys, domain, fullname, GRN_PAT_MAX_KEY_SIZE); + int len = grn_table_get_key(ctx, s->keys, domain, fullname, GRN_PAT_MAX_KEY_SIZE); if (name_size + 1 + len > GRN_PAT_MAX_KEY_SIZE) { ERR(GRN_INVALID_ARGUMENT, "too long column name"); goto exit; @@ -4422,7 +4497,7 @@ grn_accessor_get_value_(grn_ctx *ctx, grn_accessor *a, grn_id id, uint32_t *size value = grn_obj_get_value_(ctx, a->obj, id, size); break; case GRN_ACCESSOR_GET_DB_OBJ : - value = _grn_pat_key(ctx, ((grn_db *)ctx->impl->db)->keys, id, size); + value = _grn_table_key(ctx, ((grn_db *)ctx->impl->db)->keys, id, size); break; case GRN_ACCESSOR_LOOKUP : /* todo */ @@ -5342,11 +5417,8 @@ grn_obj_get_info(grn_ctx *ctx, grn_obj *obj, grn_info_type type, grn_obj *valueb } { grn_encoding enc; + if (obj->header.type == GRN_DB) { obj = ((grn_db *)obj)->keys; } switch (obj->header.type) { - case GRN_DB : - enc = ((grn_db *)obj)->keys->encoding; - grn_bulk_write(ctx, valuebuf, (const char *)&enc, sizeof(grn_encoding)); - break; case GRN_TABLE_PAT_KEY : enc = ((grn_pat *)obj)->encoding; grn_bulk_write(ctx, valuebuf, (const char *)&enc, sizeof(grn_encoding)); @@ -6087,9 +6159,9 @@ grn_obj_register(grn_ctx *ctx, grn_obj *db, const char *name, unsigned name_size if (name && name_size) { grn_db *s = (grn_db *)db; int added; - if (!(id = grn_pat_add(ctx, s->keys, name, name_size, NULL, &added))) { + if (!(id = grn_table_add(ctx, s->keys, name, name_size, &added))) { ERR(GRN_NO_MEMORY_AVAILABLE, - "grn_pat_add failed: <%.*s>", name_size, name); + "grn_table_add failed: <%.*s>", name_size, name); } else if (!added) { ERR(GRN_INVALID_ARGUMENT, "already used name was assigned: <%.*s>", name_size, name); @@ -6119,7 +6191,16 @@ grn_obj_delete_by_id(grn_ctx *ctx, grn_obj *db, grn_id id, int removep) vp->ptr = NULL; vp->done = 0; } - return removep ? grn_pat_delete_by_id(ctx, s->keys, id, NULL) : GRN_SUCCESS; + if (removep) { + switch (s->keys->header.type) { + case GRN_TABLE_PAT_KEY : + return grn_pat_delete_by_id(ctx, (grn_pat *)s->keys, id, NULL); + case GRN_TABLE_DAT_KEY : + return grn_dat_delete_by_id(ctx, (grn_dat *)s->keys, id, NULL); + } + } else { + return GRN_SUCCESS; + } } } return GRN_INVALID_ARGUMENT; @@ -6173,7 +6254,7 @@ grn_db_obj_init(grn_ctx *ctx, grn_obj *db, grn_id id, grn_db_obj *obj) memcpy(buffer, path, size);\ buffer[size] = '\0';\ } else {\ - gen_pathname(s->keys->io->path, buffer, id);\ + gen_pathname(grn_obj_io(s->keys)->path, buffer, id); \ }\ } @@ -6655,7 +6736,7 @@ grn_obj_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) if (DB_OBJ(obj)->id) { grn_db *s = (grn_db *)DB_OBJ(obj)->db; if (!(DB_OBJ(obj)->id & GRN_OBJ_TMP_OBJECT)) { - len = grn_pat_get_key(ctx, s->keys, DB_OBJ(obj)->id, namebuf, buf_size); + len = grn_table_get_key(ctx, s->keys, DB_OBJ(obj)->id, namebuf, buf_size); } } } @@ -6672,7 +6753,7 @@ grn_column_name(grn_ctx *ctx, grn_obj *obj, char *namebuf, int buf_size) if (GRN_DB_OBJP(obj)) { if (DB_OBJ(obj)->id && DB_OBJ(obj)->id < GRN_ID_MAX) { grn_db *s = (grn_db *)DB_OBJ(obj)->db; - len = grn_pat_get_key(ctx, s->keys, DB_OBJ(obj)->id, buf, GRN_TABLE_MAX_KEY_SIZE); + len = grn_table_get_key(ctx, s->keys, DB_OBJ(obj)->id, buf, GRN_TABLE_MAX_KEY_SIZE); if (len) { int cl; char *p = buf, *p0 = p, *pe = p + len; @@ -6737,7 +6818,7 @@ grn_column_name_(grn_ctx *ctx, grn_obj *obj, grn_obj *buf) if (DB_OBJ(obj)->id && DB_OBJ(obj)->id < GRN_ID_MAX) { uint32_t len; grn_db *s = (grn_db *)DB_OBJ(obj)->db; - const char *p = _grn_pat_key(ctx, s->keys, DB_OBJ(obj)->id, &len); + const char *p = _grn_table_key(ctx, s->keys, DB_OBJ(obj)->id, &len); if (len) { int cl; const char *p0 = p, *pe = p + len; @@ -7500,7 +7581,7 @@ grn_db_init_builtin_types(grn_ctx *ctx) obj = deftype(ctx, "WGS84GeoPoint", GRN_OBJ_KEY_GEO_POINT, sizeof(grn_geo_point)); if (!obj || DB_OBJ(obj)->id != GRN_DB_WGS84_GEO_POINT) { return GRN_FILE_CORRUPT; } - for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < GRN_DB_MECAB; id++) { + for (id = grn_db_curr_id(ctx, db) + 1; id < GRN_DB_MECAB; id++) { grn_itoh(id, buf + 3, 2); grn_obj_register(ctx, db, buf, 5); } @@ -7513,12 +7594,12 @@ grn_db_init_builtin_types(grn_ctx *ctx) } #endif grn_db_init_builtin_tokenizers(ctx); - for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < 128; id++) { + for (id = grn_db_curr_id(ctx, db) + 1; id < 128; id++) { grn_itoh(id, buf + 3, 2); grn_obj_register(ctx, db, buf, 5); } grn_db_init_builtin_query(ctx); - for (id = grn_pat_curr_id(ctx, ((grn_db *)db)->keys) + 1; id < GRN_N_RESERVED_TYPES; id++) { + for (id = grn_db_curr_id(ctx, db) + 1; id < GRN_N_RESERVED_TYPES; id++) { grn_itoh(id, buf + 3, 2); grn_obj_register(ctx, db, buf, 5); } Modified: lib/db.h (+1 -1) =================================================================== --- lib/db.h 2011-11-17 19:41:18 +0000 (bd10d2a) +++ lib/db.h 2011-11-18 08:58:12 +0000 (ae9e13f) @@ -67,7 +67,7 @@ typedef struct _grn_proc grn_proc; struct _grn_db { grn_db_obj obj; - grn_pat *keys; + grn_obj *keys; grn_ja *specs; grn_tiny_array values; grn_critical_section lock;