class Yomikomu::FlatFileStorage

Public Class Methods

new() click to toggle source
Calls superclass method Yomikomu::BasicStorage::new
# File lib/yomikomu.rb, line 276
def initialize
  super
  require 'fileutils'

  @updated = false

  if File.exist?(index_path)
    open(index_path, 'rb'){|f| @index = Marshal.load(f)}
  else
    @index = {}
    open(data_path, 'w'){} # touch
  end

  @data_file = open(data_path, 'a+b')

  at_exit{
    if @updated
      open(index_path, 'wb'){|f| Marshal.dump(@index, f)}
      Yomikomu.info{'FlatFile: update'}
    end
  }
end

Public Instance Methods

data_path() click to toggle source
# File lib/yomikomu.rb, line 272
def data_path
  Yomikomu.prefix + 'ff_data'
end
index_path() click to toggle source
# File lib/yomikomu.rb, line 268
def index_path
  Yomikomu.prefix + 'ff_index'
end
remove_compiled_iseq(fname) click to toggle source
# File lib/yomikomu.rb, line 299
def remove_compiled_iseq fname
  raise 'unsupported'
end

Private Instance Methods

compiled_iseq_exist?(fname, iseq_key) click to toggle source
# File lib/yomikomu.rb, line 305
def compiled_iseq_exist? fname, iseq_key
  @index[iseq_key]
end
compiled_iseq_is_younger?(fname, iseq_key) click to toggle source
# File lib/yomikomu.rb, line 309
def compiled_iseq_is_younger? fname, iseq_key
  offset, size, date = @index[iseq_key]
  date.to_i >= File.mtime(fname).to_i
end
read_compiled_iseq(fname, iseq_key) click to toggle source
# File lib/yomikomu.rb, line 314
def read_compiled_iseq fname, iseq_key
  offset, size, date = @index[iseq_key]
  @data_file.pos = offset
  binary = @data_file.read(size)
  raise "size is not match" if binary.size != size
  binary
end
write_compiled_iseq(fname, iseq_key, binary) click to toggle source
# File lib/yomikomu.rb, line 322
def write_compiled_iseq fname, iseq_key, binary
  raise "compiled binary for #{fname} already exists. flatfile does not support overwrite." if compiled_iseq_exist?(fname, iseq_key)

  @data_file.seek 0, IO::SEEK_END
  offset = @data_file.tell
  size = binary.size
  date = Time.now.to_i
  @data_file.write(binary)
  @index[iseq_key] = [offset, size, date]

  @updated = true
end