]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blobdiff - lib/rbot/registry.rb
BotUser wants username=, not name=
[user/henk/code/ruby/rbot.git] / lib / rbot / registry.rb
index 240933111edee417be6d5ade397333f3a255b503..cb59306c773253211af73dd48faece6fe0f6208d 100644 (file)
@@ -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