Class: EY::Backup::Splitter

Inherits:
Object
  • Object
show all
Includes:
Logging, Spawner
Defined in:
lib/ey_backup/processors/splitter.rb

Constant Summary collapse

CHUNK_SIZE =
1024 * 64
MAX_FILE_SIZE =

4.9TB

(4.9*1024*1024*1024*1024).to_i

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Spawner

#ioify, #run, #runs?, #spawn

Class Method Details

.dump(file, split_size) ⇒ Object



10
11
12
13
# File 'lib/ey_backup/processors/splitter.rb', line 10

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

.load(files) ⇒ Object



15
16
17
# File 'lib/ey_backup/processors/splitter.rb', line 15

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

Instance Method Details

#dump(file, split_size) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/ey_backup/processors/splitter.rb', line 27

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

#join(input_files) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/ey_backup/processors/splitter.rb', line 35

def join(input_files)
  filename = input_files.first.sub(/\.part\d+$/, '')
  
  verbose "Filename: #{filename}"

  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

#load(files) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/ey_backup/processors/splitter.rb', line 19

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

#part_number(file) ⇒ Object



57
58
59
# File 'lib/ey_backup/processors/splitter.rb', line 57

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

#sort(input_files) ⇒ Object



53
54
55
# File 'lib/ey_backup/processors/splitter.rb', line 53

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

#split(file, split_size) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/ey_backup/processors/splitter.rb', line 61

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