Sha256: 053eb41609cc9d0c9923772cad597625846c6ecd252bf3fdd8153adabe63d239

Contents?: true

Size: 1.62 KB

Versions: 1

Compression:

Stored size: 1.62 KB

Contents

# -*- encoding: binary -*-
module Regurgitator::FileInfo # :nodoc:
  include Regurgitator::Domain
  include Regurgitator::Device

  FILE_INFO = 'SELECT fid,length FROM file WHERE dmid = ? AND dkey = ? LIMIT 1'

  def file_info_init
    domain_init
    device_init
  end

  # returns a hash with file information and URIs for accessing the file:
  # {
  #   :fid => 3149113,
  #   :length => 17,
  #   :uris => {
  #     "east" => [ [read_write,read_only], [read_write,read_only] ],
  #     "west" => [ [read_write,read_only], [read_write,read_only] ],
  #     nil => [ [read_write,read_only], [read_write,read_only] ],
  #   }
  # }
  def file_info(env, domain, dkey, update = false)
    dmid = get_dmid(domain) or return
    devices = refresh_device(update)
    info = @db[FILE_INFO, dmid, dkey].first or return
    0 == info[:length] and return info
    fid = info[:fid]
    read_uris = Hash.new { |h,k| h[k] = [] }
    drain_uris = Hash.new { |h,k| h[k] = [] }

    zone = env['regurgitator.zone']

    @db[DEVICES_ON, fid].each do |x|
      devinfo = devices[x[:devid]] or next
      fid >= 10_000_000_000 and next # TODO: support larger FIDs

      uris = devinfo[:uris][:pri]
      nfid = sprintf('%010u', fid)
      /\A(\d)(\d{3})(\d{3})(?:\d{3})\z/ =~ nfid
      fid_path = "/#$1/#$2/#$3/#{nfid}.fid"
      uris = uris.map do |u|
        u = u.dup
        u.path += fid_path # must be a copy
        u
      end
      (devinfo[:preferred] ? read_uris : drain_uris)[devinfo[:zone]] << uris
    end
    uris = info[:uris] = read_uris.empty? ? drain_uris : read_uris
    (uris.empty? && ! update) ? file_info(env, domain, dkey, true) : info
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
regurgitator-0.7.0 lib/regurgitator/file_info.rb