[#12164] patch for ext/gdbm — Koji Arai <JCA02266@...>

新井です。

24 messages 2001/02/04
[#12168] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/05

まつもと ゆきひろです

[#12176] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/05

新井です。

[#12179] Re: patch for ext/gdbm — matz@... (Yukihiro Matsumoto) 2001/02/06

まつもと ゆきひろです

[#12219] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12220] Re: patch for ext/gdbm — Koji Arai <JCA02266@...> 2001/02/12

新井です。

[#12256] set_trace_func — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2001/02/17

[#12293] crash on proc without a block — Kenichi Komiya <kom@...1.accsnet.ne.jp>

15 messages 2001/02/25

[#12323] Re: [ruby-list:28364] class definition extension — "K.Kosako" <kosako@...>

ruby-listから移動しました。

13 messages 2001/02/28
[#12324] Re: [ruby-list:28364] class definition extension — matz@... (Yukihiro Matsumoto) 2001/02/28

まつもと ゆきひろです

[ruby-dev:12164] patch for ext/gdbm

From: Koji Arai <JCA02266@...>
Date: 2001-02-04 19:33:17 UTC
List: ruby-dev #12164
新井です。

GDBM モジュールに手を加えました(ついでにDBMも)。パッチを付けます。

(1) fgdbm_s_open() で、O_RDONLY, O_RDWR, O_CREAT を使用していますが
    gdbm_open() のマニュアルには GDBM_READER, GDBM_WRITER, GDBM_WRCREAT,
    GDBM_NEWDB を使うように書いてあるので(しかも値が違う)書き換えました。

(2) 新しい定数
       GDBM::FAST
       GDBM::SYNC
       GDBM::NOLOCK
    を追加しました。GDBM.open の第3引数に指定します。

    cygwin の gdbm 1.8.0-3 には
       GDBM_SYNC, GDBM_NOLOCK
    が定義されているのですが Debian の gdbm 1.7.3-26.2 にこれら
    は定義されていなかったので #ifdef で判定してます。
    # もしかしたら GDBM_FAST にも必要なのかも知れませんが。。。。

(3) File.open のように GDBM.open と DBM.open にブロックを指定
    できるようにしました。


Index: ext/dbm/dbm.c
===================================================================
RCS file: /src/ruby/ext/dbm/dbm.c,v
retrieving revision 1.13
diff -u -r1.13 dbm.c
--- ext/dbm/dbm.c	2000/11/09 02:29:45	1.13
+++ ext/dbm/dbm.c	2001/02/04 18:57:46
@@ -49,6 +49,19 @@
 }
 
 static VALUE
+fdbm_close(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    GetDBM(obj, dbmp);
+    dbm_close(dbmp->di_dbm);
+    dbmp->di_dbm = 0;
+
+    return Qnil;
+}
+
+static VALUE
 fdbm_s_open(argc, argv, klass)
     int argc;
     VALUE *argv;
@@ -91,20 +104,10 @@
     dbmp->di_dbm = dbm;
     dbmp->di_size = -1;
 
-    return obj;
-}
-
-static VALUE
-fdbm_close(obj)
-    VALUE obj;
-{
-    struct dbmdata *dbmp;
+    if (rb_block_given_p())
+        return rb_ensure(rb_yield, obj, fdbm_close, obj);
 
-    GetDBM(obj, dbmp);
-    dbm_close(dbmp->di_dbm);
-    dbmp->di_dbm = 0;
-
-    return Qnil;
+    return obj;
 }
 
 static VALUE
Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /src/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.11
diff -u -r1.11 gdbm.c
--- ext/gdbm/gdbm.c	2000/11/08 05:29:33	1.11
+++ ext/gdbm/gdbm.c	2001/02/04 18:57:47
@@ -44,18 +44,31 @@
 }
 
 static VALUE
+fgdbm_close(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    GetDBM(obj, dbmp);
+    gdbm_close(dbmp->di_dbm);
+    dbmp->di_dbm = 0;
+
+    return Qnil;
+}
+
+static VALUE
 fgdbm_s_open(argc, argv, klass)
     int argc;
     VALUE *argv;
     VALUE klass;
 {
-    VALUE file, vmode;
+    VALUE file, vmode, vflags;
     GDBM_FILE dbm;
     struct dbmdata *dbmp;
-    int mode;
+    int mode, flags = 0;
     VALUE obj;
 
-    if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
+    if (rb_scan_args(argc, argv, "12", &file, &vmode, &vflags) == 1) {
 	mode = 0666;		/* default value */
     }
     else if (NIL_P(vmode)) {
@@ -64,18 +77,22 @@
     else {
 	mode = NUM2INT(vmode);
     }
+
+    if (!NIL_P(vflags))
+        flags = NUM2INT(vflags);
+
     Check_SafeStr(file);
 
     dbm = 0;
     if (mode >= 0)
 	dbm = gdbm_open(RSTRING(file)->ptr, MY_BLOCK_SIZE, 
-			O_RDWR|O_CREAT, mode, MY_FATAL_FUNC);
+			GDBM_WRCREAT|flags, mode, MY_FATAL_FUNC);
     if (!dbm)
 	dbm = gdbm_open(RSTRING(file)->ptr, MY_BLOCK_SIZE, 
-			O_RDWR, 0, MY_FATAL_FUNC);
+			GDBM_WRITER|flags, 0, MY_FATAL_FUNC);
     if (!dbm)
 	dbm = gdbm_open(RSTRING(file)->ptr, MY_BLOCK_SIZE, 
-			O_RDONLY, 0, MY_FATAL_FUNC);
+			GDBM_READER|flags, 0, MY_FATAL_FUNC);
 
     if (!dbm) {
 	if (mode == -1) return Qnil;
@@ -86,20 +103,10 @@
     dbmp->di_dbm = dbm;
     dbmp->di_size = -1;
 
-    return obj;
-}
-
-static VALUE
-fgdbm_close(obj)
-    VALUE obj;
-{
-    struct dbmdata *dbmp;
+    if (rb_block_given_p())
+        return rb_ensure(rb_yield, obj, fgdbm_close, obj);
 
-    GetDBM(obj, dbmp);
-    gdbm_close(dbmp->di_dbm);
-    dbmp->di_dbm = 0;
-
-    return Qnil;
+    return obj;
 }
 
 static VALUE
@@ -626,6 +633,20 @@
 {
     cGDBM = rb_define_class("GDBM", rb_cObject);
     rb_include_module(cGDBM, rb_mEnumerable);
+
+    /*
+    rb_define_const(cGDBM, "READER",  INT2FIX(GDBM_READER));
+    rb_define_const(cGDBM, "WRITER",  INT2FIX(GDBM_WRITER));
+    rb_define_const(cGDBM, "WRCREAT", INT2FIX(GDBM_WRCREAT));
+    rb_define_const(cGDBM, "NEWDB",   INT2FIX(GDBM_NEWDB));
+    */
+    rb_define_const(cGDBM, "FAST", INT2FIX(GDBM_FAST));
+#if defined(GDBM_SYNC)
+    rb_define_const(cGDBM, "SYNC",    INT2FIX(GDBM_SYNC));
+#endif
+#if defined(GDBM_NOLOCK)
+    rb_define_const(cGDBM, "NOLOCK",  INT2FIX(GDBM_NOLOCK));
+#endif
 
     rb_define_singleton_method(cGDBM, "open", fgdbm_s_open, -1);
     rb_define_singleton_method(cGDBM, "new", fgdbm_s_open, -1);

--
新井康司 (Koji Arai)

In This Thread

Prev Next