Module: Legion::Data::Connection

Defined in:
lib/legion/data/connection.rb

Constant Summary collapse

ADAPTERS =
%i[sqlite mysql2 postgres].freeze

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.sequelObject

Returns the value of attribute sequel.



11
12
13
# File 'lib/legion/data/connection.rb', line 11

def sequel
  @sequel
end

Class Method Details

.adapterObject



13
14
15
# File 'lib/legion/data/connection.rb', line 13

def adapter
  @adapter ||= Legion::Settings[:data][:adapter]&.to_sym || :sqlite
end

.connect_with_replicasObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/legion/data/connection.rb', line 45

def connect_with_replicas
  return unless adapter == :postgres

  replica_url  = Legion::Settings[:data][:read_replica_url]
  replica_list = Array(Legion::Settings[:data][:replicas]).dup

  replica_list.prepend(replica_url) if replica_url && !replica_url.empty?
  replica_list.uniq!
  replica_list.compact!

  return if replica_list.empty?

  @sequel.extension(:server_block)

  replica_list.each_with_index do |url, idx|
    @sequel.add_servers("read_#{idx}": url)
  end

  @replica_servers = replica_list.each_with_index.map { |_, idx| :"read_#{idx}" }
end

.creds_builder(final_creds = {}) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/legion/data/connection.rb', line 99

def creds_builder(final_creds = {})
  final_creds.merge! Legion::Data::Settings.creds(adapter)
  final_creds.merge! Legion::Settings[:data][:creds] if Legion::Settings[:data][:creds].is_a? Hash

  port = final_creds[:port]
  merge_tls_creds(final_creds, adapter: adapter, port: port)

  return final_creds if Legion::Settings[:vault].nil?

  if Legion::Settings[:vault][:connected] && ::Vault.sys.mounts.key?(:database)
    temp_vault_creds = Legion::Crypt.read('database/creds/legion')
    final_creds[:user] = temp_vault_creds[:username]
    final_creds[:password] = temp_vault_creds[:password]
  end

  final_creds
end

.merge_tls_creds(creds, adapter:, port:) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/legion/data/connection.rb', line 76

def merge_tls_creds(creds, adapter:, port:)
  return creds if adapter == :sqlite
  return creds unless defined?(Legion::Crypt::TLS)

  tls = Legion::Crypt::TLS.resolve(data_tls_settings, port: port)
  return creds unless tls[:enabled]

  case adapter
  when :postgres
    creds[:sslmode]     = tls[:verify] == :none ? 'require' : 'verify-full'
    creds[:sslrootcert] = tls[:ca] if tls[:ca]
    creds[:sslcert]     = tls[:cert] if tls[:cert]
    creds[:sslkey]      = tls[:key] if tls[:key]
  when :mysql2
    creds[:ssl_mode] = tls[:verify] == :none ? 'required' : 'verify_identity'
    creds[:sslca]    = tls[:ca] if tls[:ca]
    creds[:sslcert]  = tls[:cert] if tls[:cert]
    creds[:sslkey]   = tls[:key] if tls[:key]
  end

  creds
end

.read_serverObject



66
67
68
69
70
# File 'lib/legion/data/connection.rb', line 66

def read_server
  return :default if @replica_servers.nil? || @replica_servers.empty?

  :read_0
end

.replica_serversObject



72
73
74
# File 'lib/legion/data/connection.rb', line 72

def replica_servers
  @replica_servers || []
end

.setupObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/legion/data/connection.rb', line 17

def setup
  @sequel = if adapter == :sqlite
              ::Sequel.sqlite(sqlite_path)
            else
              begin
                ::Sequel.connect(adapter: adapter, **creds_builder)
              rescue StandardError => e
                raise unless dev_fallback?

                if defined?(Legion::Logging)
                  Legion::Logging.warn(
                    "Shared DB unreachable (#{e.message}), dev_mode fallback to SQLite"
                  )
                end
                @adapter = :sqlite
                ::Sequel.sqlite(sqlite_path)
              end
            end
  Legion::Settings[:data][:connected] = true
  configure_logging
  connect_with_replicas
end

.shutdownObject



40
41
42
43
# File 'lib/legion/data/connection.rb', line 40

def shutdown
  @sequel&.disconnect
  Legion::Settings[:data][:connected] = false
end