Sha256: 9978e52add74659161181fe768f358e10489a03c6f8a444bff6da535c32f2cf4

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

module CephRuby
  # Enumerator for Ceph Rados Objects Xattr
  class XattrEnumerator
    include Enumerable

    attr_accessor :object, :pool
    attr_reader :handle

    def initialize(object)
      self.object = object
      self.pool = object.pool
      open
    end

    def close
      Lib::Rados.rados_getxattrs_end(handle)
      @handle = nil
    end

    def open?
      !handle.nil?
    end

    def open
      return if open?
      pool.ensure_open
      handle_p = FFI::MemoryPointer.new(:pointer)
      ret = Lib::Rados.rados_getxattrs(pool.handle, object.name, handle_p)
      raise SystemCallError.new('unable to open xattr list', -ret) if ret < 0
      @handle = handle_p.get_pointer(0)
    end

    def each
      return enum_for(:each) unless block_given?
      open
      loop do
        obj = next_xattr_object
        break if obj.nil?
        yield obj
      end
      close
    end

    private

    def next_xattr_object
      key_buffer = FFI::MemoryPointer.new(:pointer, 1)
      val_buffer = FFI::MemoryPointer.new(:pointer, 1)
      size_t_buffer = FFI::MemoryPointer.new(:size_t)
      ret = Lib::Rados.rados_getxattrs_next(handle, key_buffer,
                                            val_buffer, size_t_buffer)
      raise SystemCallError.new('unable to fetch next object', -ret) if ret < 0
      next_xattr(key_buffer)
    end

    def next_xattr(key_buffer)
      str_ptr = key_buffer.read_pointer
      return if str_ptr.null?
      Xattr.new(object, str_ptr.read_string)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ceph-ruby-livelink-1.5.1 lib/ceph-ruby/xattr_enumerator.rb