null+****@clear*****
null+****@clear*****
2010年 9月 15日 (水) 14:09:48 JST
Kouhei Sutou 2010-09-15 05:09:48 +0000 (Wed, 15 Sep 2010) New Revision: ecebc81a986df02439b3cd62207cbaad9b01f644 Log: grn_pat_at() can't detect encoded key entry. #514 Modified files: lib/pat.c test/unit/core/test-patricia-trie.c Modified: lib/pat.c (+11 -5) =================================================================== --- lib/pat.c 2010-09-15 06:14:30 +0000 (63aaae7) +++ lib/pat.c 2010-09-15 05:09:48 +0000 (3b08811) @@ -793,15 +793,13 @@ grn_pat_add(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, return r0; } -grn_id -grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value) +inline static grn_id +_grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value) { grn_id r; pat_node *rn; int c0 = -1, c; uint32_t len = key_size * 16; - uint8_t keybuf[MAX_FIXED_KEY_SIZE]; - KEY_ENCODE(pat, keybuf, key, key_size); PAT_AT(pat, 0, rn); for (r = rn->lr[1]; r;) { PAT_AT(pat, r, rn); @@ -834,6 +832,14 @@ grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void } grn_id +grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value) +{ + uint8_t keybuf[MAX_FIXED_KEY_SIZE]; + KEY_ENCODE(pat, keybuf, key, key_size); + return _grn_pat_get(ctx, pat, key, key_size, value); +} + +grn_id grn_pat_nextid(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size) { grn_id r = GRN_ID_NIL; @@ -1427,7 +1433,7 @@ grn_pat_at(grn_ctx *ctx, grn_pat *pat, grn_id id) { uint32_t key_size; const char *key = _grn_pat_key(ctx, pat, id, &key_size); - if (id == grn_pat_get(ctx, pat, key, key_size, NULL)) { return id; } + if (id == _grn_pat_get(ctx, pat, key, key_size, NULL)) { return id; } return GRN_ID_NIL; } Modified: test/unit/core/test-patricia-trie.c (+55 -2) =================================================================== --- test/unit/core/test-patricia-trie.c 2010-09-15 06:14:30 +0000 (b3ec3bd) +++ test/unit/core/test-patricia-trie.c 2010-09-15 05:09:48 +0000 (d7c1194) @@ -44,11 +44,12 @@ void test_set_value(void); void test_set_value_with_null_value(void); void data_add_and_delete(void); void test_add_and_delete(gconstpointer data); -void data_truncate(void); -void test_truncate(gconstpointer data); +void data_at(void); +void test_at(gconstpointer data); static GArray *ids; static GList *expected_keys, *actual_keys; +static grn_obj *database; void cut_setup(void) @@ -786,3 +787,55 @@ test_truncate(gconstpointer data) grn_test_assert(grn_pat_truncate(context, trie)); cut_assert_equal_uint(0, grn_pat_size(context, trie)); } + +void +data_at(void) +{ +#define ADD_DATUM(label, commands) \ + gcut_add_datum(label, \ + "commands", G_TYPE_STRING, commands, \ + NULL) + + ADD_DATUM("Int32", + "table_create Pat TABLE_PAT_KEY Int32\n" + "load --table Pat\n" + "[{\"_key\": -29}]"); + ADD_DATUM("UInt32", + "table_create Pat TABLE_PAT_KEY UInt32\n" + "load --table Pat\n" + "[{\"_key\": 29}]"); + ADD_DATUM("GeoPoint", + "table_create Pat TABLE_PAT_KEY TokyoGeoPoint\n" + "load --table Pat\n" + "[{\"_key\": \"128467228x503222332\"}]"); + ADD_DATUM("ShortText", + "table_create Pat TABLE_PAT_KEY ShortText\n" + "load --table Pat\n" + "[{\"_key\": \"niku\"}]"); + +#undef ADD_DATUM +} + +void +test_at(gconstpointer data) +{ + grn_obj *pat; + + cut_assert_open_context(); + + database = grn_db_create(context, + cut_build_path(grn_test_get_tmp_dir(), + "patricia-trie.db", + NULL), + NULL); + grn_test_assert_context(context); + + assert_send_commands(gcut_data_get_string(data, "commands")); + pat = grn_ctx_get(context, "Pat", strlen("Pat")); + grn_test_assert_equal_id(context, + 1, + grn_pat_at(context, (grn_pat *)pat, 1)); + grn_test_assert_equal_id(context, + 0, + grn_pat_at(context, (grn_pat *)pat, 2)); +}