Class: Yoda::Store::Adapters::LmdbAdapter

Inherits:
Base
  • Object
show all
Defined in:
lib/yoda/store/adapters/lmdb_adapter.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ LmdbAdapter

Returns a new instance of LmdbAdapter.

Parameters:

  • path (String)

    represents the path to store db.



20
21
22
23
24
25
26
27
# 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

Class Method Details

.for(path) ⇒ Object



9
10
11
12
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 9

def for(path)
  @pool ||= {}
  @pool[path] || (@pool[path] = new(path))
end

.typeObject



14
15
16
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 14

def type
  :lmdb
end

Instance Method Details

#batch_write(data, bar) ⇒ Object

Parameters:

  • data (Enumerator<(String, Object)>)
  • bar (#increment, nil)


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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

#clearObject



85
86
87
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 85

def clear
  @db.clear
end

#delete(address) ⇒ void

This method returns an undefined value.

Parameters:

  • address (String)


64
65
66
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 64

def delete(address)
  @db.delete(address.to_s)
end

#exist?(address) ⇒ true, false

Parameters:

  • address (String)

Returns:

  • (true, false)


70
71
72
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 70

def exist?(address)
  !!@db.get(address.to_s)
end

#get(address) ⇒ any

Parameters:

  • address (String)

Returns:

  • (any)


31
32
33
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 31

def get(address)
  JSON.load(@db.get(address.to_s), symbolize_names: true)
end

#keysArray<String>

Returns:

  • (Array<String>)


75
76
77
78
79
# 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) ⇒ void

This method returns an undefined value.

Parameters:

  • address (String)
  • object (Object)


58
59
60
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 58

def put(address, object)
  do_put(address.to_s, object.to_json)
end

#statsObject



81
82
83
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 81

def stats
  @db.stat
end

#syncObject



89
90
91
# File 'lib/yoda/store/adapters/lmdb_adapter.rb', line 89

def sync
  # @env.sync(force: true)
end