Module: DB

Includes:
PactBroker::Logging
Defined in:
lib/db.rb

Class Method Summary collapse

Methods included from PactBroker::Logging

included, #log_error, #log_with_tag

Class Method Details

.configuration_for_env(env) ⇒ Object



59
60
61
62
63
# File 'lib/db.rb', line 59

def self.configuration_for_env env
  database_yml = PactBroker.project_root.join("config","database.yml")
  config = YAML.load(ERB.new(File.read(database_yml)).result)
  config.fetch(env).fetch(ENV.fetch("DATABASE_ADAPTER","default"))
end

.connect(db_credentials) ⇒ Object

Sequel by default does not test connections in its connection pool before handing them to a client. To enable connection testing you need to load the “connection_validator” extension like below. The connection validator extension is configurable, by default it only checks connections once per hour:

sequel.rubyforge.org/rdoc-plugins/files/lib/sequel/extensions/connection_validator_rb.html

Because most of our applications so far are accessed infrequently, there is very little overhead in checking each connection when it is requested. This takes care of stale connections.

A gotcha here is that it is not enough to enable the “connection_validator” extension, we also need to specify that we want to use the threaded connection pool, as noted in the documentation for the extension.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/db.rb', line 28

def self.connect db_credentials
  # Keep this conifiguration in sync with lib/pact_broker/app.rb#configure_database_connection
  Sequel.datetime_class = DateTime
  if ENV["DEBUG"] == "true" && ENV["PACT_BROKER_SQL_LOG_LEVEL"] != "none"
    logger = Logger.new($stdout)
  end
  if db_credentials.fetch("adapter") == "sqlite"
    FileUtils.mkdir_p(File.dirname(db_credentials.fetch("database")))
  end
  con = Sequel.connect(db_credentials.merge(:logger => logger, :pool_class => Sequel::ThreadedConnectionPool, :encoding => "utf8"))
  con.extension(:connection_validator)
  con.extension(:pagination)
  con.extension(:statement_timeout)
  con.extend_datasets do
    # rubocop: disable Lint/NestedMethodDefinition
    def any?
      !empty?
    end
    # rubocop: enable Lint/NestedMethodDefinition
  end
  con.timezone = :utc
  con.run("SET sql_mode='STRICT_TRANS_TABLES';") if db_credentials[:adapter].to_s =~ /mysql/
  con
end

.connection_for_env(env) ⇒ Object



53
54
55
56
57
# File 'lib/db.rb', line 53

def self.connection_for_env env
  config = configuration_for_env(env)
  logger.info "Connecting to #{env} #{config['adapter']} database #{config['database']}."
  connect config
end

.health_checkObject



79
80
81
82
83
# File 'lib/db.rb', line 79

def self.health_check
  PACT_BROKER_DB.synchronize do |c|
    PACT_BROKER_DB.valid_connection? c
  end
end

.mysql?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/db.rb', line 69

def self.mysql?
  !!(PACT_BROKER_DB.adapter_scheme.to_s =~ /mysql/)
end

.postgres?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/db.rb', line 73

def self.postgres?
  !!(PACT_BROKER_DB.adapter_scheme.to_s == "postgres")
end

.sqlite?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/db.rb', line 65

def self.sqlite?
  !!(PACT_BROKER_DB.adapter_scheme.to_s =~ /sqlite/)
end