[Senna-dev 1010] Re: SISのとき追加したキーをsen_pat_delete_by_id()で消せない

Back to archive index

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
> 




Senna-dev メーリングリストの案内
Back to archive index