Akihiro YAMANOI
a.yam****@gmail*****
2008年 2月 25日 (月) 23:02:19 JST
はじめまして。山野井と申します。
PHPからSennaを使いたくなり、右も左もわからぬままエクステンションを書いています。
メーリングリストの存在を知りまして、本日参加させて頂きました。ありがとうございます。
sen_records_sort()でソートしたレコードをsen_records_rewind()の引数に与えると
sen_internal_errorが発生してしまい、現在、無理矢理な方法でこれを回避しています。
「ソートしたレコードはrewind不可」という制限はありますでしょうか?
[以下のようなコードで発生します]
sen_rc result;
sen_records *r = sen_records_open(sen_rec_document, sen_rec_none, 0);
func_query(r); /* 何らかの検索クエリを実行し、rに格納する */
result = sen_records_sort(r, 1000, NULL);
while (sen_records_next(r, NULL, 0, NULL)) { /* 各レコードに対する処理 */ }
result = sen_records_rewind(r); /* ここでsen_internal_errorが発生 */
while (sen_records_next(r, NULL, 0, NULL)) { /* 各レコードに対する別の処理 */ }
[無理矢理な回避方法]
sen_rc result;
sen_records *r = sen_records_open(sen_rec_document, sen_rec_none, 0);
func_query(r);
result = sen_records_sort(r, 1000, NULL);
while (sen_records_next(r, NULL, 0, NULL)) { }
r->curr_rec = NULL; /* rの中身を直接書き換えて対応 */
while (sen_records_next(r, NULL, 0, NULL)) { }
※senna/lib/index.c:1411行目あたりのsen_records_rewind()を参考にして
「r->curr_rec = NULL」を書いたところ、意図した結果を得られるように
なりました。
[発生する環境]
OS: CentOS4.4
Senna: 1.1.1
gcc: 3.4.6
APIの解説ページ(http://qwik.jp/senna/APIJ.html)を見ると、ソート後に
rewind出来ないとは明記されていないようです。そのため、エラーが発生するのは
sen_records_rewind()の仕様なのかどうか判断できず、投稿させて頂きました。
ソートしたレコードのカーソルを先頭に戻す正しいAPIの使い方がありましたら
ご教授いただければ嬉しいです。
どうぞよろしくお願いいたします。