Class: Bitcask

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#dirObject (readonly)

Returns the value of attribute dir.



19
20
21
# File 'lib/bitcask.rb', line 19

def dir
  @dir
end

#keydirObject

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_namesObject

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_filesObject

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

#eachObject

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

#keysObject

Keydir keys.



56
57
58
# File 'lib/bitcask.rb', line 56

def keys
  keydir.keys
end

#loadObject

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

#sizeObject

Keydir size.



113
114
115
# File 'lib/bitcask.rb', line 113

def size
  @keydir.size
end