[groonga-dev,00175] Ruby/groonga にて :key_type が UINT64 時の問題

アーカイブの一覧に戻る

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




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