Class: EY::Backup::Splitter
- Inherits:
-
Object
- Object
- EY::Backup::Splitter
show all
- Includes:
- Logging, Spawner
- Defined in:
- lib/ey_backup/processors/splitter.rb
Constant Summary
collapse
- CHUNK_SIZE =
1024 * 64
- MAX_FILE_SIZE =
(4.5*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
|
# File 'lib/ey_backup/processors/splitter.rb', line 35
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
|
#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
55
56
57
|
# File 'lib/ey_backup/processors/splitter.rb', line 55
def part_number(file)
file[/\.part(\d+)/, 1].to_i
end
|
#sort(input_files) ⇒ Object
51
52
53
|
# File 'lib/ey_backup/processors/splitter.rb', line 51
def sort(input_files)
input_files.sort {|a,b| part_number(a) <=> part_number(b) }
end
|
#split(file, split_size) ⇒ Object
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/ey_backup/processors/splitter.rb', line 59
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
|