class DiskBlockFile

Block file that stores its contents to disk

Public Class Methods

new(block_size, path) click to toggle source
Calls superclass method BlockFile::new
# File lib/geotree/diskblockfile.rb, line 7
def initialize(block_size, path)
 @path = path 
 super(block_size)
end

Public Instance Methods

close_storage() click to toggle source
# File lib/geotree/diskblockfile.rb, line 55
def close_storage
  flush
  @file = nil   
end
flush() click to toggle source
# File lib/geotree/diskblockfile.rb, line 60
def flush
  @file.flush
end
open_storage() click to toggle source
# File lib/geotree/diskblockfile.rb, line 47
def open_storage
  existed = File.file?(@path)
  @file = File.open(@path, existed ? "r+b" : "w+b")
  raise IOError if !@file
  
  existed
 end
read(block_name, dest_buffer = nil) click to toggle source
# File lib/geotree/diskblockfile.rb, line 12
def read(block_name, dest_buffer = nil)
  db = false
 
  dest_buffer ||= alloc_buffer

  offset = block_size * block_name
  
  @file.pos = offset
     
  @file.read(block_size,dest_buffer)
  raise IOError if (dest_buffer.size != block_size)
  
  !db || hex_dump(dest_buffer,"Disk.read #{block_name}")
   
  dest_buffer 
end
write(block_name, src_buffer) click to toggle source
# File lib/geotree/diskblockfile.rb, line 29
def write(block_name, src_buffer)
 
  db = false
  !db || pr("Disk.write %d\n",block_name)
  !db || hex_dump(src_buffer)

  offset = block_size * block_name
  @file.pos = offset  
       
  raise ArgumentError if src_buffer.size != block_size
  
  count = @file.write(src_buffer)
  
  if count != src_buffer.size
    raise IOError,"wrote #{count} bytes instead of #{src_buffer.size}"
  end
end