X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fregistry.rb;h=a3c55da83953e72c8eb5646f107aae22e61ab9b5;hb=a4ff366eea4c88083be8a3d30cc6395f17b55fe2;hp=536305d3fb54f2a6b6a0f684f3f6f170b155d9d4;hpb=44688c76d937c2dade10aaa7bb7e70e508b33684;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/registry.rb b/lib/rbot/registry.rb index 536305d3..a3c55da8 100644 --- a/lib/rbot/registry.rb +++ b/lib/rbot/registry.rb @@ -16,52 +16,63 @@ module Irc # work with is @bot.botclass. def upgrade_data if File.exist?("#{@bot.botclass}/registry.db") - puts "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, + 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, BDB::CREATE | BDB::EXCL, - 0600) + 0600) old.each {|k,v| new[k] = v } old.close new.close - File.delete("#{@bot.botclass}/registry.db") + File.rename("#{@bot.botclass}/registry.db", "#{@bot.botclass}/registry.db.old") end end - + def upgrade_data2 if File.exist?("#{@bot.botclass}/plugin_registry.db") Dir.mkdir("#{@bot.botclass}/registry") unless File.exist?("#{@bot.botclass}/registry") - env = BDB::Env.open("#{@bot.botclass}", BDB::INIT_TRANSACTION | BDB::CREATE | BDB::RECOVER) + env = BDB::Env.open("#{@bot.botclass}", BDB::INIT_TRANSACTION | BDB::CREATE | BDB::RECOVER)# | BDB::TXN_NOSYNC) dbs = Hash.new - puts "upgrading previous (rbot 0.9.9 or earlier) plugin registry to new split format" - old = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil, + 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| prefix,key = k.split("/", 2) prefix.downcase! + # subregistries were split with a +, now they are in separate folders + if prefix.gsub!(/\+/, "/") + # Ok, this code needs to be put in the db opening routines + dirs = File.dirname("#{@bot.botclass}/registry/#{prefix}.db").split("/") + dirs.length.times { |i| + dir = dirs[0,i+1].join("/")+"/" + unless File.exist?(dir) + log "creating subregistry directory #{dir}" + Dir.mkdir(dir) + end + } + end unless dbs.has_key?(prefix) - puts "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) - end dbs[prefix][key] = v } old.close File.rename("#{@bot.botclass}/plugin_registry.db", "#{@bot.botclass}/plugin_registry.db.old") dbs.each {|k,v| - puts "closing db #{k}" + log "closing db #{k}" v.close } env.close end end end - + # This class provides persistent storage for plugins via a hash interface. # The default mode is an object store, so you can store ruby objects and @@ -77,7 +88,7 @@ module Irc # blah = @registry[:blah] # The registry can of course be used to store simple strings, fixnums, etc as # well, and should be useful to store or cache plugin data or dynamic plugin - # configuration. + # configuration. # # WARNING: # in object store mode, don't make the mistake of treating it like a live @@ -112,13 +123,28 @@ module Irc def initialize(bot, name) @bot = bot @name = name.downcase + dirs = File.dirname("#{@bot.botclass}/registry/#{@name}").split("/") + dirs.length.times { |i| + dir = dirs[0,i+1].join("/")+"/" + unless File.exist?(dir) + debug "creating subregistry directory #{dir}" + Dir.mkdir(dir) + end + } @registry = DBTree.new bot, "registry/#{@name}" @default = nil # debug "initializing registry accessor with name #{@name}" end def flush + # debug "fushing registry #{@registry}" @registry.flush + @registry.sync + end + + def close + # debug "closing registry #{@registry}" + @registry.close end # convert value to string form for storing in the registry @@ -142,8 +168,10 @@ module Irc def restore(val) begin Marshal.restore(val) - rescue Exception - $stderr.puts "failed to restore marshal data, falling back to default" + 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 begin return Marshal.restore(@default) @@ -184,14 +212,14 @@ module Irc block.call(key, restore(value)) } end - + # just like Hash#each_key def each_key(&block) @registry.each {|key, value| block.call(key) } end - + # just like Hash#each_value def each_value(&block) @registry.each {|key, value| @@ -210,7 +238,7 @@ module Irc def has_both?(key, value) return @registry.has_both?(key, store(value)) end - + # just like Hash#has_value? def has_value?(value) return @registry.has_value?(store(value)) @@ -225,7 +253,7 @@ module Irc return nil end end - + # delete a key from the registry def delete(key) return @registry.delete(key) @@ -244,7 +272,7 @@ module Irc } return ret end - + # Return an hash of all associations {key => value} in your namespace def to_hash ret = Hash.new @@ -269,6 +297,10 @@ module Irc return ret end + def sub_registry(prefix) + return BotRegistryAccessor.new(@bot, @name + "/" + prefix.to_s) + end + # returns the number of keys in your registry namespace def length self.keys.length