[Senna-dev 788] ソートしたレコードにrewindを実行するとsen_internal_errorが発生

Back to archive index

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の使い方がありましたら
ご教授いただければ嬉しいです。

どうぞよろしくお願いいたします。




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