morit****@razil*****
morit****@razil*****
2008年 2月 27日 (水) 13:50:46 JST
はじめまして。森と申します。 ご指摘ありがとうございます!! sen_records_rewindの返すエラーコードが間違っていました。 内部でやっている処理は山野井さんの回避方法と全く同じなのですが、 sort済みのrecordsに関しては、sen_successを返すべきところで sen_internal_errorを返すようになっていました。 次のバージョンでは修正いたします。 >>> Akihiro YAMANOI さんは書きました: > はじめまして。山野井と申します。 > 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 mailing list > Senna****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/senna-dev > バグ報告方法:http://qwik.jp/senna/bug_report.html > -- morita