Sha256: 8fa8a0a3186c77c081b33ada180a5cb66ef333edcbbd0605be65afcb4f229ab1

Contents?: true

Size: 1.82 KB

Versions: 24

Compression:

Stored size: 1.82 KB

Contents

module EY
  module Backup
    class Splitter
      include Spawner
      include Logging

      CHUNK_SIZE = 1024 * 64
      MAX_FILE_SIZE = (4.5*1024*1024*1024).to_i #4.5GB

      def self.dump(file, split_size)
        split_size ||= MAX_FILE_SIZE
        new.dump(file, split_size)
      end

      def self.load(files)
        new.load(files)
      end

      def load(files)
        if files.size > 1
          join(files)
        else
          files.first
        end
      end

      def dump(file, split_size)
        if File.size(file) >= split_size
          split(file, split_size)
        else
          [file]
        end
      end

      def join(input_files)
        filename = input_files.first.sub(/\.part\d+$/, '')

        File.open(filename, 'w') do |output|
          sort(input_files).each do |input|
            File.open(input, 'r') do |i|
              while chunk = i.read(CHUNK_SIZE)
                output << chunk
              end
            end
          end
        end

        filename
      end

      def sort(input_files)
        input_files.sort {|a,b| part_number(a) <=> part_number(b) }
      end

      def part_number(file)
        file[/\.part(\d+)/, 1].to_i
      end

      def split(file, split_size)
        total_size, part = 0, 0
        files = []
        File.open(file, 'r') do |i|
          until total_size == File.size(file)
            part += 1
            part_size = 0
            filename = "#{file}.part#{part}"
            File.open(filename, 'w') do |o|
              while part_size < split_size && (chunk = i.read([split_size - part_size, CHUNK_SIZE].min))
                part_size += chunk.size
                o << chunk
              end
            end

            total_size += part_size

            files << filename
          end
        end

        files
      end
    end
  end
end

Version data entries

24 entries across 24 versions & 1 rubygems

Version Path
ey_cloud_server-1.4.51 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.50 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.49 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.47a lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.47 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.46 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.45 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.44 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.43 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.42 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.41 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.40 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.39 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.37 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.37.ruby19 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.36 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.34 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.33 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.32 lib/ey_backup/processors/splitter.rb
ey_cloud_server-1.4.31 lib/ey_backup/processors/splitter.rb