Class: EY::Backup::BackupSet

Inherits:
Object
  • Object
show all
Extended by:
Logging
Includes:
Logging
Defined in:
lib/ey_backup/backup_set.rb

Constant Summary collapse

MULTIPART_EXTENSION =
/\.part\d+/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(database, basename, filename, keys) ⇒ BackupSet

Returns a new instance of BackupSet.



13
14
15
16
17
18
# File 'lib/ey_backup/backup_set.rb', line 13

def initialize(database, basename, filename, keys)
  @database = database
  @basename = basename
  @filename = filename
  @keys     = keys
end

Instance Attribute Details

#basenameObject (readonly)

Returns the value of attribute basename.



19
20
21
# File 'lib/ey_backup/backup_set.rb', line 19

def basename
  @basename
end

Class Method Details

.download(database, index) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/ey_backup/backup_set.rb', line 50

def self.download(database, index)
  fatal "You didn't specify a database name: e.g. 1:rails_production" if database.nil? || index < 0

  backup = database.backups[index]

  fatal "No backup found for database #{database}: requested index: #{index}" unless backup

  backup.download!

  backup
end

.from(database, basename, file) ⇒ Object



9
10
11
# File 'lib/ey_backup/backup_set.rb', line 9

def self.from(database, basename, file)
  new(database, basename, file, nil)
end

.list(databases) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/ey_backup/backup_set.rb', line 33

def self.list(databases)
  all_backups = []
  databases.each do |db|
    backups = db.backups
    all_backups << backups
    puts "Listing database backups for #{db.name}"
    puts "#{backups.size} backup(s) found"
    
    backups.each_with_index do |backup_set, i|
      puts "#{i}:#{backup_set.database_name} #{backup_set.normalized_name}"
    end
    puts  # just some extra whitespace
  end
    
  all_backups.flatten
end

Instance Method Details

#<=>(o) ⇒ Object



131
132
133
# File 'lib/ey_backup/backup_set.rb', line 131

def <=>(o)
  self.timestamp <=> o.timestamp
end

#cleanupObject



25
26
27
28
29
30
31
# File 'lib/ey_backup/backup_set.rb', line 25

def cleanup
  say "Cleanup for #{database_name}"
  @database.backups[0...(-@database.keep)].each do |backup|
    say "Deleting: #{backup.basename}"
    backup.delete!
  end
end

#database_nameObject



21
22
23
# File 'lib/ey_backup/backup_set.rb', line 21

def database_name
  @database.name
end

#delete!Object



94
95
96
97
98
# File 'lib/ey_backup/backup_set.rb', line 94

def delete!
  @keys.each do |key|
    @database.bucket_minder.remove_object(key)
  end
end

#download!Object



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/ey_backup/backup_set.rb', line 78

def download!
  @remote_filenames = []
  @keys.each do |key|
    remote_filename = File.join(@database.base_path, normalize(key))
    puts "Filename: #{remote_filename}"
    info "Downloading #{key} to #{@database.base_path}"
    File.open(remote_filename, 'wb') do |f|
      @database.bucket_minder.stream(key) do |chunk, remaining_size, total_size|
        f.write(chunk)
      end
    end

    @remote_filenames << remote_filename
  end
end

#join!Object



119
120
121
# File 'lib/ey_backup/backup_set.rb', line 119

def join!
  @filename = Splitter.load(@remote_filenames)
end

#load!Object



70
71
72
# File 'lib/ey_backup/backup_set.rb', line 70

def load!
  @database.engine.load(@database.name, @filename)
end

#normalize(o) ⇒ Object



123
124
125
# File 'lib/ey_backup/backup_set.rb', line 123

def normalize(o)
  o.gsub(/^.*?\//, '')
end

#normalized_nameObject



66
67
68
# File 'lib/ey_backup/backup_set.rb', line 66

def normalized_name
  normalize(@basename)
end

#partsObject



62
63
64
# File 'lib/ey_backup/backup_set.rb', line 62

def parts
  @keys.size
end

#remove_joined_file!Object



106
107
108
# File 'lib/ey_backup/backup_set.rb', line 106

def remove_joined_file!
  FileUtils.rm(@filename)
end

#remove_split_files!Object



100
101
102
103
104
# File 'lib/ey_backup/backup_set.rb', line 100

def remove_split_files!
  (@remote_filenames - [@filename]).each do |filename|
    FileUtils.rm(filename)
  end
end

#rm!Object



110
111
112
113
# File 'lib/ey_backup/backup_set.rb', line 110

def rm!
  remove_split_files!
  remove_joined_file!
end

#split!(split_size) ⇒ Object



115
116
117
# File 'lib/ey_backup/backup_set.rb', line 115

def split!(split_size)
  @remote_filenames = Splitter.dump(@filename, split_size)
end

#timestampObject



127
128
129
# File 'lib/ey_backup/backup_set.rb', line 127

def timestamp
  @basename[/(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})/, 1]
end

#upload!Object



74
75
76
# File 'lib/ey_backup/backup_set.rb', line 74

def upload!
  @database.start_upload(@remote_filenames)
end