Project

General

Profile

Actions

Bug #3385

closed

ext/dbm: accept various version of db

Added by taca (Takahiro Kambe) about 15 years ago. Updated over 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
-
Backport:
[ruby-dev:41531]

Description

=begin
ext/dbのextconf.rbに、様々なバージョンのBerkley DBを認識させるためのパッチです。

--- ext/dbm/extconf.rb.orig 2009-10-02 10:45:39.000000000 +0000
+++ ext/dbm/extconf.rb
@@ -5,13 +5,16 @@ dir_config("dbm")
if dblib = with_config("dbm-type", nil)
dblib = dblib.split(/[ ,]+/)
else

  • dblib = %w(db db2 db1 dbm gdbm gdbm_compat qdbm)
  • dblib = %w(db db2 db1 db5 db4 db3 dbm gdbm gdbm_compat qdbm)
    end

headers = {
"db" => ["db.h"],
"db1" => ["db1/ndbm.h", "db1.h", "ndbm.h"],
"db2" => ["db2/db.h", "db2.h", "db.h"],

  • "db3" => ["db3/db.h", "db3.h", "db.h"],

  • "db4" => ["db4/db.h", "db4.h", "db.h"],

  • "db5" => ["db5/db.h", "db5.h", "db.h"],
    "dbm" => ["ndbm.h"],
    "gdbm" => ["gdbm-ndbm.h", "ndbm.h"],
    "gdbm_compat" => ["gdbm-ndbm.h", "ndbm.h"],
    @@ -24,7 +27,7 @@ def headers.db_check(db)
    hsearch = nil

    case db

  • when /^db2?$/
  • when /^db[2-5]?$/
    db_prefix = "__db_n"
    hsearch = "-DDB_DBM_HSEARCH "
    when "gdbm"
    @@ -36,7 +39,8 @@ def headers.db_check(db)
    db_prefix ||= ""

    if (have_library(db, db_prefix+"dbm_open") || have_func(db_prefix+"dbm_open")) and

  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)}
    
  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)} or
    
  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", ["db.h", h], hsearch)}
    
    have_func(db_prefix+"dbm_clearerr") unless have_gdbm
    $defs << hsearch if hsearch
    $defs << '-DDBM_HDR="<'+hdr+'>"'
    =end

Files

dbm-diff (1.38 KB) dbm-diff taca (Takahiro Kambe), 06/03/2010 11:38 PM
Actions #1

Updated by mame (Yusuke Endoh) about 15 years ago

=begin
遠藤です。

ext/dbのextconf.rbに、様々なバージョンのBerkley DBを認識させるためのパッチです。

確認ですが、バージョン 3 から 5 を認識させるようになったのですよね。
実際にそれぞれのバージョンでビルドして、test/dbm/ がパスすることを
確認して頂いたということでしょうか。
そういうことであれば、神戸さんを信じて取り込もうと思います。

あと、

  • dblib = %w(db db2 db1 db5 db4 db3 dbm gdbm gdbm_compat qdbm)

という不思議な順番でチェックすることに意味はあるでしょうか。

--
Yusuke Endoh
=end

Actions #2

Updated by taca (Takahiro Kambe) almost 15 years ago

=begin

確認ですが、バージョン 3 から 5 を認識させるようになったのですよね。
そうです。

実際にそれぞれのバージョンでビルドして、test/dbm/ がパスすることを
確認して頂いたということでしょうか。
テストまではしていません。ただ、dbmの互換ライブラリとして各バージョンのBerkeley DBを使う分に、
それほど問題が出てくるとも思えません。

そういうことであれば、神戸さんを信じて取り込もうと思います。
と、いうわけで信じてはダメです。;-)

  • dblib = %w(db db2 db1 db5 db4 db3 dbm gdbm gdbm_compat qdbm)

という不思議な順番でチェックすることに意味はあるでしょうか。
新しいリリースについては新しいものを優先、でもベースシステムに存在しているdbがあればそれで済ませたい、といった程度の意図ですが、db2やdb1の辺りは元を尊重しただけなので深い意味はありません。

=end

Actions #3

Updated by mame (Yusuke Endoh) almost 15 years ago

  • Status changed from Open to Closed

=begin
遠藤です。

