morit****@razil*****
morit****@razil*****
2009年 4月 29日 (水) 14:07:37 JST
森です。 encodingの扱いについて、APIを見直しました。 * デフォルトエンコーディングの初期値は、ビルド時に指定されたものが使われます。 * デフォルトエンコーディングの値は、 grn_get_default_encoding/grn_set_default_encodingで参照/変更できます。 * grn_set_default_encodingでGRN_ENC_DEFAULTを指定すると、 デフォルトエンコーディングの値は、ビルド時に指定されたものに戻ります。 * grn_ctxはそれぞれエンコーディング情報を持っており、grn_ctx_init直後は、 デフォルトエンコーディングの値に初期化されます。 * grn_ctx毎のエンコーディングの値は、 GRN_CTX_GET_ENCODING/GRN_CTX_SET_ENCODINGで参照/変更できます。 * GRN_CTX_SET_ENCODINGでGRN_ENC_DEFAULTを指定すると、 デフォルトエンコーディングの値が設定されます。 * grn_dbはそれぞれエンコーディング情報を持っており、 grn_db_createの第一引数に指定したgrn_ctxのエンコーディングの値に初期化されます。 * grn_db_open, grn_ctx_useを実行すると、grn_ctxのエンコーディングの値は、 指定したdbのエンコーディングの値に更新されます。 * grn_tableはそれぞれエンコーディング情報を持っており、 grn_table_createの第一引数に指定したgrn_ctxのエンコーディングの値に初期化されます。 * table, dbのエンコーディング情報は、grn_obj_get_info()で、GRN_INFO_ENCODINGを 指定することによって参照することができます。(変更することはできません) これによって、下層の関数までGRN_ENC_DEFAULTが渡ることがなくなったと思います。 実質的には、一つのDBの中で複数のエンコーディングが混在して使用されることは あまりないのではないかと考えて、明示的に指定がなければdbのエンコーディング情報を 使い回すようにしました。 grn_snip_open,grn_bulk_esc,grn_str_open,grn_charlenなどの文字列操作系のAPIも、 grn_ctxのエンコーディング値を使うようにしました。 >>> Kouhei Sutou さんは書きました: > 須藤です。 > > 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が渡らなくなりそうな気がし > ます。 > > _______________________________________________ > groonga-dev mailing list > groon****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev > -- morita