Kouhei Sutou
kou****@cozmi*****
2008年 9月 10日 (水) 18:06:48 JST
須藤です。 2008/09/10 18:02 morita <morit****@razil*****>: > はい。SISつきのpatでの削除が無視されるケースがあるのは現状では意図した動きです。 > こちらは仕様として明示するようにしたいと思います。 了解しました。 では、逆に、 >> 1. "セナ" >> 2. "セナセナ" のうち"セナセナ"を消すと"セナ"の分のレコードも削除されるというのも 意図した挙動ということでよいでしょうか? > Kouhei Sutou さんは書きました: >> 須藤です。 >> >> SEN_TABLE_KEY_WITH_SISで作ったsen_patがあるとします。 >> このsen_patに追加したときに返ってきたIDを使って >> sen_pat_delete_by_id()でそのレコードを消そうとしても失敗する >> ことがあります。具体的には、他のレコードのSISと同じ内容の >> レコードになっているときです。 >> >> 例えば、この二つのレコードを追加したときは、最初に追加した >> レコードのIDを使ったsen_pat_delete_by_id()が失敗します。 >> >> 1. "セナ" >> 2. "セナセナ" >> >> これは意図した挙動でしょうか? >> >> >> テストプログラムとその出力は以下の通りです。 >> -- >> min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE >> セナ >> セナセナ >> ナ >> ナセナ >> >> sen_pat_delete_by_id() result: 4 >> >> min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE >> セナ >> セナセナ >> ナ >> ナセナ >> -- >> >> /* -*- c-basic-offset: 2 -*- */ >> >> #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_CURSOR_ASCENDING ? "ASCENDING" : "DESCENDING", >> flags & SEN_CURSOR_GT ? "TRUE" : "FALSE", >> flags & SEN_CURSOR_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 id1, id2; >> >> sen_init(); >> >> context = sen_ctx_open(NULL, SEN_CTX_USEQL); >> pat = sen_pat_create(context, "/tmp/xxx", 128, 64, >> SEN_TABLE_KEY_WITH_SIS, sen_enc_utf8); >> >> id1 = add(context, pat, "セナ"); >> id2 = add(context, pat, "セナセナ"); >> >> dump(context, pat, NULL, NULL, SEN_CURSOR_ASCENDING); >> printf("sen_pat_delete_by_id() result: %d\n", >> sen_pat_delete_by_id(context, pat, id1)); >> printf("\n"); >> dump(context, pat, NULL, NULL, SEN_CURSOR_ASCENDING); >> >> sen_pat_close(context, pat); >> sen_ctx_close(context); >> >> sen_fin(); >> >> return 0; >> } >> >> _______________________________________________ >> Senna-dev mailing list >> Senna****@lists***** >> http://lists.sourceforge.jp/mailman/listinfo/senna-dev >> バグ報告方法:http://qwik.jp/senna/bug_report.html >> > > _______________________________________________ > Senna-dev mailing list > Senna****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/senna-dev > バグ報告方法:http://qwik.jp/senna/bug_report.html >