[groonga-dev,00052] GRN_ENC_DEFAULTの扱い

Back to archive index

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が渡らなくなりそうな気がし
ます。




groonga-dev メーリングリストの案内
Back to archive index