class Irc::DBTree

DBTree is a BTree equivalent of DBHash, with case insensitive lookups.

DBTree is a BTree equivalent of DBHash, with case insensitive lookups.

Public Class Methods

cleanup_env() click to toggle source
# File lib/rbot/registry/bdb.rb, line 179
def DBTree.cleanup_env()
  begin
    debug "DBTree: checking transactions ..."
    has_active_txn = @@env.txn_stat["st_nactive"] > 0
    if has_active_txn
      warning "DBTree: not all transactions completed!"
    end
    DBTree.cleanup_logs
    debug "DBTree: closing environment #{@@env}"
    path = @@env.home
    @@env.close
    @@env = nil
    if has_active_txn
      debug "DBTree: keeping file because of incomplete transactions"
    else
      debug "DBTree: cleaning up environment in #{path}"
      BDB::Env.remove("#{path}")
    end
  rescue Exception => e
    error "failed to clean up environment: #{e.pretty_inspect}"
  end
end
cleanup_logs() click to toggle source
# File lib/rbot/registry/bdb.rb, line 144
def DBTree.cleanup_logs()
  begin
    debug "DBTree: checkpointing ..."
    @@env.checkpoint
  rescue Exception => e
    debug "Failed: #{e.pretty_inspect}"
  end
  begin
    debug "DBTree: flushing log ..."
    @@env.log_flush
    logs = @@env.log_archive(BDB::ARCH_ABS)
    debug "DBTree: deleting archivable logs: #{logs.join(', ')}."
    logs.each { |log|
      File.delete(log)
    }
  rescue Exception => e
    debug "Failed: #{e.pretty_inspect}"
  end
end
create_db(name) click to toggle source
# File lib/rbot/registry/bdb.rb, line 134
def DBTree.create_db(name)
  debug "DBTree: creating empty db #{name}"
  return @@env.open_db(BDB::CIBtree, name, nil, BDB::CREATE | BDB::EXCL, 0600)
end
new(bot, key, absfilename=false) click to toggle source
absfilename

use key as an actual filename, don't prepend the bot's config path and don't append “.db”

# File lib/rbot/registry/bdb.rb, line 98
def initialize(bot, key, absfilename=false)
  @bot = bot
  @key = key
  if @@env.nil?
    begin
      @@env = BDB::Env.open(@bot.botclass, BDB::INIT_TRANSACTION | BDB::CREATE | BDB::RECOVER, "set_lg_max" => @@lg_max)
      debug "DBTree: environment opened with max log size #{@@env.conf['lg_max']}"
    rescue => e
      debug "DBTree: failed to open environment: #{e.pretty_inspect}. Retrying ..."
      @@env = BDB::Env.open(@bot.botclass, BDB::INIT_TRANSACTION | BDB::CREATE |  BDB::RECOVER)
    end
    #@@env = BDB::Env.open(@bot.botclass, BDB::CREATE | BDB::INIT_MPOOL | BDB::RECOVER)
  end

  relfilename = @bot.path key
  relfilename << '.db'

  if absfilename && File.exist?(key)
    # db already exists, use it
    @db = DBTree.open_db(key)
  elsif absfilename
    # create empty db
    @db = DBTree.create_db(key)
  elsif File.exist? relfilename
    # db already exists, use it
    @db = DBTree.open_db relfilename
  else
    # create empty db
    @db = DBTree.create_db relfilename
  end
end
open_db(name) click to toggle source
# File lib/rbot/registry/bdb.rb, line 139
def DBTree.open_db(name)
  debug "DBTree: opening existing db #{name}"
  return @@env.open_db(BDB::CIBtree, name, nil, "r+", 0600)
end
stats() click to toggle source
# File lib/rbot/registry/bdb.rb, line 164
def DBTree.stats()
  begin
    debug "General stats:"
    debug @@env.stat
    debug "Lock stats:"
    debug @@env.lock_stat
    debug "Log stats:"
    debug @@env.log_stat
    debug "Txn stats:"
    debug @@env.txn_stat
  rescue
    debug "Couldn't dump stats"
  end
end

Public Instance Methods

method_missing(method, *args, &block) click to toggle source
# File lib/rbot/registry/bdb.rb, line 130
def method_missing(method, *args, &block)
  return @db.send(method, *args, &block)
end