From: "藤本尚邦 / Hisakuni FUJIMOTO" Date: 1998-08-16T01:37:39+09:00 Subject: [ruby-list:9118] Re: DBM (Re: NT 用 ruby-1.1c) 藤本です。 From: matz@netlab.co.jp (Yukihiro Matsumoto) Subject: [ruby-list:9116] Re: DBM (Re: NT 用 ruby-1.1c) Date: Sun, 16 Aug 1998 00:39:41 +0900 > まつもと ゆきひろです > > In message "[ruby-list:9111] Re: DBM (Re: NT 用 ruby-1.1c)" > on 98/08/14, Inaba Hiroto writes: > |ruby のBerkeley DB インターフェースってあるんですか? > |あるんだったら、欲しいです。 > > まだ作ってないです.とりかかればすぐだと思うんですが. > どなたか練習問題としていかがでしょう? 僕は、Redhat Linux box上で使うrubyの、ext/dbm/以下に下のようなpatch をあててBerkeleyDBを使ってます。基本的にはextconf.rbのpatchだけでOKの はずです。have_libraryの順番、内容をちょっと変更して、libdbがあればそ れを使うようにしているだけです。 下のpatchでは、さらにdbm.cにもpatchしています。これは、BerkeleyDBの dbm_open()がDBファイル名のsuffixに'.db'を付けてしまうのがいやだったの で、ファイル名をありのままに使えるようにします。ただ、このdbm.cのpatch は、require 'dbm'している既存のスクリプトの動作に影響するかもしれない のでじゅうぶん注意してください。 ============================================================= 藤本尚邦 FUJIMOTO Hisakuni hisa@imasy.or.jp ============================================================= --- ext/dbm/extconf.rb.orig Wed Apr 22 16:03:52 1998 +++ ext/dbm/extconf.rb Wed May 27 11:44:25 1998 @@ -1,6 +1,6 @@ require 'mkmf' $LDFLAGS = "-L/usr/local/lib" -have_library("gdbm", "dbm_open") or have_library("dbm", "dbm_open") +have_library("db", "dbm_open") or have_library("gdbm", "dbm_open") or have_library("dbm", "dbm_open") if have_func("dbm_open") have_func("dbm_clearerr") create_makefile("dbm") --- ext/dbm/dbm.c.orig Wed May 13 16:26:42 1998 +++ ext/dbm/dbm.c Wed May 27 12:00:59 1998 @@ -28,6 +28,32 @@ DBM *di_dbm; }; +#ifdef _DB_H_ /* Berkelay DB ? */ +/* + * When using Berkely DB Library, + * same as dbm_open() except for not modify DB file name suffix. + */ +static DBM* +dbm_open_2(fname, flags, mode) + const char* fname; + int flags; + int mode; +{ + HASHINFO info; + info.bsize = 4096; + info.ffactor = 40; + info.nelem = 1; + info.cachesize = 0; + info.hash = NULL; + info.lorder = 0; + return (DBM*) dbopen(fname, flags, mode, DB_HASH, &info); +} +# define DBM_OPEN dbm_open_2 + +#else +# define DBM_OPEN dbm_open +#endif /* ifdef _DB_H_ */ + static void closed_dbm() { @@ -72,11 +98,11 @@ dbm = 0; if (mode >= 0) - dbm = dbm_open(RSTRING(file)->ptr, O_RDWR|O_CREAT, mode); + dbm = DBM_OPEN (RSTRING(file)->ptr, O_RDWR|O_CREAT, mode); if (!dbm) - dbm = dbm_open(RSTRING(file)->ptr, O_RDWR, mode); + dbm = DBM_OPEN (RSTRING(file)->ptr, O_RDWR, mode); if (!dbm) - dbm = dbm_open(RSTRING(file)->ptr, O_RDONLY, mode); + dbm = DBM_OPEN (RSTRING(file)->ptr, O_RDONLY, mode); if (!dbm) { if (mode == -1) return Qnil;