[ruby-dev:45269] Re: ext/dbmのデフォルトDBについて

From: Tanaka Akira <akr@...>
Date: 2012-02-21 14:21:00 UTC
List: ruby-dev #45269
2011年1月28日22:29 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:
>
> 気づいている人もいると思うのですが、最近のBerkleyDBがはいっているシステムで
> test-all するとDBMのテストで
>
> DB->del: attempt to modify a read-only database
> DB->del: attempt to modify a read-only database
>
> と不愉快な出力が二回でます。(すくなくともうちのdb-4.8 は出ます)
> ソースをみたところ、抑止するAPIはあるにはあるのですが、dbm_hogehoge形式の
> 旧来と互換性のある形式では存在しません。つまりRubyのdbmバインディングからは
> 実質使えません。

古い話ですが、検索していて見つけたので。
まぁ、こんなでどうですかねぇ。

むりやり使ってみました。

% svn diff --diff-cmd diff -x -u ext/dbm/
Index: ext/dbm/dbm.c
===================================================================
--- ext/dbm/dbm.c	(revision 34720)
+++ ext/dbm/dbm.c	(working copy)
@@ -196,6 +196,12 @@
 #if defined(HAVE_DBM_DIRFNO)
         rb_fd_fix_cloexec(dbm_dirfno(dbm));
 #endif
+
+#if defined(_DB_H_) && defined(HAVE_TYPE_DBC)
+    /* Disable Berkeley DB error messages such as:
+     * DB->put: attempt to modify a read-only database */
+        ((DBC*)dbm)->dbp->set_errfile(((DBC*)dbm)->dbp, NULL);
+#endif
     }

     if (!dbm) {
Index: ext/dbm/extconf.rb
===================================================================
--- ext/dbm/extconf.rb	(revision 34720)
+++ ext/dbm/extconf.rb	(working copy)
@@ -222,6 +222,11 @@
     return false
   end

+  # DBC type is required to disable error messages by Berkeley DB 2 or later.
+  if have_db_header
+    have_type("DBC", hdr, hsearch)
+  end
+
   if hsearch
     $defs << hsearch
     @defs = hsearch
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread