class DatabaseBackup

Constants

BACKUP_DIR

Attributes

max_num_of_backups[RW]

Public Class Methods

new(database_backup_adapter, max_num_of_backups: 10) click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 11
def initialize(database_backup_adapter, max_num_of_backups: 10)
  @database_backup_adapter = database_backup_adapter
  @max_num_of_backups = max_num_of_backups
  @rotate_frequency = nil
end

Public Instance Methods

backups() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 45
def backups
  Dir.glob(File.join(backup_path, '*'))
end
cleanup() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 49
def cleanup
  # hourly - keep for 24 hours
  sh "find #{storage_path}/backup.hourly/ -mmin +1440 -exec rm -rv {} \\;"
  # daily - keep for 14 days
  sh "find #{storage_path}/backup.daily/ -mtime +14 -exec rm -rv {} \\;"
  # weekly - keep for 60 days
  sh "find #{storage_path}/backup.weekly/ -mtime +60 -exec rm -rv {} \\;"
  # monthly - keep for 300 days
  sh "find #{storage_path}/backup.monthly/ -mtime +300 -exec rm -rv {} \\;"
end
create() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 17
def create
  FileUtils.mkdir_p backup_path
  @latest_backup_file = create_backup
  remove_symlink_to_old_backup
  create_symlink_to_new_backup
  delete_oldest_backup
  compress_old_backups
  @latest_backup_file
end
create_rotated(frequency) click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 27
def create_rotated(frequency)
  @rotate_frequency = frequency
  create
  cleanup
end
restore(path) click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 33
def restore(path)
  @database_backup_adapter.restore path
end
restore_most_recent() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 37
def restore_most_recent
  @database_backup_adapter.restore symlink_file
end

Private Instance Methods

backup_path() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 94
def backup_path
  if @rotate_frequency
    rotated_backup_path(@rotate_frequency)
  else
    storage_path
  end
end
compress_old_backups() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 82
def compress_old_backups
  old_backups.each do |backup_filename|
    next if backup_filename =~ /.dump.gz/
    sh "gzip #{backup_filename}"
  end
end
create_backup() click to toggle source

Procedural Methods

# File lib/jefferies_tube/database_backup.rb, line 63
def create_backup
  backup_filename = "#{Time.now.strftime('%Y%m%d%H%M%S')}.dump"
  latest_backup_file = File.join backup_path, backup_filename
  @database_backup_adapter.create_backup latest_backup_file
  latest_backup_file
end
delete_oldest_backup() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 78
def delete_oldest_backup
  File.delete(old_backups.first) if old_backups.count >= max_num_of_backups
end
old_backups() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 121
def old_backups
  backups.sort.reject { |r|
    r == @latest_backup_file || r == symlink_file
  }
end
root_dir() click to toggle source

Helper Methods

# File lib/jefferies_tube/database_backup.rb, line 90
def root_dir
  Rails.root
end
rotated_backup_path(frequency = Frequency::DAILY) click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 106
def rotated_backup_path(frequency = Frequency::DAILY)
  storage = File.join(root_dir, BACKUP_DIR)
  now = Time.now
  if now.day == 1
    storage = File.join(storage, 'backup.monthly')
  elsif now.wday == 0
    storage = File.join(storage, 'backup.weekly')
  elsif frequency == Frequency::DAILY || now.hour == 0
    storage = File.join(storage, 'backup.daily')
  elsif frequency == Frequency::HOURLY
    storage = File.join(storage, 'backup.hourly')
  end
  storage
end
sh(cmd) click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 127
def sh(cmd)
  `#{cmd}`
end
storage_path() click to toggle source
# File lib/jefferies_tube/database_backup.rb, line 102
def storage_path
  File.join(root_dir, BACKUP_DIR)
end