class Yoda::Store::Adapters::LmdbAdapter

Public Class Methods

for(path) click to toggle source
# File lib/yoda/store/adapters/lmdb_adapter.rb, line 9
def for(path)
  @pool ||= {}
  @pool[path] || (@pool[path] = new(path))
end
new(path) click to toggle source

@param path [String] represents the path to store db.

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 20
def initialize(path)
  Dir.mkdir(path) unless Dir.exist?(path)
  @path = path
  @env = LMDB.new(path)
  @db = @env.database('main', create: true)

  at_exit { @env.close }
end
type() click to toggle source
# File lib/yoda/store/adapters/lmdb_adapter.rb, line 14
def type
  :lmdb
end

Public Instance Methods

batch_write(data, bar) click to toggle source

@param data [Enumerator<(String, Object)>] @param bar [#increment, nil]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 37
def batch_write(data, bar)
  env = LMDB.new(@path, mapsize: @env.info[:mapsize], writemap: true, mapasync: true, nosync: true)
  db = env.database('main', create: true)
  data.each do |(k, v)|
    begin
      db.put(k.to_s, v.to_json)
    rescue LMDB::Error::MAP_FULL => _ex
      @env.mapsize = @env.info[:mapsize] * 2
      env.close
      env = LMDB.new(@path, mapsize: @env.info[:mapsize], writemap: true, mapasync: true, nosync: true)
      db = env.database('main', create: true)
      db.put(k.to_s, v.to_json)
    end
    bar&.increment
  end
  env.close
end
clear() click to toggle source
# File lib/yoda/store/adapters/lmdb_adapter.rb, line 85
def clear
  @db.clear
end
delete(address) click to toggle source

@param address [String] @return [void]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 64
def delete(address)
  @db.delete(address.to_s)
end
exist?(address) click to toggle source

@param address [String] @return [true, false]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 70
def exist?(address)
  !!@db.get(address.to_s)
end
get(address) click to toggle source

@param address [String] @return [any]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 31
def get(address)
  JSON.load(@db.get(address.to_s), symbolize_names: true)
end
keys() click to toggle source

@return [Array<String>]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 75
def keys
  Enumerator.new do |yielder|
    @db.each { |(k, v)| yielder << k }
  end.to_a
end
put(address, object) click to toggle source

@param address [String] @param object [Object] @return [void]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 58
def put(address, object)
  do_put(address.to_s, object.to_json)
end
stats() click to toggle source
# File lib/yoda/store/adapters/lmdb_adapter.rb, line 81
def stats
  @db.stat
end
sync() click to toggle source
# File lib/yoda/store/adapters/lmdb_adapter.rb, line 89
def sync
  # @env.sync(force: true)
end

Private Instance Methods

do_put(address, value) click to toggle source

@param address [String] @param value [String] @return [void]

# File lib/yoda/store/adapters/lmdb_adapter.rb, line 98
def do_put(address, value)
  LMDB.new(@path, mapsize: @env.info[:mapsize]) do |env|
    db = env.database('main', create: true)
    db.put(address, value)
  end
rescue LMDB::Error::MAP_FULL => _ex
  @env.mapsize = @env.info[:mapsize] * 2
  LMDB.new(@path, mapsize: @env.info[:mapsize]) do |env|
    db = env.database('main', create: true)
    db.put(address, value)
  end
end