1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Removed dbm from ruby repo

This commit is contained in:
Hiroshi SHIBATA 2021-05-24 18:52:18 +09:00
parent ab3266ea5c
commit 55cd3e4ebf
Notes: git 2021-05-25 15:18:56 +09:00
8 changed files with 0 additions and 2276 deletions

View file

@ -312,10 +312,6 @@ Yukihiro Matsumoto (matz)
_unmaintained_
https://github.com/ruby/date
https://rubygems.org/gems/date
[ext/dbm]
_unmaintained_
https://github.com/ruby/dbm
https://rubygems.org/gems/dbm
[ext/etc]
Ruby core team
https://github.com/ruby/etc

View file

@ -83,7 +83,6 @@ WeakRef:: Allows a referenced object to be garbage-collected
BigDecimal:: Provides arbitrary-precision floating point decimal arithmetic
Date:: A subclass of Object includes Comparable module for handling dates
DateTime:: Subclass of Date to handling dates, hours, minutes, seconds, offsets
DBM:: Provides a wrapper for the UNIX-style Database Manager Library
Digest:: Provides a framework for message digest libraries
Etc:: Provides access to information typically stored in UNIX /etc directory
Fcntl:: Loads constants defined in the OS fcntl.h C header file

File diff suppressed because it is too large Load diff

View file

@ -1,21 +0,0 @@
# frozen_string_literal: true
Gem::Specification.new do |s|
s.name = "dbm"
s.version = '1.1.0'
s.summary = "Provides a wrapper for the UNIX-style Database Manager Library"
s.description = "Provides a wrapper for the UNIX-style Database Manager Library"
s.require_path = %w{lib}
s.files = %w{README.md LICENSE.txt ext/dbm/extconf.rb ext/dbm/dbm.c}
s.extensions = %w{ext/dbm/extconf.rb}
s.required_ruby_version = ">= 2.3.0"
s.authors = ["Yukihiro Matsumoto"]
s.email = ["matz@ruby-lang.org"]
s.homepage = "https://github.com/ruby/dbm"
s.licenses = ["Ruby", "BSD-2-Clause"]
s.add_development_dependency "rake-compiler"
s.add_development_dependency "test-unit"
s.metadata["msys2_mingw_dependencies"] = "gdbm"
end

View file

