Kouhei Sutou
kou****@clear*****
2009年 4月 26日 (日) 17:39:17 JST
須藤です。 grn_pat_create()ではencodingがGRN_ENC_DEFAULTのときは grn_gctx.encodingを使うので、ビルド時に指定したエンコーディ ングが使用されます。 grn_pat_create(): if (encoding == GRN_ENC_DEFAULT) { encoding = grn_gctx.encoding; } 一方、io_hash_init()ではctx->encodingを使います。 ctx->encodingはgrn_gctx.encodingと違ってGRN_ENC_DEFAULTが指 定されている可能性があります。 io_hash_init(): if (encoding == GRN_ENC_DEFAULT) { encoding = ctx->encoding; } デフォルト値の解決のしかたが違うね、ということなのですが、こ れは意図されているものでしょうか? とりあえず、意図されているものとして話を進めるのですが、 GRN_ENC_DEFAULTがstr.cとか下の層にそのまま渡ると問題がありそ うです。 例えば、GRN_ENC_DEFAULTのままgrn_charlen()に渡るとビルド時に 指定されたエンコーディングが使われません。 grn_charlen(): switch (encoding) { case GRN_ENC_EUC_JP : ... break; case GRN_ENC_UTF8 : ... break; case GRN_ENC_SJIS : ... break; default : return 1; break; } これは、例えば、grn_obj_get_accessor()の中で起こる可能性があ ります。 こっちの動作は意図されているものでしょうか? ちなみに、個人的にはGRN_TABLE_PAT_KEYなどのレベルで GRN_ENC_DEFAULTを解決するよりも、grn_str_charlen()などの関数 の方でGRN_ENC_DEFAULTならビルド時に指定したエンコーディングに する方が好みだったりします。GRN_ENC_DEFAULTかどうかを確認しな ければいけない関数が増えるかもしれませんが。。。 とりあえず、grn_ctx_init()でGRN_ENC_DEFAULTを解決すると grn_charlen()などにGRN_ENC_DEFAULTが渡らなくなりそうな気がし ます。