morita
morit****@razil*****
2008年 9月 10日 (水) 18:29:09 JST
ご指摘ありがとうございます・・ これは意図してない動きです。。 カスケードして削除するかどうかcallback関数で制御できるような 仕組みを入れてるのですが、今は呼ばれてないので無条件に削除されてしまってます。 デフォルトの動作をどうするかちょっと考えます。 Kouhei Sutou さんは書きました: > 須藤です。 > > 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 >> > > _______________________________________________ > Senna-dev mailing list > Senna****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/senna-dev > バグ報告方法:http://qwik.jp/senna/bug_report.html >