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の使い方がありましたら ご教授いただければ嬉しいです。 どうぞよろしくお願いいたします。