@ -1,162 +0,0 @@
# AUTOGENERATED DEPENDENCIES START
dbm.o: $(RUBY_EXTCONF_H)
dbm.o: $(arch_hdrdir)/ruby/config.h
dbm.o: $(hdrdir)/ruby.h
dbm.o: $(hdrdir)/ruby/internal/anyargs.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/char.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/double.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/int.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/long.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/short.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h
dbm.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h
dbm.o: $(hdrdir)/ruby/internal/assume.h
dbm.o: $(hdrdir)/ruby/internal/attr/alloc_size.h
dbm.o: $(hdrdir)/ruby/internal/attr/artificial.h
dbm.o: $(hdrdir)/ruby/internal/attr/cold.h
dbm.o: $(hdrdir)/ruby/internal/attr/const.h
dbm.o: $(hdrdir)/ruby/internal/attr/constexpr.h
dbm.o: $(hdrdir)/ruby/internal/attr/deprecated.h
dbm.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h
dbm.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h
dbm.o: $(hdrdir)/ruby/internal/attr/error.h
dbm.o: $(hdrdir)/ruby/internal/attr/flag_enum.h
dbm.o: $(hdrdir)/ruby/internal/attr/forceinline.h
dbm.o: $(hdrdir)/ruby/internal/attr/format.h
dbm.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h
dbm.o: $(hdrdir)/ruby/internal/attr/noalias.h
dbm.o: $(hdrdir)/ruby/internal/attr/nodiscard.h
dbm.o: $(hdrdir)/ruby/internal/attr/noexcept.h
dbm.o: $(hdrdir)/ruby/internal/attr/noinline.h
dbm.o: $(hdrdir)/ruby/internal/attr/nonnull.h
dbm.o: $(hdrdir)/ruby/internal/attr/noreturn.h
dbm.o: $(hdrdir)/ruby/internal/attr/pure.h
dbm.o: $(hdrdir)/ruby/internal/attr/restrict.h
dbm.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h
dbm.o: $(hdrdir)/ruby/internal/attr/warning.h
dbm.o: $(hdrdir)/ruby/internal/attr/weakref.h
dbm.o: $(hdrdir)/ruby/internal/cast.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/apple.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/clang.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/intel.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h
dbm.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h
dbm.o: $(hdrdir)/ruby/internal/compiler_since.h
dbm.o: $(hdrdir)/ruby/internal/config.h
dbm.o: $(hdrdir)/ruby/internal/constant_p.h
dbm.o: $(hdrdir)/ruby/internal/core.h
dbm.o: $(hdrdir)/ruby/internal/core/rarray.h
dbm.o: $(hdrdir)/ruby/internal/core/rbasic.h
dbm.o: $(hdrdir)/ruby/internal/core/rbignum.h
dbm.o: $(hdrdir)/ruby/internal/core/rclass.h
dbm.o: $(hdrdir)/ruby/internal/core/rdata.h
dbm.o: $(hdrdir)/ruby/internal/core/rfile.h
dbm.o: $(hdrdir)/ruby/internal/core/rhash.h
dbm.o: $(hdrdir)/ruby/internal/core/robject.h
dbm.o: $(hdrdir)/ruby/internal/core/rregexp.h
dbm.o: $(hdrdir)/ruby/internal/core/rstring.h
dbm.o: $(hdrdir)/ruby/internal/core/rstruct.h
dbm.o: $(hdrdir)/ruby/internal/core/rtypeddata.h
dbm.o: $(hdrdir)/ruby/internal/ctype.h
dbm.o: $(hdrdir)/ruby/internal/dllexport.h
dbm.o: $(hdrdir)/ruby/internal/dosish.h
dbm.o: $(hdrdir)/ruby/internal/error.h
dbm.o: $(hdrdir)/ruby/internal/eval.h
dbm.o: $(hdrdir)/ruby/internal/event.h
dbm.o: $(hdrdir)/ruby/internal/fl_type.h
dbm.o: $(hdrdir)/ruby/internal/gc.h
dbm.o: $(hdrdir)/ruby/internal/glob.h
dbm.o: $(hdrdir)/ruby/internal/globals.h
dbm.o: $(hdrdir)/ruby/internal/has/attribute.h
dbm.o: $(hdrdir)/ruby/internal/has/builtin.h
dbm.o: $(hdrdir)/ruby/internal/has/c_attribute.h
dbm.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h
dbm.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h
dbm.o: $(hdrdir)/ruby/internal/has/extension.h
dbm.o: $(hdrdir)/ruby/internal/has/feature.h
dbm.o: $(hdrdir)/ruby/internal/has/warning.h
dbm.o: $(hdrdir)/ruby/internal/intern/array.h
dbm.o: $(hdrdir)/ruby/internal/intern/bignum.h
dbm.o: $(hdrdir)/ruby/internal/intern/class.h
dbm.o: $(hdrdir)/ruby/internal/intern/compar.h
dbm.o: $(hdrdir)/ruby/internal/intern/complex.h
dbm.o: $(hdrdir)/ruby/internal/intern/cont.h
dbm.o: $(hdrdir)/ruby/internal/intern/dir.h
dbm.o: $(hdrdir)/ruby/internal/intern/enum.h
dbm.o: $(hdrdir)/ruby/internal/intern/enumerator.h
dbm.o: $(hdrdir)/ruby/internal/intern/error.h
dbm.o: $(hdrdir)/ruby/internal/intern/eval.h
dbm.o: $(hdrdir)/ruby/internal/intern/file.h
dbm.o: $(hdrdir)/ruby/internal/intern/gc.h
dbm.o: $(hdrdir)/ruby/internal/intern/hash.h
dbm.o: $(hdrdir)/ruby/internal/intern/io.h
dbm.o: $(hdrdir)/ruby/internal/intern/load.h
dbm.o: $(hdrdir)/ruby/internal/intern/marshal.h
dbm.o: $(hdrdir)/ruby/internal/intern/numeric.h
dbm.o: $(hdrdir)/ruby/internal/intern/object.h
dbm.o: $(hdrdir)/ruby/internal/intern/parse.h
dbm.o: $(hdrdir)/ruby/internal/intern/proc.h
dbm.o: $(hdrdir)/ruby/internal/intern/process.h
dbm.o: $(hdrdir)/ruby/internal/intern/random.h
dbm.o: $(hdrdir)/ruby/internal/intern/range.h
dbm.o: $(hdrdir)/ruby/internal/intern/rational.h
dbm.o: $(hdrdir)/ruby/internal/intern/re.h
dbm.o: $(hdrdir)/ruby/internal/intern/ruby.h
dbm.o: $(hdrdir)/ruby/internal/intern/select.h
dbm.o: $(hdrdir)/ruby/internal/intern/select/largesize.h
dbm.o: $(hdrdir)/ruby/internal/intern/signal.h
dbm.o: $(hdrdir)/ruby/internal/intern/sprintf.h
dbm.o: $(hdrdir)/ruby/internal/intern/string.h
dbm.o: $(hdrdir)/ruby/internal/intern/struct.h
dbm.o: $(hdrdir)/ruby/internal/intern/thread.h
dbm.o: $(hdrdir)/ruby/internal/intern/time.h
dbm.o: $(hdrdir)/ruby/internal/intern/variable.h
dbm.o: $(hdrdir)/ruby/internal/intern/vm.h
dbm.o: $(hdrdir)/ruby/internal/interpreter.h
dbm.o: $(hdrdir)/ruby/internal/iterator.h
dbm.o: $(hdrdir)/ruby/internal/memory.h
dbm.o: $(hdrdir)/ruby/internal/method.h
dbm.o: $(hdrdir)/ruby/internal/module.h
dbm.o: $(hdrdir)/ruby/internal/newobj.h
dbm.o: $(hdrdir)/ruby/internal/rgengc.h
dbm.o: $(hdrdir)/ruby/internal/scan_args.h
dbm.o: $(hdrdir)/ruby/internal/special_consts.h
dbm.o: $(hdrdir)/ruby/internal/static_assert.h
dbm.o: $(hdrdir)/ruby/internal/stdalign.h
dbm.o: $(hdrdir)/ruby/internal/stdbool.h
dbm.o: $(hdrdir)/ruby/internal/symbol.h
dbm.o: $(hdrdir)/ruby/internal/value.h
dbm.o: $(hdrdir)/ruby/internal/value_type.h
dbm.o: $(hdrdir)/ruby/internal/variable.h
dbm.o: $(hdrdir)/ruby/internal/warning_push.h
dbm.o: $(hdrdir)/ruby/internal/xmalloc.h
dbm.o: $(hdrdir)/ruby/assert.h
dbm.o: $(hdrdir)/ruby/backward.h
dbm.o: $(hdrdir)/ruby/backward/2/assume.h
dbm.o: $(hdrdir)/ruby/backward/2/attributes.h
dbm.o: $(hdrdir)/ruby/backward/2/bool.h
dbm.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h
dbm.o: $(hdrdir)/ruby/backward/2/inttypes.h
dbm.o: $(hdrdir)/ruby/backward/2/limits.h
dbm.o: $(hdrdir)/ruby/backward/2/long_long.h
dbm.o: $(hdrdir)/ruby/backward/2/stdalign.h
dbm.o: $(hdrdir)/ruby/backward/2/stdarg.h
dbm.o: $(hdrdir)/ruby/defines.h
dbm.o: $(hdrdir)/ruby/intern.h
dbm.o: $(hdrdir)/ruby/missing.h
dbm.o: $(hdrdir)/ruby/ruby.h
dbm.o: $(hdrdir)/ruby/st.h
dbm.o: $(hdrdir)/ruby/subst.h
dbm.o: dbm.c
# AUTOGENERATED DEPENDENCIES END

