about summary refs log tree commit homepage
path: root/lib/mogilefs/mogilefs.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mogilefs/mogilefs.rb')
-rw-r--r--lib/mogilefs/mogilefs.rb31
1 files changed, 21 insertions, 10 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index bbf8740..2b02fb7 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -38,7 +38,7 @@ class MogileFS::MogileFS < MogileFS::Client
   ##
   # Enumerates keys starting with +key+.
 
-  def each_key(prefix)
+  def each_key(prefix = "")
     after = nil
 
     keys, after = list_keys prefix
@@ -181,8 +181,11 @@ class MogileFS::MogileFS < MogileFS::Client
   # Returns the size of +key+.
   def size(key)
     @backend.respond_to?(:_size) and return @backend._size(domain, key)
-    paths = get_paths(key)
-    paths_size(paths)
+    begin
+      file_info(key)["length"].to_i
+    rescue MogileFS::Backend::UnknownCommandError
+      paths_size(get_paths(key))
+    end
   end
 
   def paths_size(paths)
@@ -194,25 +197,32 @@ class MogileFS::MogileFS < MogileFS::Client
   # Lists keys starting with +prefix+ follwing +after+ up to +limit+.  If
   # +after+ is nil the list starts at the beginning.
 
-  def list_keys(prefix, after = nil, limit = 1000, &block)
+  def list_keys(prefix = "", after = nil, limit = 1000)
     if @backend.respond_to?(:_list_keys)
-      return @backend._list_keys(domain, prefix, after, limit, &block)
+      block_given? or return @backend._list_keys(domain, prefix, after, limit)
+      return @backend._list_keys(domain, prefix, after, limit) do |*a|
+        yield(*a)
+      end
     end
 
     res = begin
       @backend.list_keys(:domain => domain, :prefix => prefix,
                          :after => after, :limit => limit)
     rescue MogileFS::Backend::NoneMatchError
-      return nil
+      return
     end
 
     keys = (1..res['key_count'].to_i).map { |i| res["key_#{i}"] }
     if block_given?
       # emulate the MogileFS::Mysql interface, slowly...
       keys.each do |key|
-        paths = get_paths(key)
-        length = paths_size(paths)
-        yield key, length, paths.size
+        begin
+          res = file_info(key)
+        rescue MogileFS::Backend::UnknownCommandError # MogileFS < 2.45
+          paths = get_paths(key)
+          res = { "length" => paths_size(paths), "devcount" => paths.size }
+        end
+        yield key, res["length"], res["devcount"]
       end
     end
 
@@ -231,7 +241,8 @@ class MogileFS::MogileFS < MogileFS::Client
     args and devices = args[:devices] and opts[:devices] = devices ? 1 : 0
     rv = @backend.file_info(opts)
     %w(fid length devcount).each { |f| rv[f] = rv[f].to_i }
-    devids = rv["devids"] and rv["devids"] = devids.split(/,/).map! { |x| x.to_i }
+    devids = rv["devids"] and
+      rv["devids"] = devids.split(/,/).map! { |x| x.to_i }
     rv
   end