実際にそれぞれのバージョンでビルドして、test/dbm/ がパスすることを
確認して頂いたということでしょうか。
テストまではしていません。ただ、dbmの互換ライブラリとして各バージョンのBerkeley DBを使う分に、
それほど問題が出てくるとも思えません。

Berkeley DB は API の互換性とかにちゃんと気を使っている立派な
プロジェクトなんですかね。OpenSSL とか Ruby とか見てるとどうも
疑い深くなってしまいます。

とりあえず、trunk に取り込みました。ありがとうございました。
このチケットは Bug というより Feature な気もするので、ruby_1_9_2
への取り込みにはあまり乗り気でありません。

--
Yusuke Endoh
=end

Actions #4

Updated by taca (Takahiro Kambe) almost 15 years ago

=begin

Berkeley DB は API の互換性とかにちゃんと気を使っている立派な
プロジェクトなんですかね。OpenSSL とか Ruby とか見てるとどうも
疑い深くなってしまいます。
Berkley DBとしては4.6と4.7で非互換があって、/usr/pkgsrc/databased/db46 とかが存在します。

あくまでも「dbm互換の部分」だけに限れば、dbm自体がそんなに非互換が出てくるところは考えにくく、
同一のバージョンのBerklery DBを相手にしている限りは問題は出てこないと思うわけです。

一方で、Rubyの行うテストで出てこないであろう部分としては、実際に作成した foo.db のファイルの
内容が異なるBerkley DBの間で互換があるのかという部分もあるでしょう。

=end

Updated by akr (Akira Tanaka) over 13 years ago

  • ruby -v changed from ruby 1.9.2dev (2010-05-31 revision 28117) [i486-netbsdelf] to -

2010年6月3日23:38 Takahiro Kambe :

Bug #3385: ext/dbm: accept various version of db
http://redmine.ruby-lang.org/issues/show/3385

起票者: Takahiro Kambe
ステータス: Open, 優先度: Normal
ruby -v: ruby 1.9.2dev (2010-05-31 revision 28117) [i486-netbsdelf]

ext/dbのextconf.rbに、様々なバージョンのBerkley DBを認識させるためのパッチです。

かなり前の話ですが、疑問がわいたので教えてください。

--- ext/dbm/extconf.rb.orig 2009-10-02 10:45:39.000000000 +0000
+++ ext/dbm/extconf.rb

@@ -36,7 +39,8 @@ def headers.db_check(db)
db_prefix ||= ""

if (have_library(db, db_prefix+"dbm_open") || have_func(db_prefix+"dbm_open")) and

  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)}
    
  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)} or
    
  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", ["db.h", h], hsearch)}
    
    have_func(db_prefix+"dbm_clearerr") unless have_gdbm
    $defs << hsearch if hsearch
    $defs << '-DDBM_HDR="<'+hdr+'>"'

ここの部分ですが、have_type("dbm", ["db.h", h], hsearch)} を
加えているのはなんででしょう?

ここで h は "db2/db.h", "db2.h", "db.h" といったヘッダフィルの名前が
入っているので、それに "db.h" を合わせると

"db.h" と "db2/db.h" を両方 include するとか、
"db.h" と 2回 include するとかいうことをテストすることになります。

実際、Berkeley DB が入っていない環境で (Ruby 1.9.3 を) を試すと、

1: #include "ruby.h"
2:
3: #include <db.h>
4: #include <db.h>
5:
6: /top/
7: typedef DBM conftest_type;
8: int conftestval[sizeof(conftest_type)?1:-1];

とか、

/* begin /
1: #include "ruby.h"
2:
3: #include <db.h>
4: #include <db2/db.h>
5:
6: /top/
7: typedef DBM conftest_type;
8: int conftestval[sizeof(conftest_type)?1:-1];
/
end */

といった記録が ext/dbm/mkmf.log に残っています。

どうも奇妙に思えるんですが、どういう意図なんでしょう?

[田中 哲][たなか あきら][Tanaka Akira]

Updated by akr (Akira Tanaka) over 13 years ago

2011年11月12日8:14 Tanaka Akira :

ここの部分ですが、have_type("dbm", ["db.h", h], hsearch)} を
加えているのはなんででしょう?

探したところ、pkgsrc の

Both db.h and ndbm.1 must be included to use DBM. Use both headers
in extconf.rb to check the availability of DBM. This makes the package
build on Darwin.

