Rubyとライブラリ達を愛用させてもらっています。

 さて、ruby-postgres-0.6.4 を使ってます。NULL値をフェッチし
た際にバックエンドから返ってくるのは空文字列なので、pqlibの
getisnull 関数で調べないと、空文字列との区別が付きません。

 ruby-postgres には PGresult#isnull といったメソッドが無い様な
ので、NULL値に対して nil を返すようにパッチを書きました。

 困ってる人は当ててみて下さい。
 そういえばRDBCの方はまだ使ったことが無い…。


ruby-postgres-0.6.4

--- postgres~.c	Mon Apr 23 11:31:24 2001
+++ postgres.c	Fri Oct 19 17:37:42 2001
@@ -561,6 +561,23 @@
 }
 
 static VALUE
+fetch_pgresult(result, tuple_index, field_index)
+	PGresult *result;
+	int tuple_index;
+	int field_index;
+{
+	VALUE value;
+	if (PQgetisnull(result, tuple_index, field_index) != 1) {
+		char * valuestr = PQgetvalue(result, tuple_index, field_index);
+		value = rb_tainted_str_new2(valuestr);
+	} else {
+		value = Qnil;
+	}
+	return value;
+}
+
+
+static VALUE
 pgresult_new(ptr)
     PGresult *ptr;
 {
@@ -592,7 +609,8 @@
     for (i=0; i<nt; i++) {
 	VALUE row = rb_ary_new2(nf);
 	for (j=0; j<nf; j++) {
-	    rb_ary_push(row, rb_tainted_str_new2(PQgetvalue(result, i, j)));
+		VALUE value = fetch_pgresult(result, i, j);
+	    rb_ary_push(row, value);
 	}
 	rb_ary_push(ary, row);
     };
@@ -613,7 +631,8 @@
     for (i=0; i<nt; i++) {
         VALUE row = rb_ary_new2(nf);
         for (j=0; j<nf; j++) {
-            rb_ary_push(row, rb_tainted_str_new2(PQgetvalue(result, i, j)));
+			VALUE value = fetch_pgresult(result, i, j);
+            rb_ary_push(row, value);
         }
         rb_yield(row);
     };
@@ -641,7 +660,8 @@
 
         val = rb_ary_new();
         for (j=0; j<nf; j++) {
-            rb_ary_push(val, rb_tainted_str_new2(PQgetvalue(result, i, j)));
+			VALUE value = fetch_pgresult(result, i, j);
+            rb_ary_push(val, value);
         }
         return val;
 
@@ -650,7 +670,7 @@
 	if( i >= nt ) return Qnil;
         j = NUM2INT(a2);
 	if( j >= nf ) return Qnil;
-        return rb_tainted_str_new2(PQgetvalue(result, i, j));
+        return fetch_pgresult(result, i, j);
 
       default:
         return Qnil;		/* not reached */
@@ -772,7 +792,8 @@
     if (j < 0 || j >= PQnfields(result)) {
 	rb_raise(rb_eArgError,"invalid field number %d", j);
     }
-    return rb_tainted_str_new2(PQgetvalue(result, i, j));
+
+	return fetch_pgresult(result, i, j);
 }
 
 static VALUE


------------------------------------------
白井 薫
 rubyist / same-same-same.dyndns.org

「諸君、私はRubyが好きだ。
 諸君、私は。Rubyが好きだ。
 諸君、私はRubyが大好きだ。」
------------------------------------------