Sha256: a575ea79133d467286801c74968a93acf6852ff3f0e358a27ae077e5768f5f5c

Contents?: true

Size: 1.07 KB

Versions: 12

Compression:

Stored size: 1.07 KB

Contents

class FileReverseReader
  attr_reader :io, :step

  def initialize(io, step = 1024 * 1024 * 1)
    @io = io
    @step = step
  end

  def each_line(&block)
    io.seek(0, IO::SEEK_END)
    buf = ""
    loop do
      if reach_start_of_file?
        last_pos = io.pos
        io.seek(0, IO::SEEK_SET)
        buf.insert(0, io.read(last_pos))
        split_each_line(buf, &block)
        break
      end

      io.seek(-1 * step, IO::SEEK_CUR)
      buf.insert(0, io.read(step))
      io.seek(-1 * step, IO::SEEK_CUR)
      next if buf[$/].nil?
      gap = buf.index($/)
      buf.gsub!(/\A.*?\n/, "")
      split_each_line(buf, &block)
      buf = ""
      io.seek(gap, IO::SEEK_CUR)
    end
  end

  def tail(limit = 10)
    enum_for(:each_line).first(limit).reverse
  end

  def binary_file?
    sample = io.read(1024) || ""
    !sample.force_encoding('us-ascii').valid_encoding?
  ensure
    io.rewind
  end

  private

  def split_each_line(buf, &block)
    buf.split($/).reverse.each do |line|
      block.call(line)
    end
  end

  def reach_start_of_file?
    step >= io.pos
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
fluentd-ui-0.3.9 lib/file_reverse_reader.rb
fluentd-ui-0.3.8 lib/file_reverse_reader.rb
fluentd-ui-0.3.7 lib/file_reverse_reader.rb
fluentd-ui-0.3.6 lib/file_reverse_reader.rb
fluentd-ui-0.3.5 lib/file_reverse_reader.rb
fluentd-ui-0.3.3 lib/file_reverse_reader.rb
fluentd-ui-0.3.2 lib/file_reverse_reader.rb
fluentd-ui-0.3.1 lib/file_reverse_reader.rb
fluentd-ui-0.3.0 lib/file_reverse_reader.rb
fluentd-ui-0.2.0 lib/file_reverse_reader.rb
fluentd-ui-0.1.4 lib/file_reverse_reader.rb
fluentd-ui-0.1.3 lib/file_reverse_reader.rb