View file

@ -1,292 +0,0 @@
# frozen_string_literal: true
# configure option:
# --with-dbm-type=COMMA-SEPARATED-NDBM-TYPES
#
# ndbm type:
# libc ndbm compatible library in libc.
# db Berkeley DB (libdb)
# db2 Berkeley DB (libdb2)
# db1 Berkeley DB (libdb1)
# db6 Berkeley DB (libdb6)
# db5 Berkeley DB (libdb5)
# db4 Berkeley DB (libdb4)
# db3 Berkeley DB (libdb3)
# gdbm_compat GDBM since 1.8.1 (libgdbm_compat)
# gdbm GDBM until 1.8.0 (libgdbm)
# qdbm QDBM (libqdbm)
# ndbm Some legacy OS may have libndbm.
# :stopdoc:
require 'mkmf'
dir_config("dbm")
if dblib = with_config("dbm-type", nil)
dblib = dblib.split(/[ ,]+/)
else
dblib = %w(libc db db2 db1 db6 db5 db4 db3 gdbm_compat gdbm qdbm)
end
headers = {
"libc" => ["ndbm.h"], # 4.3BSD original ndbm, Berkeley DB 1 in 4.4BSD libc.
"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"],
"db6" => ["db6/db.h", "db6.h", "db.h"],
"gdbm_compat" => ["gdbm-ndbm.h", "gdbm/ndbm.h", "ndbm.h"], # GDBM since 1.8.1
"gdbm" => ["gdbm-ndbm.h", "gdbm/ndbm.h", "ndbm.h"], # GDBM until 1.8.0
"qdbm" => ["qdbm/relic.h", "relic.h"],
}
class << headers
attr_accessor :found
attr_accessor :defs
end
headers.found = []
headers.defs = nil
def headers.db_check(db, hdr)
old_libs = $libs.dup
old_defs = $defs.dup
result = db_check2(db, hdr)
if !result
$libs = old_libs
$defs = old_defs
end
result
end
def have_declared_libvar(var, headers = nil, opt = "", &b)
checking_for checking_message([*var].compact.join(' '), headers, opt) do
try_declared_libvar(var, headers, opt, &b)
end
end
def try_declared_libvar(var, headers = nil, opt = "", &b)
if try_link(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
int main(int argc, char *argv[]) {
void *conftest_var = &#{var};
return 0;
}
SRC
$defs.push(format("-DHAVE_DECLARED_LIBVAR_%s", var.tr_cpp))
true
else
false
end
end
def have_undeclared_libvar(var, headers = nil, opt = "", &b)
checking_for checking_message([*var].compact.join(' '), headers, opt) do
try_undeclared_libvar(var, headers, opt, &b)
end
end
def try_undeclared_libvar(var, headers = nil, opt = "", &b)
var, type = *var
if try_link(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
int main(int argc, char *argv[]) {
typedef #{type || 'int'} conftest_type;
extern conftest_type #{var};
conftest_type *conftest_var = &#{var};
return 0;
}
SRC
$defs.push(format("-DHAVE_UNDECLARED_LIBVAR_%s", var.tr_cpp))
true
else
false
end
end
def have_empty_macro_dbm_clearerr(headers = nil, opt = "", &b)
checking_for checking_message('empty macro of dbm_clearerr(foobarbaz)',
headers, opt) do
try_toplevel('dbm_clearerr(foobarbaz)', headers, opt, &b)
end
end
def try_toplevel(src, headers = nil, opt = "", &b)
if try_compile(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
#{src}
SRC
true
else
false
end
end
def headers.db_check2(db, hdr)
$defs.push(%{-DRUBYDBM_DBM_HEADER='"#{hdr}"'})
$defs.push(%{-DRUBYDBM_DBM_TYPE='"#{db}"'})
hsearch = nil
case db
when /^db[2-6]?$/
hsearch = "-DDB_DBM_HSEARCH"
when "gdbm_compat"
have_library("gdbm") or return false
end
if !have_type("DBM", hdr, hsearch)
return false
end
# 'libc' means ndbm is provided by libc.
# 4.3BSD original ndbm is contained in libc.
# 4.4BSD (and its derivatives such as NetBSD) contains Berkeley DB 1 in libc.
if !(db == 'libc' ? have_func('dbm_open("", 0, 0)', hdr, hsearch) :
have_library(db, 'dbm_open("", 0, 0)', hdr, hsearch))
return false
end
# Skip a mismatch of Berkeley DB's ndbm.h and old GDBM library.
#
# dbm_clearerr() should be available for any ndbm implementation.
# It is available since the original (4.3BSD) ndbm and standardized by POSIX.
#
# However "can't resolve symbol 'dbm_clearerr'" problem may be caused by
# header/library mismatch: Berkeley DB ndbm.h and GDBM library until 1.8.3.
# GDBM (until 1.8.3) provides dbm_clearerr() as a empty macro in the header
# and the library don't provide dbm_clearerr().
# Berkeley DB provides dbm_clearerr() as a usual function.
# So Berkeley DB header with GDBM library causes the problem.
#
if !have_func('dbm_clearerr((DBM *)0)', hdr, hsearch)
return false
end
# Berkeley DB's ndbm.h (since 1.85 at least) defines DBM_SUFFIX.
# Note that _DB_H_ is not defined on Mac OS X because
# it uses Berkeley DB 1 but ndbm.h doesn't include db.h.
have_db_header = have_macro('DBM_SUFFIX', hdr, hsearch)
# Old GDBM's ndbm.h, until 1.8.3, defines dbm_clearerr as a macro which
# expands to no tokens.
have_gdbm_header1 = have_empty_macro_dbm_clearerr(hdr, hsearch)
# Recent GDBM's ndbm.h, since 1.9, includes gdbm.h and it defines _GDBM_H_.
# ndbm compatibility layer of GDBM is provided by libgdbm (until 1.8.0)
# and libgdbm_compat (since 1.8.1).
have_gdbm_header2 = have_macro('_GDBM_H_', hdr, hsearch)
# 4.3BSD's ndbm.h defines _DBM_IOERR.
# The original ndbm is provided by libc in 4.3BSD.
have_ndbm_header = have_macro('_DBM_IOERR', hdr, hsearch)
# GDBM provides ndbm functions in libgdbm_compat since GDBM 1.8.1.
# GDBM's ndbm.h defines _GDBM_H_ since GDBM 1.9.
# If _GDBM_H_ is defined, 'gdbm_compat' is required and reject 'gdbm'.
if have_gdbm_header2 && db == 'gdbm'
return false
end
if have_db_header
$defs.push('-DRUBYDBM_DB_HEADER')
end
have_gdbm_header = have_gdbm_header1 | have_gdbm_header2
if have_gdbm_header
$defs.push('-DRUBYDBM_GDBM_HEADER')
end
# ndbm.h is provided by the original (4.3BSD) ndbm,
# Berkeley DB 1 in libc of 4.4BSD and
# ndbm compatibility layer of GDBM.
# So, try to check header/library mismatch.
#
# Several (possibly historical) distributions provides libndbm.
# It may be Berkeley DB, GDBM or 4.3BSD ndbm.
# So mismatch check is not performed for that.
# Note that libndbm is searched only when --with-dbm-type=ndbm is
# given for configure.
#
if hdr == 'ndbm.h' && db != 'libc' && db != 'ndbm'
if /\Adb\d?\z/ !~ db && have_db_header
return false
end
if /\Agdbm/ !~ db && have_gdbm_header
return false
end
if have_ndbm_header
return false
end
end
# Berkeley DB
have_func('db_version((int *)0, (int *)0, (int *)0)', hdr, hsearch)
# GDBM
have_gdbm_version = have_declared_libvar("gdbm_version", hdr, hsearch)
# gdbm_version is available since very old version (GDBM 1.5 at least).
# However it is not declared by ndbm.h until GDBM 1.8.3.
# We can't include both ndbm.h and gdbm.h because they both define datum type.
# ndbm.h includes gdbm.h and gdbm_version is declared since GDBM 1.9.
have_gdbm_version |= have_undeclared_libvar(["gdbm_version", "char *"], hdr, hsearch)
# QDBM
have_var("dpversion", hdr, hsearch)
# detect mismatch between GDBM header and other library.
# If GDBM header is included, GDBM library should be linked.
if have_gdbm_header && !have_gdbm_version
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
end
$defs << '-DDBM_HDR="<'+hdr+'>"'
@found << hdr
puts "header: #{hdr}"
puts "library: #{db}"
true
end
if dblib.any? {|db| headers.fetch(db, ["ndbm.h"]).any? {|hdr| headers.db_check(db, hdr) } }
have_header("cdefs.h")
have_header("sys/cdefs.h")
have_func("dbm_pagfno((DBM *)0)", headers.found, headers.defs)
have_func("dbm_dirfno((DBM *)0)", headers.found, headers.defs)
convertible_int("datum.dsize", headers.found, headers.defs)
checking_for("sizeof(DBM) is available") {
if try_compile(<<SRC)
#ifdef HAVE_CDEFS_H
# include <cdefs.h>
#endif
#ifdef HAVE_SYS_CDEFS_H
# include <sys/cdefs.h>
#endif
#include DBM_HDR
const int sizeof_DBM = (int)sizeof(DBM);
SRC
$defs << '-DDBM_SIZEOF_DBM=sizeof(DBM)'
else
$defs << '-DDBM_SIZEOF_DBM=0'
end
}
create_makefile("dbm")
end
# :startdoc:

View file

@ -1,634 +0,0 @@
# frozen_string_literal: true
require 'test/unit'
require 'tmpdir'
begin
require 'dbm'
rescue LoadError
end
if defined? DBM
require 'tmpdir'
require 'fileutils'
class TestDBM_RDONLY < Test::Unit::TestCase
def TestDBM_RDONLY.uname_s
require 'rbconfig'
case RbConfig::CONFIG['target_os']
when 'cygwin'
require 'etc'
Etc.uname[:sysname]
else
RbConfig::CONFIG['target_os']
end
end
SYSTEM = uname_s
def setup
@tmpdir = Dir.mktmpdir("tmptest_dbm")
@prefix = "tmptest_dbm_#{$$}"
@path = "#{@tmpdir}/#{@prefix}_"
# prepare to make readonly DBM file
DBM.open("#{@tmpdir}/#{@prefix}_rdonly") {|dbm|
dbm['foo'] = 'FOO'
}
File.chmod(0400, *Dir.glob("#{@tmpdir}/#{@prefix}_rdonly.*"))
assert_instance_of(DBM, @dbm_rdonly = DBM.new("#{@tmpdir}/#{@prefix}_rdonly", nil))
end
def teardown
assert_nil(@dbm_rdonly.close)
ObjectSpace.each_object(DBM) do |obj|
obj.close unless obj.closed?
end
FileUtils.remove_entry_secure @tmpdir
end
def test_delete_rdonly
skip("skipped because root can read anything") if Process.uid == 0
if /^CYGWIN_9/ !~ SYSTEM
assert_raise(DBMError) {
@dbm_rdonly.delete("foo")
}
assert_nil(@dbm_rdonly.delete("bar"))
end
end
def test_fetch_not_found
notfound = nil
result = Object.new
assert_same(result, @dbm_rdonly.fetch("bar") {|k| notfound = k; result})
assert_equal("bar", notfound)
end
end
class TestDBM < Test::Unit::TestCase
def setup
@tmpdir = Dir.mktmpdir("tmptest_dbm")
@prefix = "tmptest_dbm_#{$$}"
@path = "#{@tmpdir}/#{@prefix}_"
assert_instance_of(DBM, @dbm = DBM.new(@path))
end
def teardown
assert_nil(@dbm.close) unless @dbm.closed?
ObjectSpace.each_object(DBM) do |obj|
obj.close unless obj.closed?
end
FileUtils.remove_entry_secure @tmpdir
end
def check_size(expect, dbm=@dbm)
assert_equal(expect, dbm.size)
n = 0
dbm.each { n+=1 }
assert_equal(expect, n)
if expect == 0
assert_equal(true, dbm.empty?)
else
assert_equal(false, dbm.empty?)
end
end
def test_dbmfile_suffix
@dbm.close
prefix = File.basename(@path)
suffixes = Dir.entries(@tmpdir).grep(/\A#{Regexp.escape prefix}/) { $' }.sort
pagname = "#{@path}.pag"
dirname = "#{@path}.dir"
dbname = "#{@path}.db"
case DBM::VERSION
when /\bNDBM\b/
assert_equal(%w[.dir .pag], suffixes)
assert(File.zero?(pagname))
assert(File.zero?(dirname))
when /\bGDBM\b/
assert_equal(%w[.dir .pag], suffixes)
assert(!File.zero?(pagname))
assert(!File.zero?(dirname))
pag = File.binread(pagname, 16)
pag_magics = [
0x13579ace, # GDBM_OMAGIC
0x13579acd, # GDBM_MAGIC32
0x13579acf, # GDBM_MAGIC64
]
assert_operator(pag_magics, :include?,
pag.unpack("i")[0]) # native endian, native int.
if !File.identical?(pagname, dirname)
dir = File.binread(dirname, 16)
assert_equal("GDBM", dir[0, 4])
end
when /\bBerkeley DB\b/
assert_equal(%w[.db], suffixes)
assert(!File.zero?(dbname))
db = File.binread(dbname, 16)
assert(db[0,4].unpack("N") == [0x00061561] || # Berkeley DB 1
db[12,4].unpack("L") == [0x00061561]) # Berkeley DBM 2 or later.
when /\bQDBM\b/
assert_equal(%w[.dir .pag], suffixes)
assert(!File.zero?(pagname))
assert(!File.zero?(dirname))
dir = File.binread(dirname, 16)
assert_equal("[depot]\0\v", dir[0, 9])
pag = File.binread(pagname, 16)
if [1].pack("s") == "\x00\x01" # big endian
assert_equal("[DEPOT]\n\f", pag[0, 9])
else # little endian
assert_equal("[depot]\n\f", pag[0, 9])
end
end
if suffixes == %w[.db]
assert_match(/\bBerkeley DB\b/, DBM::VERSION)
end
end
def test_s_new_has_no_block
# DBM.new ignore the block
foo = true
assert_instance_of(DBM, dbm = DBM.new("#{@tmpdir}/#{@prefix}") { foo = false })
assert_equal(foo, true)
assert_nil(dbm.close)
end
def test_s_open_no_create
skip "dbm_open() is broken on libgdbm 1.8.0 or prior (#{DBM::VERSION})" if /GDBM version 1\.(?:[0-7]\b|8\.0)/ =~ DBM::VERSION
assert_nil(dbm = DBM.open("#{@tmpdir}/#{@prefix}", nil))
ensure
dbm.close if dbm
end
def test_s_open_with_block
assert_equal(DBM.open("#{@tmpdir}/#{@prefix}") { :foo }, :foo)
end
def test_close
assert_instance_of(DBM, dbm = DBM.open("#{@tmpdir}/#{@prefix}"))
assert_nil(dbm.close)
# closed DBM file
assert_raise(DBMError) { dbm.close }
end
def test_aref
assert_equal('bar', @dbm['foo'] = 'bar')
assert_equal('bar', @dbm['foo'])
assert_nil(@dbm['bar'])
end
def test_fetch
assert_equal('bar', @dbm['foo']='bar')
assert_equal('bar', @dbm.fetch('foo'))
# key not found
assert_raise(IndexError) {
@dbm.fetch('bar')
}
# test for `ifnone' arg
assert_equal('baz', @dbm.fetch('bar', 'baz'))
# test for `ifnone' block
assert_equal('foobar', @dbm.fetch('bar') {|key| 'foo' + key })
end
def test_aset
num = 0
2.times {|i|
assert_equal('foo', @dbm['foo'] = 'foo')
assert_equal('foo', @dbm['foo'])
assert_equal('bar', @dbm['foo'] = 'bar')
assert_equal('bar', @dbm['foo'])
num += 1 if i == 0
assert_equal(num, @dbm.size)
# assign nil
assert_equal('', @dbm['bar'] = '')
assert_equal('', @dbm['bar'])
num += 1 if i == 0
assert_equal(num, @dbm.size)
# empty string
assert_equal('', @dbm[''] = '')
assert_equal('', @dbm[''])
num += 1 if i == 0
assert_equal(num, @dbm.size)
# Integer
assert_equal('200', @dbm['100'] = '200')
assert_equal('200', @dbm['100'])
num += 1 if i == 0
assert_equal(num, @dbm.size)
# Big key and value
assert_equal('y' * 100, @dbm['x' * 100] = 'y' * 100)
assert_equal('y' * 100, @dbm['x' * 100])
num += 1 if i == 0
assert_equal(num, @dbm.size)
}
end
def test_key
assert_equal('bar', @dbm['foo'] = 'bar')
assert_equal('foo', @dbm.key('bar'))
assert_nil(@dbm['bar'])
end
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_equal(values.reverse, @dbm.values_at(*keys.reverse))
end
def test_select_with_block
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
ret = @dbm.select {|k,v|
assert_equal(k.upcase, v)
k != "bar"
}
assert_equal([['baz', 'BAZ'], ['foo', 'FOO']],
ret.sort)
end
def test_length
num = 10
assert_equal(0, @dbm.size)
num.times {|i|
i = i.to_s
@dbm[i] = i
}
assert_equal(num, @dbm.size)
@dbm.shift
assert_equal(num - 1, @dbm.size)
end
def test_empty?
assert_equal(true, @dbm.empty?)
@dbm['foo'] = 'FOO'
assert_equal(false, @dbm.empty?)
end
def test_each_pair
n = 0
@dbm.each_pair { n += 1 }
assert_equal(0, n)
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
n = 0
ret = @dbm.each_pair {|key, val|
assert_not_nil(i = keys.index(key))
assert_equal(val, values[i])
n += 1
}
assert_equal(keys.size, n)
assert_equal(@dbm, ret)
end
def test_each_value
n = 0
@dbm.each_value { n += 1 }
assert_equal(0, n)
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
n = 0
ret = @dbm.each_value {|val|
assert_not_nil(key = @dbm.key(val))
assert_not_nil(i = keys.index(key))
assert_equal(val, values[i])
n += 1
}
assert_equal(keys.size, n)
assert_equal(@dbm, ret)
end
def test_each_key
n = 0
@dbm.each_key { n += 1 }
assert_equal(0, n)
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
n = 0
ret = @dbm.each_key {|key|
assert_not_nil(i = keys.index(key))
assert_equal(@dbm[key], values[i])
n += 1
}
assert_equal(keys.size, n)
assert_equal(@dbm, ret)
end
def test_keys
assert_equal([], @dbm.keys)
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
assert_equal(keys.sort, @dbm.keys.sort)
assert_equal(values.sort, @dbm.values.sort)
end
def test_values
test_keys
end
def test_shift
assert_nil(@dbm.shift)
assert_equal(0, @dbm.size)
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
ret_keys = []
ret_values = []
while ret = @dbm.shift
ret_keys.push ret[0]
ret_values.push ret[1]
assert_equal(keys.size - ret_keys.size, @dbm.size)
end
assert_equal(keys.sort, ret_keys.sort)
assert_equal(values.sort, ret_values.sort)
end
def test_delete
keys = %w(foo bar baz)
values = %w(FOO BAR BAZ)
key = keys[1]
assert_nil(@dbm.delete(key))
assert_equal(0, @dbm.size)
@dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
assert_equal('BAR', @dbm.delete(key))
assert_nil(@dbm[key])
assert_equal(2, @dbm.size)
assert_nil(@dbm.delete(key))
end
def test_delete_with_block
key = 'no called block'
@dbm[key] = 'foo'
assert_equal('foo', @dbm.delete(key) {|k| k.replace 'called block'; :blockval})
assert_equal(0, @dbm.size)
key = 'no called block'.dup
assert_equal(:blockval, @dbm.delete(key) {|k| k.replace 'called block'; :blockval})
assert_equal(0, @dbm.size)
end
def test_delete_if
v = "0"
100.times {@dbm[v] = v; v = v.next}
ret = @dbm.delete_if {|key, val| key.to_i < 50}
assert_equal(@dbm, ret)
check_size(50, @dbm)
ret = @dbm.delete_if {|key, val| key.to_i >= 50}
assert_equal(@dbm, ret)
check_size(0, @dbm)
# break
v = "0"
100.times {@dbm[v] = v; v = v.next}
check_size(100, @dbm)
n = 0;
@dbm.delete_if {|key, val|
break if n > 50
n+=1
true
}
assert_equal(51, n)
check_size(49, @dbm)
@dbm.clear
# raise
v = "0"
100.times {@dbm[v] = v; v = v.next}
check_size(100, @dbm)
n = 0;
begin
@dbm.delete_if {|key, val|
raise "runtime error" if n > 50
n+=1
true
}
rescue RuntimeError
end
assert_equal(51, n)
check_size(49, @dbm)
end
def test_reject
v = "0"
100.times {@dbm[v] = v; v = v.next}
hash = @dbm.reject {|key, val| key.to_i < 50}
assert_instance_of(Hash, hash)
assert_equal(100, @dbm.size)
assert_equal(50, hash.size)
hash.each_pair {|key,val|
assert_equal(false, key.to_i < 50)
assert_equal(key, val)
}
hash = @dbm.reject {|key, val| key.to_i < 100}
assert_instance_of(Hash, hash)
assert_equal(true, hash.empty?)
end
def test_clear
v = "1"
100.times {v = v.next; @dbm[v] = v}
assert_equal(@dbm, @dbm.clear)
# validate DBM#size
i = 0
@dbm.each { i += 1 }
assert_equal(@dbm.size, i)
assert_equal(0, i)
end
def test_invert
v = "0"
100.times {@dbm[v] = v; v = v.next}
hash = @dbm.invert
assert_instance_of(Hash, hash)
assert_equal(100, hash.size)
hash.each_pair {|key, val|
assert_equal(key.to_i, val.to_i)
}
end
def test_update
hash = {}
v = "0"
100.times {v = v.next; hash[v] = v}
@dbm["101"] = "101"
@dbm.update hash
assert_equal(101, @dbm.size)
@dbm.each_pair {|key, val|
assert_equal(key.to_i, val.to_i)
}
end
def test_replace
hash = {}
v = "0"
100.times {v = v.next; hash[v] = v}
@dbm["101"] = "101"
@dbm.replace hash
assert_equal(100, @dbm.size)
@dbm.each_pair {|key, val|
assert_equal(key.to_i, val.to_i)
}
end
def test_haskey?
assert_equal('bar', @dbm['foo']='bar')
assert_equal(true, @dbm.has_key?('foo'))
assert_equal(false, @dbm.has_key?('bar'))
end
def test_has_value?
assert_equal('bar', @dbm['foo']='bar')
assert_equal(true, @dbm.has_value?('bar'))
assert_equal(false, @dbm.has_value?('foo'))
end
def test_to_a
v = "0"
100.times {v = v.next; @dbm[v] = v}
ary = @dbm.to_a
assert_instance_of(Array, ary)
assert_equal(100, ary.size)
ary.each {|key,val|
assert_equal(key.to_i, val.to_i)
}
end
def test_to_hash
v = "0"
100.times {v = v.next; @dbm[v] = v}
hash = @dbm.to_hash
assert_instance_of(Hash, hash)
assert_equal(100, hash.size)
hash.each {|key,val|
assert_equal(key.to_i, val.to_i)
}
end
end
class TestDBM2 < Test::Unit::TestCase
def setup
@tmproot = Dir.mktmpdir('ruby-dbm')
end
def teardown
FileUtils.remove_entry_secure @tmproot if File.directory?(@tmproot)
end
def test_version
assert_instance_of(String, DBM::VERSION)
end
def test_reader_open_notexist
assert_raise(Errno::ENOENT) {
DBM.open("#{@tmproot}/a", 0666, DBM::READER)
}
end
def test_writer_open_notexist
skip "dbm_open() is broken on libgdbm 1.8.0 or prior (#{DBM::VERSION})" if /GDBM version 1\.(?:[0-7]\b|8\.0)/ =~ DBM::VERSION
assert_raise(Errno::ENOENT) {
DBM.open("#{@tmproot}/a", 0666, DBM::WRITER)
}
end
def test_wrcreat_open_notexist
v = DBM.open("#{@tmproot}/a", 0666, DBM::WRCREAT)
assert_instance_of(DBM, v)
v.close
end
def test_newdb_open_notexist
v = DBM.open("#{@tmproot}/a", 0666, DBM::NEWDB)
assert_instance_of(DBM, v)
v.close
end
def test_reader_open
DBM.open("#{@tmproot}/a") {} # create a db.
v = DBM.open("#{@tmproot}/a", nil, DBM::READER) {|d|
# Errno::EPERM is raised on Solaris which use ndbm.
# DBMError is raised on Debian which use gdbm.
assert_raise(Errno::EPERM, DBMError) { d["k"] = "v" }
true
}
assert(v)
end
def test_newdb_open
DBM.open("#{@tmproot}/a") {|dbm|
dbm["k"] = "v"
}
v = DBM.open("#{@tmproot}/a", nil, DBM::NEWDB) {|d|
assert_equal(0, d.length)
assert_nil(d["k"])
true
}
assert(v)
end
def test_freeze
expected_error = defined?(FrozenError) ? FrozenError : RuntimeError
DBM.open("#{@tmproot}/a") {|d|
d.freeze
assert_raise(expected_error) { d["k"] = "v" }
}
end
end
end

View file

@ -191,12 +191,6 @@ def sync_default_gems(gem)
cp_r("#{upstream}/test/io/wait", "test/io")
cp_r("#{upstream}/io-wait.gemspec", "ext/io/wait")
`git checkout ext/io/wait/depend`
when "dbm"
rm_rf(%w[ext/dbm test/dbm])
cp_r("#{upstream}/ext/dbm", "ext")
cp_r("#{upstream}/test/dbm", "test")
cp_r("#{upstream}/dbm.gemspec", "ext/dbm")
`git checkout ext/dbm/depend`
when "gdbm"
rm_rf(%w[ext/gdbm test/gdbm])
cp_r("#{upstream}/ext/gdbm", "ext")