http://pkgsrc.se/[email protected]

というのが元のようで、Darwin では db.h と ndbm.h の両方を include しないと
DBM が使えないという話のようです。

しかし、どうもこれは信じ難いです。
このパッチは extconf.rb で db.h を使って DBM という型を確認するものですが、
dbm.c では db.h を include するようにはなっていません。
そして、それでも dbm がコンパイルできる以上 DBM という型は使えているはずです。

この部分を外して現在の Darwin でも問題ないようなら、
外してしまいたいんですが、どうですかね。
どなたか試していただけないでしょうか。

1.9.3 なら以下のパッチで外れます。

% svn diff --diff-cmd diff -x '-u -p'
Index: ext/dbm/extconf.rb

--- ext/dbm/extconf.rb (revision 33774)
+++ ext/dbm/extconf.rb (working copy)
@@ -39,8 +39,7 @@ def headers.db_check(db)
db_prefix ||= ""

if (have_library(db, db_prefix+"dbm_open") ||

have_func(db_prefix+"dbm_open")) and

  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h,
    

hsearch)} or

  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM",
    

["db.h", h], hsearch)}

  •  hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)}
    
    have_func(db_prefix+"dbm_clearerr") unless have_gdbm
    $defs << hsearch if hsearch
    $defs << '-DDBM_HDR="<'+hdr+'>"'

trunk はいろいろと変わっていますが、以下のパッチで相当する部分を外せます。

% svn diff --diff-cmd diff -x '-u -p'
Index: ext/dbm/extconf.rb

--- ext/dbm/extconf.rb (revision 33774)
+++ ext/dbm/extconf.rb (working copy)
@@ -50,7 +50,7 @@ def headers.db_check2(db, hdr)
have_library("gdbm") or return false
end

  • if (have_type("DBM", hdr, hsearch) || have_type("DBM", ["db.h",
    hdr], hsearch)) and
  • if have_type("DBM", hdr, hsearch) and
    (db == 'libc' ? have_func('dbm_open("", 0, 0)', hdr, hsearch) :
    have_library(db, 'dbm_open("", 0, 0)', hdr, hsearch)) and
    have_func('dbm_clearerr((DBM *)0)', hdr, hsearch)
    --
    [田中 哲][たなか あきら][Tanaka Akira]

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

2011年11月16日9:55 Tanaka Akira :

2011年11月12日8:14 Tanaka Akira :

ここの部分ですが、have_type("dbm", ["db.h", h], hsearch)} を
加えているのはなんででしょう?

探したところ、pkgsrc の

Both db.h and ndbm.1 must be included to use DBM. Use both headers
in extconf.rb to check the availability of DBM. This makes the package
build on Darwin.

http://pkgsrc.se/[email protected]

というのが元のようで、Darwin では db.h と ndbm.h の両方を include しないと
DBM が使えないという話のようです。

しかし、どうもこれは信じ難いです。
このパッチは extconf.rb で db.h を使って DBM という型を確認するものですが、
dbm.c では db.h を include するようにはなっていません。
そして、それでも dbm がコンパイルできる以上 DBM という型は使えているはずです。

この部分を外して現在の Darwin でも問題ないようなら、
外してしまいたいんですが、どうですかね。
どなたか試していただけないでしょうか。

Lionでは問題なく通るようです。もういれちゃって、誰かが
ぎゃっと言ってから考えるでいいんじゃないでしょうか。
2.0でるころにはSnow Leopard サポートしなくても怒られない予感がするし

Updated by akr (Akira Tanaka) over 13 years ago

2011年11月17日12:17 KOSAKI Motohiro :

Lionでは問題なく通るようです。もういれちゃって、誰かが
ぎゃっと言ってから考えるでいいんじゃないでしょうか。
2.0でるころにはSnow Leopard サポートしなくても怒られない予感がするし

では trunk には入れることにしますか。

[田中 哲][たなか あきら][Tanaka Akira]

Updated by ayumin (Ayumu AIZAWA) over 13 years ago

あいざわです

Lionでは問題なく通るようです。もういれちゃって、誰かが
ぎゃっと言ってから考えるでいいんじゃないでしょうか。
2.0でるころにはSnow Leopard サポートしなくても怒られない予感がするし

SnowLeopardでも問題なく動くことを確認しました。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0