[groonga-dev,00056] Re: GRN_ENC_DEFAULTの扱い

アーカイブの一覧に戻る

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




groonga-dev メーリングリストの案内
アーカイブの一覧に戻る