Kouhei Sutou
kou****@cozmi*****
2008年 7月 23日 (水) 09:54:13 JST
須藤です。 SEN_PAT_WITH_SIS指定のsen_patでは同じIDで2回以上 sen_pat_delete_by_id()をしてもsen_successが返ってくる ことがあるようです。これは意図した挙動でしょうか? 2回目以降は存在しないIDを削除することになるので sen_invalid_argumentかなぁと思いました。 最後のプログラムの実行結果: min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE Senna セ セナ セナ + Ruby セナセ セナセナ ナ ナ + Ruby ナセ ナセナ ナセナセ sen_pat_delete_by_id() result: 0 sen_pat_delete_by_id() result: 0 min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE Senna セ セナ + Ruby セナセ ナ + Ruby ナセ ナセナセ sen_pat_delete_by_id() result: 0 テストプログラム: #include <stdio.h> #include <string.h> #include <pat.h> static sen_id add(sen_ctx *context, sen_pat *pat, const char *key) { sen_table_search_flags flags; flags = SEN_TABLE_ADD; return sen_pat_lookup(context, pat, key, strlen(key) + 1, NULL, &flags); } #define BUFFER_SIZE 4096 static void dump(sen_ctx *context, sen_pat *pat, const char *min, const char *max, int flags) { sen_id id; sen_pat_cursor *cursor; printf("min: %s; max: %s; direction: %s; GT: %s; LT: %s\n", min ? min : "(null)", max ? max : "(null)", flags & SEN_PAT_ASCENDING ? "ASCENDING" : "DESCENDING", flags & SEN_PAT_GT ? "TRUE" : "FALSE", flags & SEN_PAT_LT ? "TRUE" : "FALSE"); cursor = sen_pat_cursor_open(context, pat, min, min ? strlen(min) + 1 : 0, max, max ? strlen(max) + 1 : 0, flags); id = sen_pat_cursor_next(context, cursor); while (id != SEN_ID_NIL) { char buffer[BUFFER_SIZE]; sen_pat_get_key(context, pat, id, buffer, BUFFER_SIZE - 1); printf("%s\n", buffer); id = sen_pat_cursor_next(context, cursor); } printf("\n"); sen_pat_cursor_close(context, cursor); } int main(int argc, char **argv) { sen_ctx *context; sen_pat *pat; sen_id id; sen_init(); context = sen_ctx_open(NULL, SEN_CTX_USEQL); pat = sen_pat_create(context, "/tmp/xxx", 128, 64, SEN_PAT_WITH_SIS, sen_enc_utf8); add(context, pat, "セナ"); add(context, pat, "ナセナセ"); add(context, pat, "Senna"); add(context, pat, "セナ + Ruby"); id = add(context, pat, "セナセナ"); dump(context, pat, NULL, NULL, SEN_PAT_ASCENDING); printf("sen_pat_delete_by_id() result: %d\n", sen_pat_delete_by_id(context, pat, id)); printf("sen_pat_delete_by_id() result: %d\n", sen_pat_delete_by_id(context, pat, id)); dump(context, pat, NULL, NULL, SEN_PAT_ASCENDING); printf("sen_pat_delete_by_id() result: %d\n", sen_pat_delete_by_id(context, pat, id)); sen_pat_close(context, pat); sen_ctx_close(context); sen_fin(); return 0; }