Gemification and updated extconf.rb
This commit is contained in:
parent
b9d57911df
commit
e505f13f17
105
ChangeLog
105
ChangeLog
|
@ -1,105 +0,0 @@
|
||||||
2007-01-20 16:32 tag R0_8
|
|
||||||
|
|
||||||
2007-01-20 16:32 danj
|
|
||||||
|
|
||||||
* bdb.c: resolve #906. Changed cursor management semantics. Should
|
|
||||||
eliminate SEGV during finalize cleanup
|
|
||||||
|
|
||||||
2006-12-21 19:48 danj
|
|
||||||
|
|
||||||
* extconf.rb: make dbh find work a little better with --dbh arg
|
|
||||||
|
|
||||||
2006-12-21 19:48 danj
|
|
||||||
|
|
||||||
* bdb.c: add set/get shm key
|
|
||||||
|
|
||||||
2006-12-12 11:13 danj
|
|
||||||
|
|
||||||
* extconf.rb: add more berkeley locations
|
|
||||||
|
|
||||||
2006-12-12 11:12 danj
|
|
||||||
|
|
||||||
* bdb.c: add hash page controls
|
|
||||||
|
|
||||||
2006-07-11 17:02 danj
|
|
||||||
|
|
||||||
* bdb.c: fix db_stat wild pointer for txn
|
|
||||||
|
|
||||||
2006-05-15 17:28 tag R0_7
|
|
||||||
|
|
||||||
2006-05-15 17:28 danj
|
|
||||||
|
|
||||||
* bdb.c, bdb.h: another cpp fix
|
|
||||||
|
|
||||||
2006-05-15 17:22 danj
|
|
||||||
|
|
||||||
* bdb.h: fix for linux
|
|
||||||
|
|
||||||
2006-05-15 12:35 tag R0_6
|
|
||||||
|
|
||||||
2006-05-15 12:35 danj
|
|
||||||
|
|
||||||
* bdb.h, extconf.rb: expand automagic configuration
|
|
||||||
|
|
||||||
2006-05-12 20:41 tag R0_5
|
|
||||||
|
|
||||||
2006-05-12 20:41 danj
|
|
||||||
|
|
||||||
* bdb.c: compat for 4.2
|
|
||||||
|
|
||||||
2006-05-10 15:03 danj
|
|
||||||
|
|
||||||
* bdb.c: fix hash and queue stat variable creation (macro was
|
|
||||||
wrong)
|
|
||||||
|
|
||||||
2006-05-04 15:45 tag R0_4
|
|
||||||
|
|
||||||
2006-05-04 15:45 danj
|
|
||||||
|
|
||||||
* bdb.c: fix aproc initialization
|
|
||||||
|
|
||||||
2006-04-24 20:56 tag R0_3
|
|
||||||
|
|
||||||
2006-04-24 20:56 danj
|
|
||||||
|
|
||||||
* bdb.c: finished initial round of rdoc
|
|
||||||
|
|
||||||
2006-04-24 16:48 danj
|
|
||||||
|
|
||||||
* bdb.c: adding rdoc, unfinished
|
|
||||||
|
|
||||||
2006-04-24 15:40 danj
|
|
||||||
|
|
||||||
* bdb.c, extconf.rb: make extconf.rb accept --va so the library can
|
|
||||||
coexist with bdb2 release prior to transactions. Note, howerver
|
|
||||||
the two libraries cannot be used at the same time
|
|
||||||
|
|
||||||
2006-04-24 14:21 danj
|
|
||||||
|
|
||||||
* bdb.c: add truncate and sync
|
|
||||||
|
|
||||||
2006-04-24 14:12 danj
|
|
||||||
|
|
||||||
* bdb.c: status for db and txn
|
|
||||||
|
|
||||||
2006-04-21 16:45 danj
|
|
||||||
|
|
||||||
* bdb.c, bdb.h: added transactions, cleanup of finalizers, addition
|
|
||||||
of pget, in process of adding many other API calls
|
|
||||||
|
|
||||||
2006-03-06 12:44 danj
|
|
||||||
|
|
||||||
* bdb.h, extconf.rb: fix solaris install problems
|
|
||||||
|
|
||||||
2006-02-13 21:56 tag R0_2
|
|
||||||
|
|
||||||
2006-02-13 21:56 danj
|
|
||||||
|
|
||||||
* MANIFEST, bdb.c, bdb.h, extconf.rb, README, status.txt, test.rb:
|
|
||||||
Initial
|
|
||||||
|
|
||||||
2006-02-13 21:56 danj
|
|
||||||
|
|
||||||
* MANIFEST, bdb.c, bdb.h, extconf.rb, README, status.txt, test.rb:
|
|
||||||
Initial revision
|
|
||||||
|
|
19
LICENSE
Normal file
19
LICENSE
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2008 Dan Janowski <danj@3skel.com>, Matt Bauer <bauer@pedalbrain.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
43
Rakefile
Normal file
43
Rakefile
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
require 'rubygems'
|
||||||
|
require 'rake/gempackagetask'
|
||||||
|
require 'rake/rdoctask'
|
||||||
|
require 'rake/testtask'
|
||||||
|
|
||||||
|
load 'bdb.gemspec'
|
||||||
|
|
||||||
|
Rake::GemPackageTask.new(BDB_SPEC) do |pkg|
|
||||||
|
pkg.need_tar = true
|
||||||
|
end
|
||||||
|
|
||||||
|
task :default => "test"
|
||||||
|
|
||||||
|
desc "Clean"
|
||||||
|
task :clean do
|
||||||
|
include FileUtils
|
||||||
|
rm_rf File.join('ext', 'bdb_aux._c')
|
||||||
|
rm_rf File.join('ext', 'Makefile')
|
||||||
|
rm_rf File.join('ext', 'mkmf.log')
|
||||||
|
rm_rf File.join('ext', 'conftest.c')
|
||||||
|
rm_rf File.join('ext', '*.o')
|
||||||
|
rm_rf 'pkg'
|
||||||
|
end
|
||||||
|
|
||||||
|
desc "Run tests"
|
||||||
|
Rake::TestTask.new("test") do |t|
|
||||||
|
t.libs << ["test", "ext"]
|
||||||
|
t.pattern = 'test/*_test.rb'
|
||||||
|
t.verbose = true
|
||||||
|
t.warning = true
|
||||||
|
end
|
||||||
|
|
||||||
|
task :doc => [:rdoc]
|
||||||
|
namespace :doc do
|
||||||
|
Rake::RDocTask.new do |rdoc|
|
||||||
|
files = ["README", "lib/**/*.rb"]
|
||||||
|
rdoc.rdoc_files.add(files)
|
||||||
|
rdoc.main = "README.textile"
|
||||||
|
rdoc.title = "Bdb Docs"
|
||||||
|
rdoc.rdoc_dir = "doc"
|
||||||
|
rdoc.options << "--line-numbers" << "--inline-source"
|
||||||
|
end
|
||||||
|
end
|
17
bdb.gemspec
Normal file
17
bdb.gemspec
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
BDB_SPEC = Gem::Specification.new do |s|
|
||||||
|
s.platform = Gem::Platform::RUBY
|
||||||
|
s.required_ruby_version = '>=1.8.4'
|
||||||
|
s.name = "bdb"
|
||||||
|
s.version = "0.0.1"
|
||||||
|
s.authors = ["Matt Bauer", "Dan Janowski"]
|
||||||
|
s.email = "bauer@pedalbrain.com"
|
||||||
|
s.summary = "A Ruby interface to BerkeleyDB"
|
||||||
|
s.files = FileList['lib/**/*', 'ext/**/*', 'test/**/*', 'LICENSE', 'README.textile', 'Rakefile'].to_a
|
||||||
|
s.extensions = ["ext/extconf.rb"]
|
||||||
|
|
||||||
|
s.homepage = "http://github.com/mattbauer/bdb"
|
||||||
|
|
||||||
|
s.require_paths = ["lib", "ext"]
|
||||||
|
s.test_files = Dir.glob('test/*.rb')
|
||||||
|
s.has_rdoc = true
|
||||||
|
end
|
|
@ -2528,7 +2528,7 @@ VALUE txn_set_timeout(VALUE obj, VALUE vtimeout, VALUE vflags)
|
||||||
* Developed against 4.3/4.4. No support for prior versions.
|
* Developed against 4.3/4.4. No support for prior versions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void Init_bdb2() {
|
void Init_bdb() {
|
||||||
fv_call=rb_intern("call");
|
fv_call=rb_intern("call");
|
||||||
fv_err_new=rb_intern("new");
|
fv_err_new=rb_intern("new");
|
||||||
fv_err_code=rb_intern("@code");
|
fv_err_code=rb_intern("@code");
|
|
@ -17,7 +17,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <version.h>
|
#include <version.h>
|
||||||
#include <extconf.h>
|
|
||||||
#include <db.h>
|
#include <db.h>
|
||||||
|
|
||||||
#define NOTXN NULL
|
#define NOTXN NULL
|
||||||
|
@ -70,10 +69,10 @@ typedef struct s_txnh {
|
||||||
t_envh *env;
|
t_envh *env;
|
||||||
} t_txnh;
|
} t_txnh;
|
||||||
|
|
||||||
#define cu(b,m) \
|
#define cu(b,m) \
|
||||||
rb_define_const(b,#m,UINT2NUM(m))
|
rb_define_const(b,#m,UINT2NUM(m))
|
||||||
|
|
||||||
#define ci(b,m) \
|
#define ci(b,m) \
|
||||||
rb_define_const(b,#m,INT2NUM(m))
|
rb_define_const(b,#m,INT2NUM(m))
|
||||||
|
|
||||||
#define cs(b,m) \
|
#define cs(b,m) \
|
||||||
|
@ -89,13 +88,13 @@ VALUE db_ ## fname ## _eq(VALUE obj, VALUE v) \
|
||||||
#define attr_writer(fname) \
|
#define attr_writer(fname) \
|
||||||
VALUE fname ## _writer(VALUE obj, VALUE v) \
|
VALUE fname ## _writer(VALUE obj, VALUE v) \
|
||||||
{ \
|
{ \
|
||||||
rb_ivar_set(obj,fv_ ## fname,v); \
|
rb_ivar_set(obj,fv_ ## fname,v); \
|
||||||
return obj; \
|
return obj; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define attr_reader(fname) \
|
#define attr_reader(fname) \
|
||||||
VALUE fname ## _reader(VALUE obj) \
|
VALUE fname ## _reader(VALUE obj) \
|
||||||
{ \
|
{ \
|
||||||
return rb_ivar_get(obj,fv_ ## fname); \
|
return rb_ivar_get(obj,fv_ ## fname); \
|
||||||
}
|
}
|
||||||
|
|
59
ext/extconf.rb
Normal file
59
ext/extconf.rb
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
require 'mkmf'
|
||||||
|
|
||||||
|
dir_config('db')
|
||||||
|
|
||||||
|
versions=%w(db-4.7 db-4.6 db-4.5 db-4.4 db-4.3 db-4.2)
|
||||||
|
until versions.empty?
|
||||||
|
(lib_ok = have_library(versions.shift,'db_version', 'db.h')) && break
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_header
|
||||||
|
if File.exist?("bdb_aux._c")
|
||||||
|
message("Not writing bdb_aux._c (defines), already exists\n")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
message("Writing bdb_aux._c (defines), this takes a while\n")
|
||||||
|
db_header = $CPPFLAGS.split.select { |f| f =~ /^-I/ }.map { |e|
|
||||||
|
f = File.join(e[2..-1], 'db.h')
|
||||||
|
File.exists?(f) ? f : nil
|
||||||
|
}.select { |e| e }.first
|
||||||
|
|
||||||
|
n=0
|
||||||
|
defines=[]
|
||||||
|
File.open(db_header) {|fd|
|
||||||
|
File.open("bdb_aux._c","w") {|hd|
|
||||||
|
hd.puts("/* This file automatically generated by extconf.rb */\n")
|
||||||
|
fd.each_line {|l|
|
||||||
|
if l =~ %r{^#define\s+(DBC?_\w*)\s+([^\/]*)\s*(.*?)(\/\*.*)?$}
|
||||||
|
name = $1
|
||||||
|
value = $2
|
||||||
|
if macro_defined?(name,"#include <db.h>")
|
||||||
|
case value
|
||||||
|
when /^"/
|
||||||
|
hd.print(%Q{cs(mBdb,%s);\n}%[name])
|
||||||
|
when /^\(?(0x|\d)/
|
||||||
|
hd.print(%Q{cu(mBdb,%s);\n}%[name])
|
||||||
|
when /^\(?-/
|
||||||
|
hd.print(%Q{ci(mBdb,%s);\n}%[name])
|
||||||
|
else
|
||||||
|
$stderr.puts "don't know how to handle #{name} #{value.strip}, guessing UINT"
|
||||||
|
hd.print(%Q{cu(mBdb,%s);\n}%[name])
|
||||||
|
end
|
||||||
|
n+=1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
message("\nwrote #{n} defines\n")
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
if lib_ok
|
||||||
|
create_header
|
||||||
|
create_makefile('bdb')
|
||||||
|
else
|
||||||
|
$stderr.puts("cannot create Makefile")
|
||||||
|
exit 1
|
||||||
|
end
|
122
extconf.rb
122
extconf.rb
|
@ -1,122 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
require 'mkmf'
|
|
||||||
|
|
||||||
$distcleanfiles=["bdb_aux._c"]
|
|
||||||
dir_config('db')
|
|
||||||
|
|
||||||
mj,mi,rv=RUBY_VERSION.split('.').collect {|s| s.to_i}
|
|
||||||
ri=(((mj*1000)+mi)*1000)+rv
|
|
||||||
if ri < 1008004
|
|
||||||
$stderr.puts("Version 1.8.4 minimum required")
|
|
||||||
exit(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
versions=%w(db-4.6 db-4.5 db-4.4 db-4.3 db-4.2)
|
|
||||||
until versions.empty?
|
|
||||||
(lib_ok=find_library(this_version=versions.shift,'db_create')) && break
|
|
||||||
end
|
|
||||||
|
|
||||||
$stderr.puts(this_version)
|
|
||||||
|
|
||||||
$maj,$min=0,0
|
|
||||||
if try_link0(<<SRC)
|
|
||||||
#include <db.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
main() {
|
|
||||||
int maj,min;
|
|
||||||
db_version(&maj,&min,NULL);
|
|
||||||
printf("%d %d",maj,min);
|
|
||||||
}
|
|
||||||
SRC
|
|
||||||
xpopen("./conftest") do |f|
|
|
||||||
$maj,$min=f.gets.chomp.split.collect {|v| v.to_i}
|
|
||||||
end
|
|
||||||
libpath=`ldd conftest`.split.find {|e| e =~ %r{/.+#{this_version}} }
|
|
||||||
$stderr.puts("library path #{libpath}")
|
|
||||||
rm_f("conftest*")
|
|
||||||
else
|
|
||||||
message("unable to compile against found DB library\n")
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
|
|
||||||
message("Found DB version #{$maj}.#{$min} in #{libpath}\n")
|
|
||||||
|
|
||||||
# lets find its header now
|
|
||||||
incpath=libpath
|
|
||||||
while incpath!= "/"
|
|
||||||
incpath=File.dirname(incpath)
|
|
||||||
i=File.join(incpath,"include","db.h")
|
|
||||||
if File.exist?(i)
|
|
||||||
incpath=i ; break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if incpath=="/"
|
|
||||||
message("unable to find db.h")
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
incpath=File.dirname(incpath)
|
|
||||||
|
|
||||||
message("Found db.h in #{incpath}\n")
|
|
||||||
|
|
||||||
def check_header dir
|
|
||||||
opt=if dir; "-I#{dir}".quote; else nil; end
|
|
||||||
hmaj=hmin=nil
|
|
||||||
if try_cpp(cpp_include("db.h"),opt)
|
|
||||||
if (hmaj=try_constant("DB_VERSION_MAJOR","db.h",opt)) and
|
|
||||||
(hmin=try_constant("DB_VERSION_MINOR","db.h",opt)) and
|
|
||||||
hmaj.to_i == $maj and hmin.to_i == $min
|
|
||||||
message("Found matching db.h with #{opt}\n")
|
|
||||||
$INCFLAGS << " " << opt
|
|
||||||
$db_inc=dir
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
if hmaj
|
|
||||||
message("found a db.h, but wrong version (lib) #{$maj}.#{$min} != (db.h) #{hmaj}.#{hmin}\n")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
exit unless check_header(incpath)
|
|
||||||
|
|
||||||
inc="#include <db.h>"
|
|
||||||
n=0
|
|
||||||
message("Writing bdb_aux._c (defines), this takes a while\n")
|
|
||||||
defines=[]
|
|
||||||
File.open(File.join($db_inc,"db.h")) {|fd|
|
|
||||||
File.open("bdb_aux._c","w") {|hd|
|
|
||||||
hd.puts("/* This file automatically generated by extconf.rb */\n")
|
|
||||||
fd.each_line {|l|
|
|
||||||
if l =~ %r{^#define\s+(DBC?_\w*)\s+([^\/]*)\s*(.*?)(\/\*.*)?$}
|
|
||||||
name = $1
|
|
||||||
value = $2
|
|
||||||
if macro_defined?(name,inc)
|
|
||||||
case value
|
|
||||||
when /^"/
|
|
||||||
hd.print(%Q{ cs(mBdb,%s);\n}%[name])
|
|
||||||
when /^\(?(0x|\d)/
|
|
||||||
hd.print(%Q{ cu(mBdb,%s);\n}%[name])
|
|
||||||
when /^\(?-/
|
|
||||||
hd.print(%Q{ ci(mBdb,%s);\n}%[name])
|
|
||||||
else
|
|
||||||
$stderr.puts "don't know how to handle #{name} #{value}, guessing UINT"
|
|
||||||
hd.print(%Q{ cu(mBdb,%s);\n}%[name])
|
|
||||||
end
|
|
||||||
n+=1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
message("\nwrote #{n} defines\n")
|
|
||||||
} unless File.exist?("bdb_aux._c")
|
|
||||||
|
|
||||||
$defs << $INCFLAGS
|
|
||||||
|
|
||||||
if lib_ok
|
|
||||||
create_header
|
|
||||||
create_makefile('bdb2')
|
|
||||||
else
|
|
||||||
$stderr.puts("cannot create Makefile")
|
|
||||||
end
|
|
43
status.txt
43
status.txt
|
@ -1,43 +0,0 @@
|
||||||
20-Jan-2007
|
|
||||||
|
|
||||||
The library is stable. With the 0.8 release, the last known bug has been
|
|
||||||
resolved. The library now has transactions, many more environment
|
|
||||||
management functions (hash params, shm, etc), and open transactions,
|
|
||||||
cursors and databases are tracked and properly cleaned up during finalization,
|
|
||||||
or at least when env.close is called. The library is size stable (no leaks)
|
|
||||||
and is being used in a heavy production environment with great reliability.
|
|
||||||
|
|
||||||
The future:
|
|
||||||
|
|
||||||
There are numerous DB controls that are not yet in the interface, as well
|
|
||||||
as handling sequences and other DB features. There has been no call for
|
|
||||||
them yet, so they linger.
|
|
||||||
|
|
||||||
The build system is a little weak. DB can be installed in so many different
|
|
||||||
places and variety of versions, making version selection tricky. There is
|
|
||||||
a complication, in that it is not enough for the compiler chain to find the
|
|
||||||
db.h and libraries, the build needs to find the exact db.h, because symbols
|
|
||||||
are extracted from it to generate the Ruby-side defines. It would be nice to
|
|
||||||
fix the build process and to turn it into a Gem.
|
|
||||||
|
|
||||||
Numerous, more ruby-like, methods need to be added. Probably in just a .rb
|
|
||||||
file to wrap and increase the ease of use for the core methods. The methods
|
|
||||||
do not deal with variable argument lists as they are largely faithful to
|
|
||||||
the DB API. But methods like cursor#next, cursor#first, and cursor.each
|
|
||||||
are appropriate.
|
|
||||||
|
|
||||||
9-Feb-2006
|
|
||||||
Done:
|
|
||||||
All common environment, database and cursor functions are in. They are also
|
|
||||||
_fully_ unit tested and are in production under heavy use. There are a
|
|
||||||
few missing, like pget.
|
|
||||||
|
|
||||||
Limitations:
|
|
||||||
If Ruby process exits and there are any open cursors (your program did not
|
|
||||||
close them) the process will SEGV. This is due to dbc_free trying to close
|
|
||||||
the cursor(s), even though the DB may already be closed. This will be fixed
|
|
||||||
by keeping track of open cursors and automatically closing then when
|
|
||||||
db->close is called, either by calling close or during finalization. Other
|
|
||||||
than messing up your BDB environment, the SEGV is larglely harmless (but
|
|
||||||
annoying). It should never happen if your program is written correctly.
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
require 'bdb2'
|
require 'test_helper'
|
||||||
|
|
||||||
50.times {|n|
|
50.times {|n|
|
||||||
db=Bdb::Db.new
|
db=Bdb::Db.new
|
1
test/test_helper.rb
Normal file
1
test/test_helper.rb
Normal file
|
@ -0,0 +1 @@
|
||||||
|
require "bdb"
|
Loading…
Reference in a new issue