[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20162] {DBM,SDBM,GDBM}#values_at

From: Koji Arai <JCA02266@...>
Date: 2003-05-05 12:28:41 UTC
List: ruby-dev #20162
新井です。

DBM#values_at
SDBM#values_at
GDBM#values_at

を実装しました。

おまけで、 DBM::VERSION を DB_VERSION_STRING で定義しました。
さらにおまけで、[ruby-dev:19381] の testdbm.rb のパッチを含
みます。


Index: ChangeLog
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ChangeLog,v
retrieving revision 1.1691
diff -u -r1.1691 ChangeLog
--- ChangeLog	5 May 2003 10:05:10 -0000	1.1691
+++ ChangeLog	5 May 2003 12:25:14 -0000
@@ -1,3 +1,23 @@
+Mon May  5 21:19:25 2003  Koji Arai  <jca02266@nifty.ne.jp>
+
+	* ext/gdbm/gdbm.c (fgdbm_values_at): new method to replace
+	select(index..).
+
+	* ext/sdbm/init.c (fsdbm_values_at): ditto.
+
+	* ext/dbm/dbm.c (fdbm_values_at): ditto.
+
+	* ext/dbm/dbm.c (DBM::VERSION): defined.
+
+	* ext/gdbm/testgdbm.rb: replace select with values_at.
+
+	* ext/sdbm/testsdbm.rb: ditto.
+
+	* ext/dbm/testdbm.rb: ditto.
+
+	* ext/dbm/testdbm.rb (setup): DBM.open(path, 0400) cause EACCESS
+	on Berkeley DB[234].
+
 Mon May  5 18:59:45 2003  WATANABE Hirofumi  <eban@ruby-lang.org>
 
 	* sample/test.rb: substitute 'select' with 'values_at'.
Index: ext/dbm/dbm.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/dbm/dbm.c,v
retrieving revision 1.23
diff -u -r1.23 dbm.c
--- ext/dbm/dbm.c	17 Apr 2003 05:41:26 -0000	1.23
+++ ext/dbm/dbm.c	5 May 2003 12:07:07 -0000
@@ -254,6 +254,8 @@
         }
     }
     else {
+	rb_warn("DBM#select(index..) is deprecated; use DBM#values_at");
+
         for (i=0; i<argc; i++) {
             rb_ary_push(new, fdbm_fetch(obj, argv[i], Qnil));
         }
@@ -263,6 +265,22 @@
 }
 
 static VALUE
+fdbm_values_at(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    for (i=0; i<argc; i++) {
+        rb_ary_push(new, fdbm_fetch(obj, argv[i], Qnil));
+    }
+
+    return new;
+}
+
+static VALUE
 fdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
@@ -731,6 +749,7 @@
     rb_define_method(rb_cDBM, "indexes",  fdbm_indexes, -1);
     rb_define_method(rb_cDBM, "indices",  fdbm_indexes, -1);
     rb_define_method(rb_cDBM, "select",  fdbm_select, -1);
+    rb_define_method(rb_cDBM, "values_at", fdbm_values_at, -1);
     rb_define_method(rb_cDBM, "length", fdbm_length, 0);
     rb_define_method(rb_cDBM, "size", fdbm_length, 0);
     rb_define_method(rb_cDBM, "empty?", fdbm_empty_p, 0);
@@ -759,4 +778,8 @@
 
     rb_define_method(rb_cDBM, "to_a", fdbm_to_a, 0);
     rb_define_method(rb_cDBM, "to_hash", fdbm_to_hash, 0);
+
+#ifdef DB_VERSION_STRING
+    rb_define_const(rb_cDBM, "VERSION",  rb_str_new2(DB_VERSION_STRING));
+#endif
 }
Index: ext/dbm/testdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/dbm/testdbm.rb,v
retrieving revision 1.2
diff -u -r1.2 testdbm.rb
--- ext/dbm/testdbm.rb	27 Feb 2002 04:52:17 -0000	1.2
+++ ext/dbm/testdbm.rb	5 May 2003 11:59:11 -0000
@@ -32,9 +32,12 @@
     assert_instance_of(DBM, @dbm = DBM.new(@path))
 
     # prepare to make readonly DBM file
-    DBM.open("tmptest_dbm_rdonly", 0400) {|dbm|
+    DBM.open("tmptest_dbm_rdonly") {|dbm|
       dbm['foo'] = 'FOO'
     }
+    
+    File.chmod(0400, *Dir.glob("tmptest_dbm_rdonly.*"))
+
     assert_instance_of(DBM, @dbm_rdonly = DBM.new("tmptest_dbm_rdonly", nil))
   end
   def teardown
@@ -83,7 +86,7 @@
     }
     begin
       sleep 1
