Module: DatabaseConnectionHelpers
- Included in:
- Databases::Management, StoryTeller::Persistence
- Defined in:
- lib/story_teller/database.rb
Overview
The DatabaseConnectionHelpers module
Constant Summary collapse
- DefaultConnectionOptions =
{ loggerLevel: 'OFF' }.freeze
- DefaultConnectionPoolSize =
4- DefaultConnectionValidationTimeoutSeconds =
240- URLTemplate =
'%<scheme>s://%<host>s%<colon>s%<port>s'.freeze
- KeyValueTemplate =
'%<key>s=%<value>s'.freeze
- EmptyString =
''.freeze
- AmpersandString =
'&'.freeze
- ColonString =
':'.freeze
- ForwardSlashString =
'/'.freeze
- QuestionMarkString =
'?'.freeze
- JavaPattern =
/java/i.freeze
- DatabaseOrRoleDoesNotExistPattern =
rubocop: enable Metrics/AbcSize rubocop: enable Metrics/CyclomaticComplexity rubocop: enable Metrics/MethodLength rubocop: enable Metrics/PerceivedComplexity
/(database|role) ".*" does not exist/.freeze
Class Method Summary collapse
Instance Method Summary collapse
-
#assemble_url ⇒ Object
Previously: url = “#adapter://#host/#database?user=#username” url << “&password=#password” unless password.nil? || password.empty? url << “&loggerLevel=OFF” rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/MethodLength rubocop: disable Metrics/PerceivedComplexity.
-
#connect(database = config.fetch('database', nil), url = assemble_url, connection_options = {}) ⇒ Object
rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength.
-
#sanitize_url(url) ⇒ Object
rubocop: enable Metrics/AbcSize rubocop: enable Metrics/MethodLength.
Class Method Details
.connection_attempts ⇒ Object
144 145 146 |
# File 'lib/story_teller/database.rb', line 144 def self.connection_attempts @connection_attempts end |
.increment_connection_attempts ⇒ Object
148 149 150 |
# File 'lib/story_teller/database.rb', line 148 def self.increment_connection_attempts @connection_attempts += 1 end |
Instance Method Details
#assemble_url ⇒ Object
Previously: url = “#adapter://#host/#database?user=#username” url << “&password=#password” unless password.nil? || password.empty? url << “&loggerLevel=OFF” rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/MethodLength rubocop: disable Metrics/PerceivedComplexity
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/story_teller/database.rb', line 160 def assemble_url adapter = config.fetch('adapter') adapter.gsub!(/^postgres/, 'jdbc:postgresql') if JavaPattern.match?(RUBY_PLATFORM) host = config.fetch('host', nil) port = config.fetch('port', nil) colon = port.nil? ? EmptyString : ColonString database = config.fetch('database', nil) username = config.fetch('username', nil) password = config.fetch('password', nil) parameters = DefaultConnectionOptions.dup parameters.merge!(user: username) unless username.nil? parameters.merge!(password: password) unless password.nil? || password.empty? parameter_values = parameters.map { |key, value| format(KeyValueTemplate, key: key, value: value) } query = parameter_values.join(AmpersandString) url = [format(URLTemplate, scheme: adapter, host: host, colon: colon, port: port)] url << database unless database.nil? || database.empty? url = [url.join(ForwardSlashString)] url << query unless query.nil? || query.empty? url.join(QuestionMarkString) end |
#connect(database = config.fetch('database', nil), url = assemble_url, connection_options = {}) ⇒ Object
rubocop: disable Metrics/AbcSize rubocop: disable Metrics/MethodLength
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/story_teller/database.rb', line 189 def connect(database = config.fetch('database', nil), url = assemble_url, = {}) log.debug "Connecting to database #{sanitize_url(url)}" if defined? log DatabaseConnectionHelpers.increment_connection_attempts [:max_connections] = config.fetch('pool', DefaultConnectionPoolSize) connection = Sequel.connect(url, **) connection.extension(:connection_validator) connection.pool.connection_validation_timeout = DefaultConnectionValidationTimeoutSeconds connection.test_connection log.debug "Connected to database #{database}" if defined? log Sequel::Model.require_valid_table = false Sequel::Model.db = connection rescue Sequel::DatabaseConnectionError => e raise if e.cause.is_a?(PG::ConnectionBad) && DatabaseOrRoleDoesNotExistPattern.match?(e.cause.to_s) = e..gsub(/Java::OrgPostgresqlUtil::PSQLException: /, '') = "Error connecting to database: #{}" log.error abort rescue Sequel::AdapterNotFound => e = "Adapter not found: #{e.}" log.error abort rescue StandardError => e = "Unexpected error connecting to database: #{e.}" log.error , e abort end |
#sanitize_url(url) ⇒ Object
rubocop: enable Metrics/AbcSize rubocop: enable Metrics/MethodLength
218 219 220 |
# File 'lib/story_teller/database.rb', line 218 def sanitize_url(url) url.gsub(/&?(password|loggerLevel)=[^&]+&?/, '').gsub(/\?$/, '') end |