class Tetrahedron::Database

Public Class Methods

connect() click to toggle source
# File lib/tetrahedron/database.rb, line 30
def self.connect
  configured!
  connected = self.class_variable_get(:@@provider).connect
  self.connection.loggers << Logger.new($stdout) if connected
  # Back our models with the new connection.
  model = self.class_variable_get(:@@application).const_get("Model")
  model.db = self.connection if connected
  connected
end
connected?() click to toggle source
# File lib/tetrahedron/database.rb, line 21
def self.connected?
  !self.connection.nil?
end
connection() click to toggle source
# File lib/tetrahedron/database.rb, line 25
def self.connection
  configured!
  self.class_variable_get(:@@provider).connection
end
disconnect() click to toggle source
# File lib/tetrahedron/database.rb, line 40
def self.disconnect
  configured!
  # TODO(mtwilliams): Verify that this is thread-safe.
  model = self.class_variable_get(:@@application).const_get("Model")
  model.db = Sequel.mock
  self.class_variable_get(:@@provider).disconnect
end
install(application) click to toggle source
Calls superclass method
# File lib/tetrahedron/database.rb, line 52
def self.install(application)
  super(application)

  # TODO(mtwilliams): Refactor out this horrid mess.

  # We can't build an inheritence heirarchy.
  # See https://groups.google.com/d/msg/sequel-talk/OG5ti9JAJIE/p1iqO57cwqwJ.
  application.class_eval("Model = Class.new(Sequel::Model);")
  model = application.const_get("Model")

  # Stop Sequel from bitching when we users subclass models before the
  # database connection is established.
  model.db = Sequel.mock

  # Back descendents.
  model.send :define_singleton_method, :db= do |db|
    super(db)
    # All the way down, boys.
    self.descendents.each do |descendent|
      descendent.db = db
    end
  end

  # Custom names are cool, m'kay.
  application.send :define_singleton_method, :Model do |source|
    anonymous_model_class = model::ANONYMOUS_MODEL_CLASSES_MUTEX.synchronize do
                              model::ANONYMOUS_MODEL_CLASSES[source]
                            end
    unless anonymous_model_class
      anonymous_model_class = if source.is_a?(Sequel::Database)
                                Class.new(model).db = source
                              else
                                Class.new(model).set_dataset(source)
                              end
      model::ANONYMOUS_MODEL_CLASSES_MUTEX.synchronize do
        model::ANONYMOUS_MODEL_CLASSES[source] = anonymous_model_class
      end
    end
    anonymous_model_class
  end
end
migrate(migrations) click to toggle source
# File lib/tetrahedron/database.rb, line 48
def self.migrate(migrations)
  Sequel::IntegerMigrator.run(self.connection, migrations)
end