X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fregistry.rb;h=cce2b5c89608fe45454133104b5bcd8f805e4da7;hb=43864ec494a9c2538934690f32eacb8bfb5cc921;hp=d1388ce2fd14aa4a3dce1cb84eed5f5d55016280;hpb=069d8c8dd5ab841cc5efcfeae1cdc2e7f93c2976;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/registry.rb b/lib/rbot/registry.rb index d1388ce2..cce2b5c8 100644 --- a/lib/rbot/registry.rb +++ b/lib/rbot/registry.rb @@ -1,10 +1,11 @@ require 'rbot/dbhash' module Irc +class Bot - # this class is now used purely for upgrading from prior versions of rbot + # This class is now used purely for upgrading from prior versions of rbot # the new registry is split into multiple DBHash objects, one per plugin - class BotRegistry + class Registry def initialize(bot) @bot = bot upgrade_data @@ -71,7 +72,6 @@ module Irc env.close end end - end # This class provides persistent storage for plugins via a hash interface. @@ -94,7 +94,7 @@ module Irc # in object store mode, don't make the mistake of treating it like a live # object, e.g. (using the example above) # @registry[:blah][:foo] = "flump" - # will NOT modify the object in the registry - remember that BotRegistry#[] + # will NOT modify the object in the registry - remember that Registry#[] # returns a Marshal.restore'd object, the object you just modified in place # will disappear. You would need to: # blah = @registry[:blah] @@ -117,16 +117,17 @@ module Irc # Your plugins section of the registry is private, it has its own namespace # (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 + class Accessor attr_accessor :recovery - # plugins don't call this - a BotRegistryAccessor is created for them and + # plugins don't call this - a Registry::Accessor is created for them and # is accessible via @registry. def initialize(bot, name) @bot = bot @name = name.downcase - dirs = File.dirname("#{@bot.botclass}/registry/#{@name}").split("/") + @filename = "#{@bot.botclass}/registry/#{@name}" + dirs = File.dirname(@filename).split("/") dirs.length.times { |i| dir = dirs[0,i+1].join("/")+"/" unless File.exist?(dir) @@ -134,9 +135,10 @@ module Irc Dir.mkdir(dir) end } + @filename << ".db" @registry = nil @default = nil - @recover = nil + @recovery = nil # debug "initializing registry accessor with name #{@name}" end @@ -181,7 +183,7 @@ module Irc rescue Exception => e error _("failed to restore marshal data for #{val.inspect}, attempting recovery or fallback to default") debug e - if @recovery + if defined? @recovery and @recovery begin return @recovery.call(val) rescue Exception => ee @@ -203,6 +205,7 @@ module Irc # lookup a key in the registry def [](key) + return nil unless File.exist?(@filename) if registry.has_key?(key) return restore(registry[key]) elsif @default != nil @@ -225,6 +228,7 @@ module Irc # just like Hash#each def each(&block) + return nil unless File.exist?(@filename) registry.each {|key,value| block.call(key, restore(value)) } @@ -232,6 +236,7 @@ module Irc # just like Hash#each_key def each_key(&block) + return nil unless File.exist?(@filename) registry.each {|key, value| block.call(key) } @@ -239,6 +244,7 @@ module Irc # just like Hash#each_value def each_value(&block) + return nil unless File.exist?(@filename) registry.each {|key, value| block.call(restore(value)) } @@ -246,23 +252,28 @@ module Irc # just like Hash#has_key? def has_key?(key) + return false unless File.exist?(@filename) return registry.has_key?(key) end alias include? has_key? alias member? has_key? + alias key? has_key? # just like Hash#has_both? def has_both?(key, value) + return false unless File.exist?(@filename) return registry.has_both?(key, store(value)) end # just like Hash#has_value? def has_value?(value) + return false unless File.exist?(@filename) return registry.has_value?(store(value)) end # just like Hash#index? def index(value) + return nil unless File.exist?(@filename) ind = registry.index(store(value)) if ind return ind @@ -273,16 +284,19 @@ module Irc # delete a key from the registry def delete(key) + return nil unless File.exist?(@filename) return registry.delete(key) end # returns a list of your keys def keys + return [] unless File.exist?(@filename) return registry.keys end # Return an array of all associations [key, value] in your namespace def to_a + return [] unless File.exist?(@filename) ret = Array.new registry.each {|key, value| ret << [key, restore(value)] @@ -292,6 +306,7 @@ module Irc # Return an hash of all associations {key => value} in your namespace def to_hash + return {} unless File.exist?(@filename) ret = Hash.new registry.each {|key, value| ret[key] = restore(value) @@ -301,12 +316,14 @@ module Irc # empties the registry (restricted to your namespace) def clear + return true unless File.exist?(@filename) registry.clear end alias truncate clear # returns an array of the values in your namespace of the registry def values + return [] unless File.exist?(@filename) ret = Array.new self.each {|k,v| ret << restore(v) @@ -315,7 +332,7 @@ module Irc end def sub_registry(prefix) - return BotRegistryAccessor.new(@bot, @name + "/" + prefix.to_s) + return Accessor.new(@bot, @name + "/" + prefix.to_s) end # returns the number of keys in your registry namespace @@ -326,4 +343,6 @@ module Irc end + end +end end