-      assert_exception(Errno::EWOULDBLOCK) {
+      assert_exception(Errno::EWOULDBLOCK, "NEVER MIND IF YOU USE Berkeley DB3") {
 	begin
 	  assert_instance_of(DBM, dbm2 = DBM.open("tmptest_dbm", 0644))
 	rescue Errno::EAGAIN, Errno::EACCES, Errno::EINVAL
@@ -154,7 +157,7 @@
 
   def test_s_open_error
     assert_instance_of(DBM, dbm = DBM.open("tmptest_dbm", 0))
-    assert_exception(Errno::EACCES) {
+    assert_exception(Errno::EACCES, "NEVER MIND IF YOU USE Berkeley DB3") {
       DBM.open("tmptest_dbm", 0)
     }
     dbm.close
@@ -245,11 +248,11 @@
     assert_equals(values.reverse, @dbm.indexes(*keys.reverse))
   end
 
-  def test_select
+  def test_values_at
     keys = %w(foo bar baz)
     values = %w(FOO BAR BAZ)
     @dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
-    assert_equals(values.reverse, @dbm.select(*keys.reverse))
+    assert_equals(values.reverse, @dbm.values_at(*keys.reverse))
   end
 
   def test_select_with_block
Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.26
diff -u -r1.26 gdbm.c
--- ext/gdbm/gdbm.c	27 Dec 2002 16:13:56 -0000	1.26
+++ ext/gdbm/gdbm.c	5 May 2003 12:10:14 -0000
@@ -352,6 +352,8 @@
         }
     }
     else {
+	rb_warn("GDBM#select(index..) is deprecated; use GDBM#values_at");
+
         for (i=0; i<argc; i++) {
             rb_ary_push(new, rb_gdbm_fetch3(obj, argv[i]));
         }
@@ -361,6 +363,22 @@
 }
 
 static VALUE
+fgdbm_values_at(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    for (i=0; i<argc; i++) {
+        rb_ary_push(new, rb_gdbm_fetch3(obj, argv[i]));
+    }
+
+    return new;
+}
+
+static VALUE
 rb_gdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
@@ -938,6 +956,7 @@
     rb_define_method(rb_cGDBM, "indexes",  fgdbm_indexes, -1);
     rb_define_method(rb_cGDBM, "indices",  fgdbm_indexes, -1);
     rb_define_method(rb_cGDBM, "select",  fgdbm_select, -1);
+    rb_define_method(rb_cGDBM, "values_at",  fgdbm_values_at, -1);
     rb_define_method(rb_cGDBM, "length", fgdbm_length, 0);
     rb_define_method(rb_cGDBM, "size", fgdbm_length, 0);
     rb_define_method(rb_cGDBM, "empty?", fgdbm_empty_p, 0);
Index: ext/gdbm/testgdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/gdbm/testgdbm.rb,v
retrieving revision 1.2
diff -u -r1.2 testgdbm.rb
--- ext/gdbm/testgdbm.rb	27 Feb 2002 04:52:19 -0000	1.2
+++ ext/gdbm/testgdbm.rb	5 May 2003 12:09:09 -0000
@@ -279,11 +279,11 @@
     assert_equals(values.reverse, @gdbm.indexes(*keys.reverse))
   end
 
-  def test_select
+  def test_values_at
     keys = %w(foo bar baz)
     values = %w(FOO BAR BAZ)
     @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
-    assert_equals(values.reverse, @gdbm.select(*keys.reverse))
+    assert_equals(values.reverse, @gdbm.values_at(*keys.reverse))
   end
 
   def test_select_with_block
Index: ext/sdbm/init.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/sdbm/init.c,v
retrieving revision 1.17
diff -u -r1.17 init.c
--- ext/sdbm/init.c	16 Jan 2003 07:38:40 -0000	1.17
+++ ext/sdbm/init.c	5 May 2003 12:06:12 -0000
@@ -242,6 +242,8 @@
         }
     }
     else {
+	rb_warn("SDBM#select(index..) is deprecated; use SDBM#values_at");
+
         for (i=0; i<argc; i++) {
             rb_ary_push(new, fsdbm_fetch(obj, argv[i], Qnil));
         }
@@ -251,6 +253,22 @@
 }
 
 static VALUE
+fsdbm_values_at(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    for (i=0; i<argc; i++) {
+        rb_ary_push(new, fsdbm_fetch(obj, argv[i], Qnil));
+    }
+
+    return new;
+}
+
+static VALUE
 fsdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
@@ -728,6 +746,7 @@
     rb_define_method(rb_cDBM, "indexes",  fsdbm_indexes, -1);
     rb_define_method(rb_cDBM, "indices",  fsdbm_indexes, -1);
     rb_define_method(rb_cDBM, "select",  fsdbm_select, -1);
+    rb_define_method(rb_cDBM, "values_at",  fsdbm_values_at, -1);
     rb_define_method(rb_cDBM, "length", fsdbm_length, 0);
     rb_define_method(rb_cDBM, "size", fsdbm_length, 0);
     rb_define_method(rb_cDBM, "empty?", fsdbm_empty_p, 0);
Index: ext/sdbm/testsdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/sdbm/testsdbm.rb,v
retrieving revision 1.2
diff -u -r1.2 testsdbm.rb
--- ext/sdbm/testsdbm.rb	27 Feb 2002 04:52:21 -0000	1.2
+++ ext/sdbm/testsdbm.rb	5 May 2003 12:05:42 -0000
@@ -51,7 +51,7 @@
   end
 
   def test_version
-    STDERR.print SDBM::VERSION
+    assert(! SDBM.const_defined?(:VERSION))
   end
 
   def test_s_new_has_no_block
@@ -219,11 +219,11 @@
     assert_equals(values.reverse, @sdbm.indexes(*keys.reverse))
   end
 
-  def test_select
+  def test_values_at
     keys = %w(foo bar baz)
     values = %w(FOO BAR BAZ)
     @sdbm[keys[0]], @sdbm[keys[1]], @sdbm[keys[2]] = values
-    assert_equals(values.reverse, @sdbm.select(*keys.reverse))
+    assert_equals(values.reverse, @sdbm.values_at(*keys.reverse))
   end
 
   def test_select_with_block

--
新井康司 (Koji Arai)

In This Thread

Prev Next