X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fregistry%2Ftc.rb;h=06013f8f796749aa2f2e751a1a179c6208218393;hb=440ef790a60a73e9b47050cddacddba59c61b30b;hp=9f41048422442128964ab1542af41ffe7f27765c;hpb=2ed8235cdb9e92b0bc46ee97ddbf4c4a1f70c6d8;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/registry/tc.rb b/lib/rbot/registry/tc.rb index 9f410484..06013f8f 100644 --- a/lib/rbot/registry/tc.rb +++ b/lib/rbot/registry/tc.rb @@ -117,21 +117,25 @@ module Irc if absfilename && File.exist?(key) # db already exists, use it @db = DBTree.open_db(key) + @fname = key.dup elsif absfilename # create empty db @db = DBTree.create_db(key) + @fname = key.dup elsif File.exist? relfilename # db already exists, use it @db = DBTree.open_db relfilename + @fname = relfilename.dup else # create empty db @db = DBTree.create_db relfilename + @fname = relfilename.dup end oldbasename = (absfilename ? key : relfilename).gsub(/\.tdb$/, ".db") if File.exists? oldbasename and defined? BDB # upgrading warning "Upgrading old database #{oldbasename}..." - oldb = ::BDB::Btree.open(oldbasename, nil, "r", 0600) + oldb = ::BDB::CIBtree.open(oldbasename, nil, "r", 0600) oldb.each_key do |k| @db.outlist k @db.putlist k, (oldb.duplicates(k, false)) @@ -146,19 +150,51 @@ module Irc return @db.send(method, *args, &block) end + # Since TokyoCabinet does not have the concept of an environment, we have to do the + # database management ourselves. In particular, we have to keep a list of open + # registries to be sure we to close all of them on exit + @@bot_registries={ } + def self.close_bot_registries + @@bot_registries.each { |name, reg| reg.close } + @@bot_registries.clear + end + + def close + db = @@bot_registries.delete(@fname) + if db != @db + error "We think we have #{@db} from #{@fname}, TC pseudo-env gives us #{db}" + end + @db.close + end + def DBTree.create_db(name) debug "DBTree: creating empty db #{name}" + if @@bot_registries.key? name + error "DBTree: creating assumingly allocated db #{name}?!" + return @@bot_registries[name] + end db = TokyoCabinet::CIBDB.new res = db.open(name, TokyoCabinet::CIBDB::OREADER | TokyoCabinet::CIBDB::OCREAT | TokyoCabinet::CIBDB::OWRITER) - warning "DBTree: creating empty db #{name}: #{db.errmsg(db.ecode) unless res}" + if res + @@bot_registries[name] = db + else + error "DBTree: creating empty db #{name}: #{db.errmsg(db.ecode)}" + end return db end def DBTree.open_db(name) debug "DBTree: opening existing db #{name}" + if @@bot_registries.key? name + return @@bot_registries[name] + end db = TokyoCabinet::CIBDB.new res = db.open(name, TokyoCabinet::CIBDB::OREADER | TokyoCabinet::CIBDB::OWRITER) - warning "DBTree:opening db #{name}: #{db.errmsg(db.ecode) unless res}" + if res + @@bot_registries[name] = db + else + error "DBTree: opening db #{name}: #{db.errmsg(db.ecode)}" + end return db end @@ -171,7 +207,7 @@ module Irc end def DBTree.cleanup_env() - # no-op + DBTree.close_bot_registries end end @@ -340,6 +376,7 @@ class Bot # debug "closing registry #{registry}" return if !@registry registry.close + @registry = nil end # convert value to string form for storing in the registry @@ -405,7 +442,7 @@ class Bot # just like Hash#each def each(set=nil, bulk=0, &block) return nil unless File.exist?(@filename) - registry.fwmkeys(set).each {|key| + registry.fwmkeys(set.to_s).each {|key| block.call(key, restore(registry[key])) } end @@ -413,7 +450,7 @@ class Bot # just like Hash#each_key def each_key(set=nil, bulk=0, &block) return nil unless File.exist?(@filename) - registry.fwmkeys(set).each do |key| + registry.fwmkeys(set.to_s).each do |key| block.call(key) end end @@ -421,7 +458,7 @@ class Bot # just like Hash#each_value def each_value(set=nil, bulk=0, &block) return nil unless File.exist?(@filename) - registry.fwmkeys(set).each do |key| + registry.fwmkeys(set.to_s).each do |key| block.call(restore(registry[key])) end end