class TDP::DAO

Data access object that encapsulates all operations with the database.

Attributes

db[R]

Sequel::Database object

Public Class Methods

new(db) click to toggle source

Creates a new DAO object.

db

must be either of:

  • instance of Sequel::Database class

  • database URL that can be passed to Sequel.connect()

# File lib/tdp.rb, line 216
def initialize(db)
  case db
  when Sequel::Database
    @db = db
  when String
    @db = Sequel.connect(db)
  else
    raise ArgumentError, "Invalid argument #{db} of class #{db.class}"
  end
end

Public Instance Methods

applied_patches() click to toggle source

Fetches the information about applied patches and returns it as { name => signature } hash.

# File lib/tdp.rb, line 245
def applied_patches
  result = {}
  @db[:tdp_patch].select(:name, :signature).each do |row|
    result[row[:name]] = row[:signature]
  end
  result
end
applied_patches_inverse() click to toggle source

Fetches the information about applied patches and returns it as { signature => name } hash.

# File lib/tdp.rb, line 257
def applied_patches_inverse
  result = {}
  applied_patches.each do |name, sig|
    raise DuplicateError, [result[sig], name] if result.key?(sig)
    result[sig] = name
  end
  result
end
apply(patch) click to toggle source

Applies a patch (a Patch object).

# File lib/tdp.rb, line 277
def apply(patch)
  @db << patch.content
  register(patch)
rescue Sequel::Error => ex
  raise Sequel::Error,
        "Failed to apply patch #{patch.full_filename}: #{ex}"
end
bootstrap() click to toggle source

Initializes database tables for keeping track of applied patches.

# File lib/tdp.rb, line 231
def bootstrap
  return if @db.table_exists?(:tdp_patch)
  @db << %{
    CREATE TABLE tdp_patch(
    name VARCHAR PRIMARY KEY
    , signature VARCHAR NOT NULL
    )
  }
end
erase() click to toggle source

Erases all data about applied patches.

# File lib/tdp.rb, line 303
def erase
  @db[:tdp_patch].delete
end
patch_signature(name) click to toggle source

Looks up a signature of a patch by its name.

# File lib/tdp.rb, line 269
def patch_signature(name)
  row = @db[:tdp_patch].select(:signature).where(name: name).first
  row.nil? ? nil : row[:signature]
end
register(patch) click to toggle source

Registers a patch (a Patch object) as applied.

# File lib/tdp.rb, line 288
def register(patch)
  q = @db[:tdp_patch].where(name: patch.name)
  if q.empty?
    @db[:tdp_patch].insert(
      name: patch.name,
      signature: patch.signature
    )
  else
    q.update(signature: patch.signature)
  end
end
rename(old_name, new_name) click to toggle source

Renames a patch.

# File lib/tdp.rb, line 310
def rename(old_name, new_name)
  @db[:tdp_patch].where(name: old_name).update(name: new_name)
end