Kouhei Sutou
kou****@cozmi*****
2008年 7月 17日 (木) 15:59:03 JST
須藤です。
sen_pat_cursorの動作について教えてください。
メールの最後に付けたプログラムを動かすと以下のような出力になります。
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
min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
セナ
セナ + Ruby
セナセナ
ナセナセ
min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
セナ
セナ + Ruby
セナセナ
ナセナセ
min: セナ; max: (null); direction: ASCENDING; GT: TRUE; LT: FALSE
セナ
セナ + Ruby
セナセナ
ナセナセ
1番目のと2番目の出力は分かるのですが、それ以降の場合の動作がよくわかりません。
3番目はこうなるのかと思いました。
min: セナセナ; max: (null); direction: ASCENDING; GT: FALSE; LT: FALSE
セナセナ
ナセナセ
4番目はこうなるのかと思いました。
min: セナ; max: セナセナ; direction: ASCENDING; GT: FALSE; LT: FALSE
セナ
セナ + Ruby
セナセナ
5番目はこうなるのかと思いました。
min: セナ; max: (null); direction: ASCENDING; GT: TRUE; LT: FALSE
セナ + Ruby
セナセナ
ナセナセ
もしかして、使い方をまったく間違えていたりしますか。。。?
#include <stdio.h>
#include <string.h>
#include <pat.h>
static void
add(sen_pat *pat, const char *key)
{
sen_table_search_flags flags;
flags = SEN_TABLE_ADD;
sen_pat_lookup(pat, key, strlen(key) + 1, NULL, &flags);
}
#define BUFFER_SIZE 4096
static void
dump(sen_pat *pat, sen_ctx *context, 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(pat, context,
min, min ? strlen(min) + 1 : 0,
max, max ? strlen(max) + 1 : 0,
flags);
id = sen_pat_cursor_next(cursor);
while (id != SEN_ID_NIL) {
char buffer[BUFFER_SIZE];
sen_pat_get_key(pat, id, buffer, BUFFER_SIZE - 1);
printf("%s\n", buffer);
id = sen_pat_cursor_next(cursor);
}
printf("\n");
sen_pat_cursor_close(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(pat, "セナ");
add(pat, "ナセナセ");
add(pat, "Senna");
add(pat, "セナ + Ruby");
add(pat, "セナセナ");
dump(pat, context, NULL, NULL, SEN_PAT_ASCENDING);
dump(pat, context, "セナ", NULL, SEN_PAT_ASCENDING);
dump(pat, context, NULL, "セナセナ", SEN_PAT_ASCENDING);
dump(pat, context, "セナセナ", NULL, SEN_PAT_ASCENDING);
dump(pat, context, "セナ", "セナセナ", SEN_PAT_ASCENDING);
dump(pat, context, "セナ", NULL, SEN_PAT_ASCENDING | SEN_PAT_GT);
sen_pat_close(pat);
sen_ctx_close(context);
sen_fin();
return 0;
}