Sha256: c05bec3a17734e69204342465d7949671dfcb87c2a47fb6ff5b279d0d3eb8b99

Contents?: true

Size: 1.94 KB

Versions: 741

Compression:

Stored size: 1.94 KB

Contents

class PackedIndex
  attr_accessor :file, :mask, :mask_length, :offset, :item_size, :stream, :nil_string

  ELEMS = {
    "i" => ["l", 4],
    "I" => ["q", 8],
    "f" => ["f", 4],
    "F" => ["d", 8],
  }

  def self.process_mask(mask)
    str = ""
    size = 0
    mask.each do |e|
      if ELEMS.include? e
        str << ELEMS[e][0]
        size += ELEMS[e][1]
      elsif e =~ /^(\d+)s$/
        num = $1.to_i
        str << "a" << num.to_s
        size += num
      else
        e, num = e.split(":")
        str << e
        size = (num.nil? ? size + 1 : size + num.to_i)
      end
    end
    [str, size]
  end

  def size
    @size ||= begin
                (File.size(file) - offset) / item_size
              end
  end

  def initialize(file, write = false, pattern = nil)
    @file = file
    if write
      @stream = Open.open(file, :mode => 'wb')
      @mask, @item_size = PackedIndex.process_mask pattern
      header = [@mask.length, @item_size].pack("ll")
      @stream.write(header)
      @stream.write(mask)
      @offset = @mask.length + 8
    else
      @stream = Open.open(file, :mode => 'rb')
      header = @stream.read(8)
      mask_length, @item_size = header.unpack("ll")
      @mask = @stream.read(mask_length)
      @offset = @mask.length + 8
    end
    @nil_string = "NIL" << ("-" * (@item_size - 3))
  end

  def persistence_path
    @file
  end

  def persistence_path=(value)
    @file=value
  end

  def read(force = false)
    close
    @stream = Open.open(file, :mode => 'rb')
  end

  def <<(payload)
    if payload.nil?
      @stream.write nil_string
    else
      @stream.write payload.pack(mask)
    end
  end

  def [](position)
    @stream.seek(position * item_size + offset)
    encoded = @stream.read(item_size)
    return nil if encoded.nil? or encoded == nil_string 
    encoded.unpack mask
  end

  def values_at(*positions)
    positions.collect{|p|
      self[p]
    }
  end

  def close
    stream.close unless stream.closed?
  end
end

Version data entries

741 entries across 741 versions & 1 rubygems

Version Path
rbbt-util-6.0.3 lib/rbbt/packed_index.rb
rbbt-util-5.44.1 lib/rbbt/packed_index.rb
rbbt-util-5.43.0 lib/rbbt/packed_index.rb
rbbt-util-5.42.0 lib/rbbt/packed_index.rb
rbbt-util-5.41.1 lib/rbbt/packed_index.rb
rbbt-util-5.41.0 lib/rbbt/packed_index.rb
rbbt-util-5.40.5 lib/rbbt/packed_index.rb
rbbt-util-5.40.4 lib/rbbt/packed_index.rb
rbbt-util-5.40.3 lib/rbbt/packed_index.rb
rbbt-util-5.40.0 lib/rbbt/packed_index.rb
rbbt-util-5.39.0 lib/rbbt/packed_index.rb
rbbt-util-5.38.1 lib/rbbt/packed_index.rb
rbbt-util-5.38.0 lib/rbbt/packed_index.rb
rbbt-util-5.37.16 lib/rbbt/packed_index.rb
rbbt-util-5.37.15 lib/rbbt/packed_index.rb
rbbt-util-5.37.14 lib/rbbt/packed_index.rb
rbbt-util-5.37.13 lib/rbbt/packed_index.rb
rbbt-util-5.37.12 lib/rbbt/packed_index.rb
rbbt-util-5.37.11 lib/rbbt/packed_index.rb
rbbt-util-5.37.10 lib/rbbt/packed_index.rb