Module: Regurgitator::FileInfo
Overview
:nodoc:
Instance Method Summary collapse
-
#file_info(env, domain, dkey, update = false) ⇒ Object
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] ], } }.
- #file_info_init ⇒ Object
Methods included from Device
#device_init, #device_uris!, extended, #refresh_device, #refresh_device_unlocked
Methods included from ServerSettings
extended, #refresh_zone, #refresh_zone_unlocked, #server_settings_init, #zone_for
Methods included from Domain
#domain_init, #get_dmid, #refresh_domain, #refresh_domain_unlocked
Instance Method Details
#file_info(env, domain, dkey, update = false) ⇒ Object
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] ],
}
}
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/regurgitator/file_info.rb', line 25 def file_info(env, domain, dkey, update = false) dmid = get_dmid(domain) or return devices = refresh_device(update) info = @db[ 'SELECT fid,length FROM file WHERE dmid = ? AND dkey = ? LIMIT 1'.freeze, 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['SELECT devid FROM file_on WHERE fid = ?'.freeze, 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'.freeze, 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 |
#file_info_init ⇒ Object
10 11 12 13 |
# File 'lib/regurgitator/file_info.rb', line 10 def file_info_init domain_init device_init end |