Class: Irc::DBTree

Inherits:
Object show all
Defined in:
lib/rbot/dbhash.rb

Overview

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

Constant Summary collapse

@@env =
nil
@@lg_max =

TODO: make this customizable Note that it must be at least four times lg_bsize

8*1024*1024

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bot, key, absfilename = false) ⇒ DBTree

absfilename

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



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/rbot/dbhash.rb', line 96

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

  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?(@bot.botclass + "/#{key}.db")
    # db already exists, use it
    @db = DBTree.open_db(@bot.botclass + "/#{key}.db")
  else
    # create empty db
    @db = DBTree.create_db(@bot.botclass + "/#{key}.db")
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



125
126
127
# File 'lib/rbot/dbhash.rb', line 125

def method_missing(method, *args, &block)
  return @db.send(method, *args, &block)
end

Class Method Details

.cleanup_envObject



174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/rbot/dbhash.rb', line 174

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_logsObject



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/rbot/dbhash.rb', line 139

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) ⇒ Object



129
130
131
132
# File 'lib/rbot/dbhash.rb', line 129

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

.open_db(name) ⇒ Object



134
135
136
137
# File 'lib/rbot/dbhash.rb', line 134

def DBTree.open_db(name)
  debug "DBTree: opening existing db #{name}"
  return @@env.open_db(BDB::CIBtree, name, nil, "r+", 0600)
end

.statsObject



159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/rbot/dbhash.rb', line 159

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