]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/registry.rb
Fix small typo in basics core botmodule
[user/henk/code/ruby/rbot.git] / lib / rbot / registry.rb
index 2cb28b605950d880d7b4fc4ebbb6f44a85897f81..a3c55da83953e72c8eb5646f107aae22e61ab9b5 100644 (file)
@@ -17,37 +17,48 @@ module Irc
     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"
-        old = BDB::Hash.open("#{@bot.botclass}/registry.db", nil, 
-                             "r+", 0600) 
-        new = BDB::CIBtree.open("#{@bot.botclass}/plugin_registry.db", nil, 
+        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
         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, 
+        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)
             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
         }
@@ -61,7 +72,7 @@ module Irc
       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,17 +123,27 @@ 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
 
@@ -149,8 +170,8 @@ module Irc
         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")
+        debug e.inspect
+        debug e.backtrace.join("\n")
         if @default != nil
           begin
             return Marshal.restore(@default)
@@ -191,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|
@@ -217,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))
@@ -232,7 +253,7 @@ module Irc
         return nil
       end
     end
-    
+
     # delete a key from the registry
     def delete(key)
       return @registry.delete(key)
@@ -251,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
@@ -277,7 +298,7 @@ module Irc
     end
 
     def sub_registry(prefix)
-      return BotRegistryAccessor.new(@bot, @name + "/" + prefix)
+      return BotRegistryAccessor.new(@bot, @name + "/" + prefix.to_s)
     end
 
     # returns the number of keys in your registry namespace