Class: Higgs::Index

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Block, Synchronized
Defined in:
lib/higgs/index.rb

Overview

storage index

Constant Summary collapse

CVS_ID =

for ident(1)

'$Id: index.rb 842 2008-12-24 09:26:27Z toki $'
MAGIC_SYMBOL =
'HIGGS_INDEX'
MAJOR_VERSION =
0
MINOR_VERSION =
2

Constants included from Block

Block::BLOCK_SIZE, Block::BODY_HASH, Block::BODY_HASH_BIN, Block::FMT_VERSION, Block::HEAD_CKSUM_BITS, Block::HEAD_CKSUM_FMT, Block::HEAD_CKSUM_POS, Block::HEAD_FMT

Instance Attribute Summary

Attributes included from Synchronized

#__lock__

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Synchronized

included

Methods included from Block

block_read, block_write, head_read, head_write, padding_size

Constructor Details

#initializeIndex

Returns a new instance of Index.



30
31
32
33
34
35
36
37
38
# File 'lib/higgs/index.rb', line 30

def initialize
  @change_number = 0
  @eoa = 0
  @free_lists = {}
  @index = {}
  @identities = {}
  @storage_id = nil
  self.__lock__ = Mutex.new
end

Class Method Details

.create_id(key, identities) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/higgs/index.rb', line 80

def self.create_id(key, identities)
  id = key.to_s
  if (identities.key? id) then
    id += '.a'
    id.succ! while (identities.key? id)
  end
  id
end

Instance Method Details

#[](key) ⇒ Object



75
76
77
# File 'lib/higgs/index.rb', line 75

def [](key)
  i = @index[key] and i[1]
end

#[]=(key, value) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/higgs/index.rb', line 89

def []=(key, value)
  if (i = @index[key]) then
    i[1] = value
  else
    id = Index.create_id(key, @identities)
    @identities[id] = key
    @index[key] = [ id, value ]
  end
  value
end

#delete(key) ⇒ Object



101
102
103
104
105
# File 'lib/higgs/index.rb', line 101

def delete(key)
  id, value = @index.delete(key)
  @identities.delete(id) if id
  value
end

#each_keyObject



108
109
110
111
112
113
114
# File 'lib/higgs/index.rb', line 108

def each_key
  keys = __lock__.synchronize{ @index.keys }
  for key in keys
    yield(key)
  end
  self
end

#free_fetch(size) ⇒ Object



50
51
52
# File 'lib/higgs/index.rb', line 50

def free_fetch(size)
  @free_lists[size].shift if (@free_lists.key? size)
end

#free_fetch_at(pos, size) ⇒ Object



55
56
57
# File 'lib/higgs/index.rb', line 55

def free_fetch_at(pos, size)
  @free_lists[size].delete(pos) or raise "not found free region: (#{pos},#{size})"
end

#free_store(pos, size) ⇒ Object



60
61
62
63
64
# File 'lib/higgs/index.rb', line 60

def free_store(pos, size)
  @free_lists[size] = [] unless (@free_lists.key? size)
  @free_lists[size] << pos
  nil
end

#identity(key) ⇒ Object



70
71
72
# File 'lib/higgs/index.rb', line 70

def identity(key)
  i = @index[key] and i[0]
end

#load(path) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/higgs/index.rb', line 179

def load(path)
  File.open(path, 'r') {|f|
    f.binmode
    index_data = Marshal.load(block_read(f, MAGIC_SYMBOL))
    migration_0_0_to_0_1(index_data)
    migration_0_1_to_0_2(index_data)
    if (index_data[:version] != [ MAJOR_VERSION, MINOR_VERSION ]) then
      raise "unsupported version: #{index_data[:version].join('.')}"
    end
    __lock__.synchronize{
      @change_number = index_data[:change_number]
      @eoa = index_data[:eoa]
      @free_lists = index_data[:free_lists]
      @index = index_data[:index]
      @identities = index_data[:identities]
      @storage_id = index_data[:storage_id]
    }
  }
  self
end

#save(path) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
177
# File 'lib/higgs/index.rb', line 165

def save(path)
  tmp_path = "#{path}.tmp.#{$$}"
  File.open(tmp_path, File::WRONLY | File::CREAT | File::TRUNC, 0660) {|f|
    f.binmode
    block_write(f, MAGIC_SYMBOL,
                __lock__.synchronize{
                  Marshal.dump(thread_unsafe_to_h)
                })
    f.fsync
  }
  File.rename(tmp_path, path)
  self
end

#succ!Object



44
45
46
47
# File 'lib/higgs/index.rb', line 44

def succ!
  @change_number = @change_number.succ
  self
end

#to_hObject



116
117
118
119
120
121
122
123
124
125
# File 'lib/higgs/index.rb', line 116

def to_h
  { :version => [ MAJOR_VERSION, MINOR_VERSION ],
    :change_number => @change_number,
    :eoa => @eoa,
    :free_lists => @free_lists,
    :index => @index,
    :identities => @identities,
    :storage_id => @storage_id
  }
end