X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Frbot%2Fregistry.rb;h=d1388ce2fd14aa4a3dce1cb84eed5f5d55016280;hb=d4ebd66d357b9200edabd1f6d4fa1b3c72d048e6;hp=a3c55da83953e72c8eb5646f107aae22e61ab9b5;hpb=561910cc99d8aa9b8587a90982eed8aaf045f142;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/registry.rb b/lib/rbot/registry.rb index a3c55da8..d1388ce2 100644 --- a/lib/rbot/registry.rb +++ b/lib/rbot/registry.rb @@ -16,7 +16,7 @@ module Irc # work with is @bot.botclass. def upgrade_data if File.exist?("#{@bot.botclass}/registry.db") - log "upgrading old-style (rbot 0.9.5 or earlier) plugin registry to new format" + log _("upgrading old-style (rbot 0.9.5 or earlier) plugin registry to new format") old = BDB::Hash.open("#{@bot.botclass}/registry.db", nil, "r+", 0600) new = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil, @@ -36,7 +36,7 @@ module Irc Dir.mkdir("#{@bot.botclass}/registry") unless File.exist?("#{@bot.botclass}/registry") env = BDB::Env.open("#{@bot.botclass}", BDB::INIT_TRANSACTION | BDB::CREATE | BDB::RECOVER)# | BDB::TXN_NOSYNC) dbs = Hash.new - log "upgrading previous (rbot 0.9.9 or earlier) plugin registry to new split format" + log _("upgrading previous (rbot 0.9.9 or earlier) plugin registry to new split format") old = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil, "r+", 0600, "env" => env) old.each {|k,v| @@ -49,13 +49,13 @@ module Irc dirs.length.times { |i| dir = dirs[0,i+1].join("/")+"/" unless File.exist?(dir) - log "creating subregistry directory #{dir}" - Dir.mkdir(dir) + log _("creating subregistry directory #{dir}") + Dir.mkdir(dir) end } end unless dbs.has_key?(prefix) - log "creating db #{@bot.botclass}/registry/#{prefix}.db" + log _("creating db #{@bot.botclass}/registry/#{prefix}.db") dbs[prefix] = BDB::CIBtree.open("#{@bot.botclass}/registry/#{prefix}.db", nil, BDB::CREATE | BDB::EXCL, 0600, "env" => env) @@ -65,7 +65,7 @@ module Irc old.close File.rename("#{@bot.botclass}/plugin_registry.db", "#{@bot.botclass}/plugin_registry.db.old") dbs.each {|k,v| - log "closing db #{k}" + log _("closing db #{k}") v.close } env.close @@ -118,6 +118,9 @@ module Irc # (derived from the plugin's class name, so change it and lose your data). # Calls to registry.each etc, will only iterate over your namespace. class BotRegistryAccessor + + attr_accessor :recovery + # plugins don't call this - a BotRegistryAccessor is created for them and # is accessible via @registry. def initialize(bot, name) @@ -128,23 +131,30 @@ module Irc dir = dirs[0,i+1].join("/")+"/" unless File.exist?(dir) debug "creating subregistry directory #{dir}" - Dir.mkdir(dir) + Dir.mkdir(dir) end } - @registry = DBTree.new bot, "registry/#{@name}" + @registry = nil @default = nil + @recover = nil # debug "initializing registry accessor with name #{@name}" end + def registry + @registry ||= DBTree.new @bot, "registry/#{@name}" + end + def flush - # debug "fushing registry #{@registry}" - @registry.flush - @registry.sync + # debug "fushing registry #{registry}" + return if !@registry + registry.flush + registry.sync end def close - # debug "closing registry #{@registry}" - @registry.close + # debug "closing registry #{registry}" + return if !@registry + registry.close end # convert value to string form for storing in the registry @@ -169,10 +179,17 @@ module Irc begin Marshal.restore(val) rescue Exception => e - warning "failed to restore marshal data for #{val.inspect}, falling back to default" - debug e.inspect - debug e.backtrace.join("\n") - if @default != nil + error _("failed to restore marshal data for #{val.inspect}, attempting recovery or fallback to default") + debug e + if @recovery + begin + return @recovery.call(val) + rescue Exception => ee + error _("marshal recovery failed, trying default") + debug ee + end + end + unless @default.nil? begin return Marshal.restore(@default) rescue @@ -186,8 +203,8 @@ module Irc # lookup a key in the registry def [](key) - if @registry.has_key?(key) - return restore(@registry[key]) + if registry.has_key?(key) + return restore(registry[key]) elsif @default != nil return restore(@default) else @@ -197,7 +214,7 @@ module Irc # set a key in the registry def []=(key,value) - @registry[key] = store(value) + registry[key] = store(value) end # set the default value for registry lookups, if the key sought is not @@ -208,45 +225,45 @@ module Irc # just like Hash#each def each(&block) - @registry.each {|key,value| + registry.each {|key,value| block.call(key, restore(value)) } end # just like Hash#each_key def each_key(&block) - @registry.each {|key, value| + registry.each {|key, value| block.call(key) } end # just like Hash#each_value def each_value(&block) - @registry.each {|key, value| + registry.each {|key, value| block.call(restore(value)) } end # just like Hash#has_key? def has_key?(key) - return @registry.has_key?(key) + return registry.has_key?(key) end alias include? has_key? alias member? has_key? # just like Hash#has_both? def has_both?(key, value) - return @registry.has_both?(key, store(value)) + return registry.has_both?(key, store(value)) end # just like Hash#has_value? def has_value?(value) - return @registry.has_value?(store(value)) + return registry.has_value?(store(value)) end # just like Hash#index? def index(value) - ind = @registry.index(store(value)) + ind = registry.index(store(value)) if ind return ind else @@ -256,18 +273,18 @@ module Irc # delete a key from the registry def delete(key) - return @registry.delete(key) + return registry.delete(key) end # returns a list of your keys def keys - return @registry.keys + return registry.keys end # Return an array of all associations [key, value] in your namespace def to_a ret = Array.new - @registry.each {|key, value| + registry.each {|key, value| ret << [key, restore(value)] } return ret @@ -276,7 +293,7 @@ module Irc # Return an hash of all associations {key => value} in your namespace def to_hash ret = Hash.new - @registry.each {|key, value| + registry.each {|key, value| ret[key] = restore(value) } return ret @@ -284,7 +301,7 @@ module Irc # empties the registry (restricted to your namespace) def clear - @registry.clear + registry.clear end alias truncate clear