Kouhei Sutou
kou****@cozmi*****
2008年 7月 22日 (火) 10:03:31 JST
須藤です。 カーソルの動きが修正されたのを確認しました。 ありがとうございます。 カーソルの動きについてもう一点質問があります。 それは、min/maxが指定されて、その間にひとつもエントリがない 場合の動きです。最後につけたプログラムの出力は以下の通りに なります。 min: (null); max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE Senna セナ セナ + Ruby セナセナ ナセナセ min: セナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE セナ セナ + Ruby セナセナ ナセナセ min: (null); max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE Senna セナ セナ + Ruby セナセナ min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE セナセナ ナセナセ min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE セナ セナ + Ruby セナセナ min: セナセナ; max: セナ; direction: ASCENDING; GT: FALSE; LT: FALSE セナセナ ナセナセ ↑の最後の出力がmin/max中にひとつもエントリがない場合です。 現在はmaxが無視されるような動作になっていますが、この動作は 意図的でしょうか?何も選択されないのかと予想したら違う動作に なったので質問してみました。 ちなみに、ascendingでもdescendingでも同じような動きになります。 #include <stdio.h> #include <string.h> #include <pat.h> static void add(sen_ctx *context, sen_pat *pat, const char *key) { sen_table_search_flags flags; flags = SEN_TABLE_ADD; 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_init(); context = sen_ctx_open(NULL, SEN_CTX_USEQL); pat = sen_pat_create(context, "/tmp/xxx", 128, 64, 0, sen_enc_utf8); add(context, pat, "セナ"); add(context, pat, "ナセナセ"); add(context, pat, "Senna"); add(context, pat, "セナ + Ruby"); add(context, pat, "セナセナ"); dump(context, pat, NULL, NULL, SEN_PAT_ASCENDING); dump(context, pat, "セナ", NULL, SEN_PAT_ASCENDING); dump(context, pat, NULL, "セナセナ", SEN_PAT_ASCENDING); dump(context, pat, "セナセナ", NULL, SEN_PAT_ASCENDING); dump(context, pat, "セナ", "セナセナ", SEN_PAT_ASCENDING); dump(context, pat, "セナセナ", "セナ", SEN_PAT_ASCENDING); sen_pat_close(context, pat); sen_ctx_close(context); sen_fin(); return 0; }