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.2.2'

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

#closeObject

Close filehandles and keydir



33
34
35
36
# File 'lib/bitcask.rb', line 33

def close
  close_filehandles
  close_keydir
end

#close_filehandlesObject

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_keydirObject

Close the keydir.



49
50
51
# File 'lib/bitcask.rb', line 49

def close_keydir
  @keydir = nil
end

#data_file_namesObject

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_filesObject

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

#eachObject

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

#keysObject

Keydir keys.



77
78
79
# File 'lib/bitcask.rb', line 77

def keys
  keydir.keys
end

#loadObject

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

#sizeObject

Keydir size.



134
135
136
# File 'lib/bitcask.rb', line 134

def size
  @keydir.size
end