Class: RailsLens::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_lens/connection.rb

Class Method Summary collapse

Class Method Details

.adapter_for(model_class, connection = nil) ⇒ Object



6
7
8
9
10
11
12
# File 'lib/rails_lens/connection.rb', line 6

def adapter_for(model_class, connection = nil)
  conn = connection || model_class.connection
  adapter_name = detect_adapter_name(conn)

  adapter_class = resolve_adapter_class(adapter_name)
  adapter_class.new(conn, model_class.table_name)
end

.connection_config(model_class) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/rails_lens/connection.rb', line 60

def connection_config(model_class)
  if model_class.connection.respond_to?(:connection_db_config)
    # Rails 6.1+
    model_class.connection.connection_db_config.configuration_hash
  elsif model_class.connection.respond_to?(:config)
    # Older Rails versions
    model_class.connection.config
  else
    {}
  end
end

.connection_info(model_class) ⇒ Object



86
87
88
89
90
91
92
93
# File 'lib/rails_lens/connection.rb', line 86

def connection_info(model_class)
  {
    adapter: detect_adapter_name(model_class.connection),
    database: connection_config(model_class)[:database],
    version: database_version(model_class),
    encoding: connection_encoding(model_class)
  }
end

.database_dialect(connection) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rails_lens/connection.rb', line 43

def database_dialect(connection)
  adapter_name = connection.adapter_name

  case adapter_name.downcase
  when /postgresql/, /postgis/
    'PostgreSQL'
  when /mysql2/, /trilogy/
    'MySQL'
  when /mariadb/
    'MariaDB'
  when /sqlite/
    'SQLite'
  else
    adapter_name # Return the original adapter name if unknown
  end
end

.database_version(model_class) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/rails_lens/connection.rb', line 72

def database_version(model_class)
  connection = model_class.connection

  if connection.respond_to?(:database_version)
    connection.database_version
  elsif connection.respond_to?(:version)
    connection.version
  else
    'Unknown'
  end
rescue StandardError
  'Unknown'
end

.detect_adapter_name(connection) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/rails_lens/connection.rb', line 27

def detect_adapter_name(connection)
  adapter_name = connection.adapter_name.downcase

  case adapter_name
  when /postgresql/, /postgis/
    :postgresql
  when /mysql2/, /trilogy/, /mariadb/
    :mysql
  when /sqlite/
    :sqlite3
  else
    # Return the normalized adapter name for constantize
    adapter_name.to_sym
  end
end

.resolve_adapter_class(adapter_name) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/rails_lens/connection.rb', line 14

def resolve_adapter_class(adapter_name)
  class_name = "RailsLens::Schema::Adapters::#{adapter_name.to_s.camelize}"

  begin
    class_name.constantize
  rescue NameError
    raise RailsLens::UnsupportedAdapterError,
          "Unsupported database adapter: #{adapter_name}. " \
          "Expected adapter class #{class_name} not found. " \
          'Consider adding support by creating the adapter class.'
  end
end

.supports_check_constraints?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/rails_lens/connection.rb', line 99

def supports_check_constraints?(model_class)
  model_class.connection.supports_check_constraints?
end

.supports_comments?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/rails_lens/connection.rb', line 103

def supports_comments?(model_class)
  model_class.connection.supports_comments?
end

.supports_foreign_keys?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


95
96
97
# File 'lib/rails_lens/connection.rb', line 95

def supports_foreign_keys?(model_class)
  model_class.connection.supports_foreign_keys?
end

.supports_materialized_views?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/rails_lens/connection.rb', line 111

def supports_materialized_views?(model_class)
  model_class.connection.supports_materialized_views?
end

.supports_views?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/rails_lens/connection.rb', line 107

def supports_views?(model_class)
  model_class.connection.supports_views?
end