From febd0ea1bb7cb31df2eac7df596b0a35ac1e6641 Mon Sep 17 00:00:00 2001 From: Denis Knauf Date: Tue, 9 Mar 2010 22:55:07 +0100 Subject: [PATCH] transaction support added --- lib/sbdb/environment.rb | 5 ++--- lib/sbdb/transaction.rb | 42 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 lib/sbdb/transaction.rb diff --git a/lib/sbdb/environment.rb b/lib/sbdb/environment.rb index c14006f..8f5d382 100644 --- a/lib/sbdb/environment.rb +++ b/lib/sbdb/environment.rb @@ -47,7 +47,7 @@ module SBDB end def transaction flags = nil, &e - Transaction.new flags, &e + Transaction.new self, flags, &e end alias txn transaction @@ -62,8 +62,7 @@ module SBDB opts = {:dir => args[0], :flags => args[1], :mode => args[2]}.update opts @dbs, @env = WeakHash.new, Bdb::Env.new( 0) @env.log_config opts[:log_config], 1 if opts[:log_config] - p lg_bsize: @env.lg_bsize - @env.lg_bsize = 5*2**20 if opts[:lg_bsize] + @env.lg_bsize = opts[:lg_bsize] if opts[:lg_bsize] begin @env.open opts[:dir]||'.', opts[:flags]|| INIT_TRANSACTION|CREATE, opts[:mode]||0 rescue Object close diff --git a/lib/sbdb/transaction.rb b/lib/sbdb/transaction.rb new file mode 100644 index 0000000..fd55c3e --- /dev/null +++ b/lib/sbdb/transaction.rb @@ -0,0 +1,42 @@ +require 'sbdb' +require 'bdb' + +module SBDB + class Transaction + NOSYNC = Bdb::DB_TXN_NOSYNC + SYNC = Bdb::DB_TXN_SYNC + NOWAIT = Bdb::DB_TXN_NOWAIT + WRITE_NOSYNC = Bdb::DB_TXN_WRITE_NOSYNC + SNAPSHOT = Bdb::DB_TXN_SNAPSHOT + READ_COMMITED = Bdb::DB_READ_COMMITTED + READ_UNCOMMITED = Bdb::DB_READ_UNCOMMITTED + + def bdb_object() @txn end + + def self.new *p, &e + r = obj = super( *p) + begin + r = e.call obj + rescue Object + obj.abort + raise $! + ensure + obj.commit + end if e + r + end + + def initialize env, flags = nil, parent = nil + @txn = env.bdb_object.txn_begin parent, flags || 0 + end + + def commit flags = nil + @txn.commit flags || 0 + end + + def abort + @txn.abort + end + end + TXN = Transaction +end