Ryo Onodera
onode****@clear*****
2009年 12月 14日 (月) 16:08:57 JST
小野寺です。
一つ質問があります。
現在はGRN_VECTOR形式のレコードのdumpに成功するのですが、GRN_UVECTORの形
式のレコードでheader.typeがGRN_TYPEの時は成功しません。grn_text_otojのそ
のための修正は終えたのですが、GRN_VECTORかGRN_UVECTORかを判定する部分を
どう書けばいいのかある程度は調べてみたのですが、分かりませんでした。
原因はgrn_obj_get_value(ctx, column, id, &buf)を呼んでもbuf->header.type
がGRN_UVECTORやGRN_VECTORに設定されるのではなく、逆に、この値を元に
grn_obj_get_valueは別個の動作をしているようです。
また、loadコマンドから呼び出されるlib/db.cにあるbracket_closeや
brace_closeはカラムのデータ型に関わらず、GRN_VECTORを作成し、それを
grn_obj_set_valueしています。つまり、GRN_VECTORの各要素は固定長(Int32な
ど)か可変長(ShortTextなど)でありえます。
もちろんCでGroongaのAPIを叩けば、データが固定長ならば、GRN_UVECTORをカラ
ムにgrn_obj_set_valueすることができます。
まとめると、ベクター型のカラムのデータ型が固定長だからといってすべてのレ
コードがGRN_UVECTORとは断定できないと思います。
それと、たぶん一つのカラムに対して、レコードごとにGRN_VECTORか
GRN_UVECTORかでgrn_obj_set_valueできるのではないのでしょうか?
ちょっと説明が分かりにくくてすいません。突き詰めて言えば、私が欲しいコー
ドは以下のif内の条件式なんです。
if (/* columns[j]のレコードidの値はGRN_VECTORか? */) {
GRN_OBJ_INIT(&buf, GRN_VECTOR, 0, range);
} else {
GRN_OBJ_INIT(&buf, GRN_UVECTOR, 0, range);
}
grn_obj_get_value(ctx, columns[j], id, &buf);
grn_text_otoj(ctx, outbuf, &buf, NULL);
お手数をお掛けしますが、ご返答よろしくお願いします。
--
小野寺 諒 <onode****@clear*****>
株式会社クリアコード (http://www.clear-code.com/)