Class: Bitcask
- Inherits:
-
Object
- Object
- Bitcask
- Includes:
- Enumerable
- Defined in:
- lib/bitcask.rb,
lib/bitcask/version.rb
Defined Under Namespace
Classes: ChecksumError, DataFile, Error, HintFile, Keydir
Constant Summary collapse
- TOMBSTONE =
"bitcask_tombstone"
- VERSION =
'0.2.2'
Instance Attribute Summary collapse
-
#dir ⇒ Object
readonly
Returns the value of attribute dir.
-
#keydir ⇒ Object
Opens a bitcask backed by the given directory.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Uses the keydir to get an object from the bitcask.
-
#close ⇒ Object
Close filehandles and keydir.
-
#close_filehandles ⇒ Object
Close all filehandles loaded by the keydir.
-
#close_keydir ⇒ Object
Close the keydir.
-
#data_file_names ⇒ Object
Returns a list of all data filenames in this bitcask, sorted from oldest to newest.
-
#data_files ⇒ Object
Returns a list of Bitcask::DataFiles in chronological order.
-
#each ⇒ Object
Iterates over all keys in keydir.
-
#initialize(dir) ⇒ Bitcask
constructor
A new instance of Bitcask.
-
#keys ⇒ Object
Keydir keys.
-
#load ⇒ Object
Populate the keydir.
-
#load_data_file(data_file) ⇒ Object
Load a DataFile into the keydir.
-
#load_hint_file(hint_file) ⇒ Object
Load a HintFile into the keydir.
-
#size ⇒ Object
Keydir size.
Constructor Details
Instance Attribute Details
#dir ⇒ Object (readonly)
Returns the value of attribute dir.
19 20 21 |
# File 'lib/bitcask.rb', line 19 def dir @dir end |
#keydir ⇒ Object
Opens a bitcask backed by the given directory.
18 19 20 |
# File 'lib/bitcask.rb', line 18 def keydir @keydir end |
Instance Method Details
#[](key) ⇒ Object
Uses the keydir to get an object from the bitcask. Returns a value.
27 28 29 30 |
# File 'lib/bitcask.rb', line 27 def [](key) index = @keydir[key] or return nil @keydir.data_files[index.file_id][index.value_pos, index.value_sz].value end |
#close ⇒ Object
Close filehandles and keydir
33 34 35 36 |
# File 'lib/bitcask.rb', line 33 def close close_filehandles close_keydir end |
#close_filehandles ⇒ Object
Close all filehandles loaded by the keydir.
39 40 41 42 43 44 45 46 |
# File 'lib/bitcask.rb', line 39 def close_filehandles @keydir.data_files.each do |data_file| data_file.close if h = data_file.instance_variable_get('@hint_file') h.close end end end |
#close_keydir ⇒ Object
Close the keydir.
49 50 51 |
# File 'lib/bitcask.rb', line 49 def close_keydir @keydir = nil end |
#data_file_names ⇒ Object
Returns a list of all data filenames in this bitcask, sorted from oldest to newest.
55 56 57 58 59 |
# File 'lib/bitcask.rb', line 55 def data_file_names Dir.glob(File.join(@dir, '*.data')).sort! do |a, b| a.to_i <=> b.to_i end end |
#data_files ⇒ Object
Returns a list of Bitcask::DataFiles in chronological order.
62 63 64 65 66 |
# File 'lib/bitcask.rb', line 62 def data_files data_file_names.map! do |filename| Bitcask::DataFile.new filename end end |
#each ⇒ Object
Iterates over all keys in keydir. Yields key, value pairs.
69 70 71 72 73 74 |
# File 'lib/bitcask.rb', line 69 def each @keydir.each do |key, index| entry = @keydir.data_files[index.file_id][index.value_pos, index.value_sz] yield [entry.key, entry.value] end end |
#keys ⇒ Object
Keydir keys.
77 78 79 |
# File 'lib/bitcask.rb', line 77 def keys keydir.keys end |
#load ⇒ Object
Populate the keydir.
82 83 84 85 86 87 88 89 90 |
# File 'lib/bitcask.rb', line 82 def load data_files.each do |d| if h = d.hint_file load_hint_file h else load_data_file d end end end |
#load_data_file(data_file) ⇒ Object
Load a DataFile into the keydir.
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/bitcask.rb', line 93 def load_data_file(data_file) # Determine data_file index. @keydir.data_files |= [data_file] file_id = @keydir.data_files.index data_file pos = 0 data_file.each do |entry| # Check for existing newer entry in keydir if (cur = @keydir[entry.key]).nil? or entry.tstamp >= cur.tstamp @keydir[entry.key] = Keydir::Entry.new( file_id, data_file.pos - pos, pos, entry.tstamp ) end pos = data_file.pos end end |
#load_hint_file(hint_file) ⇒ Object
Load a HintFile into the keydir.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/bitcask.rb', line 115 def load_hint_file(hint_file) # Determine data_file index. @keydir.data_files |= [hint_file.data_file] file_id = @keydir.data_files.index hint_file.data_file hint_file.each do |entry| # Check for existing newer entry in keydir if (cur = @keydir[entry.key]).nil? or entry.tstamp >= cur.tstamp @keydir[entry.key] = Keydir::Entry.new( file_id, entry.value_sz, entry.value_pos, entry.tstamp ) end end end |
#size ⇒ Object
Keydir size.
134 135 136 |
# File 'lib/bitcask.rb', line 134 def size @keydir.size end |