Class: Garcon::Stash::Format
Overview
Database format serializer and deserializer. You can create your own implementation of this class and define your own database format!
Instance Method Summary collapse
-
#dump(rec) ⇒ String
Serialize record and return string.
-
#header ⇒ String
Return database header as string.
-
#parse(buf) {|Array| ... } ⇒ Fixnum
Deserialize records from buffer, and yield them.
-
#read_header(input) ⇒ Object
Read database header from input stream.
Instance Method Details
#dump(rec) ⇒ String
Serialize record and return string.
55 56 57 58 59 60 61 62 |
# File 'lib/garcon/stash/format.rb', line 55 def dump(rec) data = if rec.size == 1 [rec[0].bytesize, DELETE].pack('NN') << rec[0] else [rec[0].bytesize, rec[1].bytesize].pack('NN') << rec[0] << rec[1] end data << crc32(data) end |
#header ⇒ String
Return database header as string
44 45 46 |
# File 'lib/garcon/stash/format.rb', line 44 def header MAGIC + [VERSION].pack('n') end |
#parse(buf) {|Array| ... } ⇒ Fixnum
Deserialize records from buffer, and yield them.
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/garcon/stash/format.rb', line 74 def parse(buf) n, count = 0, 0 while n < buf.size key_size, value_size = buf[n, 8].unpack('NN') data_size = key_size + 8 data_size += value_size if value_size != DELETE data = buf[n, data_size] n += data_size unless buf[n, 4] == crc32(data) raise 'CRC mismatch: your stash might be corrupted!' end n += 4 yield(value_size == DELETE ? [data[8, key_size]] : [data[8, key_size], data[8 + key_size, value_size]]) count += 1 end count end |
#read_header(input) ⇒ Object
Read database header from input stream
34 35 36 37 38 |
# File 'lib/garcon/stash/format.rb', line 34 def read_header(input) raise 'Not a stash' if input.read(MAGIC.bytesize) != MAGIC ver = input.read(2).unpack('n').first raise "Expected stash version #{VERSION}, got #{ver}" if ver != VERSION end |