class Backup::Splitter

Attributes

chunk_size[R]
package[R]
suffix_length[R]

Public Class Methods

new(model, chunk_size, suffix_length) click to toggle source
# File lib/backup/splitter.rb, line 9
def initialize(model, chunk_size, suffix_length)
  @package = model.package
  @chunk_size = chunk_size
  @suffix_length = suffix_length
end

Public Instance Methods

split_with() { |split_command| ... } click to toggle source

This is called as part of the procedure used to build the final backup package file(s). It yields it’s portion of the command line for this procedure, which will split the data being piped into it into multiple files, based on the @chunk_size, using a suffix length as specified by @suffix_length. Once the packaging procedure is complete, it will return and @package.chunk_suffixes will be set based on the resulting files.

# File lib/backup/splitter.rb, line 23
def split_with
  Logger.info "Splitter configured with a chunk size of #{ chunk_size }MB " +
              "and suffix length of #{ suffix_length }."
  yield split_command
  after_packaging
end

Private Instance Methods

after_packaging() click to toggle source

Finds the resulting files from the packaging procedure and stores an Array of suffixes used in @package.chunk_suffixes. If the @chunk_size was never reached and only one file was written, that file will be suffixed with ‘-aa’ (or -a; -aaa; etc depending upon suffix_length). In which case, it will simply remove the suffix from the filename.

# File lib/backup/splitter.rb, line 48
def after_packaging
  suffixes = chunk_suffixes
  first_suffix = 'a' * suffix_length
  if suffixes == [first_suffix]
    FileUtils.mv(
      File.join(Config.tmp_path, "#{ package.basename }-#{ first_suffix }"),
      File.join(Config.tmp_path, package.basename)
    )
  else
    package.chunk_suffixes = suffixes
  end
end
chunk_suffixes() click to toggle source

Returns an array of suffixes for each chunk, in alphabetical order. For example: [aa, ab, ac, ad, ae] or [aaa, aab, aac aad]

# File lib/backup/splitter.rb, line 64
def chunk_suffixes
  chunks.map {|chunk| File.extname(chunk).split('-').last }.sort
end
chunks() click to toggle source

Returns an array of full paths to the backup chunks. Chunks are sorted in alphabetical order.

# File lib/backup/splitter.rb, line 71
def chunks
  Dir[File.join(Config.tmp_path, package.basename + '-*')].sort
end
split_command() click to toggle source

The ‘split` command reads from $stdin and will store it’s output in multiple files, based on @chunk_size and @suffix_length, using the full path to the final @package.basename, plus a ‘-’ separator as the ‘prefix`.

# File lib/backup/splitter.rb, line 36
def split_command
  "#{ utility(:split) } -a #{ suffix_length } -b #{ chunk_size }m - " +
      "'#{ File.join(Config.tmp_path, package.basename + '-') }'"
end