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.empty?

  backup = database.backups[index.to_i]

  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)
  names = databases.map do |db|
    db.name
  end
  info "Listing database backups for #{names.join(', ')}"

  backups = databases.map{ |db| db.backups }.flatten

  info "#{backups.size} backup(s) found"

  backups.each_with_index do |backup_set, i|
    info "#{i}:#{backup_set.database_name} #{backup_set.normalized_name}"
  end

  backups
end

Instance Method Details

#<=>(o) ⇒ Object



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

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



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

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
# File 'lib/ey_backup/backup_set.rb', line 78

def download!
  @remote_filenames = []
  @keys.each do |key|
    info "Downloading #{key} to #{@database.base_path}"
    remote_filename = File.join(@database.base_path, normalize(key))
    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



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

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



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

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



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

def remove_joined_file!
  FileUtils.rm(@filename)
end

#remove_split_files!Object



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

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

#rm!Object



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

def rm!
  remove_split_files!
  remove_joined_file!
end

#split!(split_size) ⇒ Object



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

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

#timestampObject



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

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