Class: Higgs::Index
Overview
Constant Summary
collapse
- CVS_ID =
'$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
included
Methods included from Block
block_read, block_write, head_read, head_write, padding_size
Constructor Details
#initialize ⇒ Index
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_key ⇒ Object
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_h ⇒ Object
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
|