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.1.1'
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.
-
#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
#initialize(dir) ⇒ Bitcask
Returns a new instance of Bitcask.
20 21 22 23 |
# File 'lib/bitcask.rb', line 20 def initialize(dir) @dir = dir @keydir = Bitcask::Keydir.new end |
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 |
#data_file_names ⇒ Object
Returns a list of all data filenames in this bitcask, sorted from oldest to newest.
34 35 36 37 38 |
# File 'lib/bitcask.rb', line 34 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.
41 42 43 44 45 |
# File 'lib/bitcask.rb', line 41 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.
48 49 50 51 52 53 |
# File 'lib/bitcask.rb', line 48 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.
56 57 58 |
# File 'lib/bitcask.rb', line 56 def keys keydir.keys end |
#load ⇒ Object
Populate the keydir.
61 62 63 64 65 66 67 68 69 |
# File 'lib/bitcask.rb', line 61 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.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/bitcask.rb', line 72 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.
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/bitcask.rb', line 94 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.
113 114 115 |
# File 'lib/bitcask.rb', line 113 def size @keydir.size end |