SHIDARA Yoji
dara****@shida*****
2009年 9月 7日 (月) 18:23:28 JST
こんにちは、daraです。 以下のようなスクリプト dara @ buzztter:~/groonga_test$ cat bigkey.rb require 'groonga' Groonga::Database.create hash = Groonga::Hash.create(:key_type => Groonga::Type::UINT64) hash.add(1<<63) を実行すると、 dara @ buzztter:~/groonga_test$ ruby bigkey.rb bigkey.rb:5:in `add': bignum too big to convert into `long long' (RangeError) from bigkey.rb:5 となることに気がつきました。 ext/rb-grn-utils.c に UINT64 の記述が無いのが原因のように思われたので、 前後のコードに習って以下のようなパッチを適用したところ、エラーは出なくなりました。 Index: ext/rb-grn-utils.c =================================================================== --- ext/rb-grn-utils.c (リビジョン 654) +++ ext/rb-grn-utils.c (作業コピー) @@ -105,6 +105,9 @@ case GRN_DB_INT64: *rb_value = LL2NUM(*((long long *)GRN_BULK_HEAD(bulk))); break; + case GRN_DB_UINT64: + *rb_value = ULL2NUM(*((long long *)GRN_BULK_HEAD(bulk))); + break; case GRN_DB_FLOAT: *rb_value = rb_float_new(*((double *)GRN_BULK_HEAD(bulk))); break; @@ -284,6 +287,7 @@ int32_t int32_value; uint32_t uint32_value; int64_t int64_value; + uint64_t uint64_value; int64_t time_value; double double_value; grn_id range; @@ -306,6 +310,11 @@ string = (const char *)&int64_value; size = sizeof(int64_value); break; + case GRN_DB_UINT64: + uint64_value = NUM2ULL(object); + string = (const char *)&uint64_value; + size = sizeof(uint64_value); + break; case GRN_DB_FLOAT: double_value = NUM2DBL(object); string = (const char *)&double_value; 勘違い、修正漏れ等があるかもしれませんが、 お役に立てば幸いです。 -- SHIDARA Yoji 本を書きました! http://www.amazon.co.jp/dp/4798119881