Consider this deprecated, to be removed at some point…
read-only interface that can be a backend for MogileFS::MogileFS
This provides direct, read-only access to any slave MySQL database to provide better performance, scalability and eliminate mogilefsd as a point of failure
Creates a new MogileFS::Mysql instance. args must include a key :domain specifying the domain of this client and :mysql, specifying an already-initialized Mysql object.
The Mysql object can be either the standard Mysql driver or the Mysqlplus one supporting c_async_query.
# File lib/mogilefs/mysql.rb, line 20 def initialize(args = {}) @my = args[:mysql] @query_method = @my.respond_to?(:c_async_query) ? :c_async_query : :query @last_update_device = @last_update_domain = Time.at(0) @cache_domain = @cache_device = nil end
Get the paths for key.
# File lib/mogilefs/mysql.rb, line 82 def _get_paths(params = {}) zone = params[:zone] # noverify = (params[:noverify] == 1) # TODO this is unused atm dmid = get_dmid(params[:domain]) devices = refresh_device or raise MogileFS::Backend::NoDevicesError urls = [] sql = SELECT fid FROM file WHERE dmid = #{dmid} AND dkey = '#{@my.quote(params[:key])}' LIMIT 1 res = query(sql).fetch_row res && res[0] or raise MogileFS::Backend::UnknownKeyError fid = res[0] sql = "SELECT devid FROM file_on WHERE fid = '#{@my.quote(fid)}'" query(sql).each do |devid,| unless devinfo = devices[devid.to_i] devices = refresh_device(true) devinfo = devices[devid.to_i] or next end devinfo[:readable] or next port = devinfo[:http_get_port] host = zone && zone == 'alt' ? devinfo[:altip] : devinfo[:hostip] nfid = '%010u' % fid b, mmm, ttt = /(\d)(\d{3})(\d{3})(?:\d{3})/.match(nfid)[1..3] uri = "/dev#{devid}/#{b}/#{mmm}/#{ttt}/#{nfid}.fid" urls << "http://#{host}:#{port}#{uri}" end urls end
Lists keys starting with prefix follwing after up to limit. If after is nil the list starts at the beginning.
# File lib/mogilefs/mysql.rb, line 30 def _list_keys(domain, prefix = '', after = '', limit = 1000) # this code is based on server/lib/MogileFS/Worker/Query.pm dmid = get_dmid(domain) # don't modify passed arguments limit ||= 1000 limit = limit.to_i limit = 1000 if limit > 1000 || limit <= 0 after, prefix = "#{after}", "#{prefix}" if after.length > 0 && /^#{Regexp.quote(prefix)}/ !~ after raise MogileFS::Backend::AfterMismatchError end raise MogileFS::Backend::InvalidCharsError if /[%\\]/ =~ prefix prefix.gsub!(/_/, '\_') # not sure why MogileFS::Worker::Query does this... sql = SELECT dkey,length,devcount FROM file WHERE dmid = #{dmid} AND dkey LIKE '#{@my.quote(prefix)}%' AND dkey > '#{@my.quote(after)}' ORDER BY dkey LIMIT #{limit} keys = [] query(sql).each do |dkey,length,devcount| yield(dkey, length.to_i, devcount.to_i) if block_given? keys << dkey end keys.empty? ? nil : [ keys, (keys.last || '') ] end
Returns the size of key.
# File lib/mogilefs/mysql.rb, line 66 def _size(domain, key) dmid = get_dmid(domain) sql = SELECT length FROM file WHERE dmid = #{dmid} AND dkey = '#{@my.quote(key)}' LIMIT 1 res = query(sql).fetch_row return res[0].to_i if res && res[0] raise MogileFS::Backend::UnknownKeyError end
Generated with the Darkfish Rdoc Generator 2.