Class: Dbviewer::Database::MetadataManager

Inherits:
Object
  • Object
show all
Defined in:
lib/dbviewer/database/metadata_manager.rb

Overview

MetadataManager handles retrieving and managing table structure information

Instance Method Summary collapse

Constructor Details

#initialize(connection, cache_manager) ⇒ MetadataManager

Initialize with a connection and cache manager

Parameters:

  • connection (ActiveRecord::ConnectionAdapters::AbstractAdapter)

    Database connection

  • cache_manager (Dbviewer::Database::CacheManager)

    Cache manager instance



8
9
10
11
# File 'lib/dbviewer/database/metadata_manager.rb', line 8

def initialize(connection, cache_manager)
  @connection = connection
  @cache_manager = cache_manager
end

Instance Method Details

#column_exists?(table_name, column_name) ⇒ Boolean

Check if a column exists in a table

Parameters:

  • table_name (String)

    Name of the table

  • column_name (String)

    Name of the column

Returns:

  • (Boolean)

    true if column exists, false otherwise



73
74
75
76
# File 'lib/dbviewer/database/metadata_manager.rb', line 73

def column_exists?(table_name, column_name)
  columns = table_columns(table_name)
  columns.any? { |col| col[:name].to_s == column_name.to_s }
end

#fetch_foreign_keys(table_name) ⇒ Array<Hash>

Get foreign keys

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (Array<Hash>)

    List of foreign keys with details



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/dbviewer/database/metadata_manager.rb', line 94

def fetch_foreign_keys(table_name)
  @connection.foreign_keys(table_name).map do |fk|
    {
      name: fk.name,
      from_table: fk.from_table,
      to_table: fk.to_table,
      column: fk.column,
      primary_key: fk.primary_key
    }
  end
end

#fetch_indexes(table_name) ⇒ Array<Hash>

Get table indexes

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (Array<Hash>)

    List of indexes with details



81
82
83
84
85
86
87
88
89
# File 'lib/dbviewer/database/metadata_manager.rb', line 81

def fetch_indexes(table_name)
  @connection.indexes(table_name).map do |index|
    {
      name: index.name,
      columns: index.columns,
      unique: index.unique
    }
  end
end

#fetch_reverse_foreign_keys(table_name) ⇒ Array<Hash>

Get reverse foreign keys (tables that reference this table)

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (Array<Hash>)

    List of reverse foreign keys with details



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/dbviewer/database/metadata_manager.rb', line 109

def fetch_reverse_foreign_keys(table_name)
  tables
    .reject { |other_table| other_table == table_name }
    .flat_map do |other_table|
      @connection.foreign_keys(other_table)
        .select { |fk| fk.to_table == table_name }
        .map do |fk|
          {
            name: fk.name,
            from_table: fk.from_table,
            to_table: fk.to_table,
            column: fk.column,
            primary_key: fk.primary_key,
            relationship_type: "has_many"
          }
        end
    end
end

#primary_key(table_name) ⇒ String?

Get the primary key of a table

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (String, nil)

    Primary key column name or nil if not found



62
63
64
65
66
67
# File 'lib/dbviewer/database/metadata_manager.rb', line 62

def primary_key(table_name)
  @connection.primary_key(table_name)
rescue => e
  Rails.logger.error("[DBViewer] Error retrieving primary key for table #{table_name}: #{e.message}")
  nil
end

#table_columns(table_name) ⇒ Array<Hash>

Get column information for a table

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (Array<Hash>)

    List of column details



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/dbviewer/database/metadata_manager.rb', line 22

def table_columns(table_name)
  cached_columns = @cache_manager.get_columns(table_name)
  return cached_columns if cached_columns

  columns = @connection.columns(table_name).map do |column|
    {
      name: column.name,
      type: column.type,
      null: column.null,
      default: column.default,
      primary: column.name == primary_key(table_name)
    }
  end

  # Cache the result
  @cache_manager.store_columns(table_name, columns)
  columns
end

#table_metadata(table_name) ⇒ Hash

Get detailed metadata about a table

Parameters:

  • table_name (String)

    Name of the table

Returns:

  • (Hash)

    Table metadata



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/dbviewer/database/metadata_manager.rb', line 44

def (table_name)
   = @cache_manager.(table_name)
  return  if 

   = {
    primary_key: primary_key(table_name),
    indexes: fetch_indexes(table_name),
    foreign_keys: fetch_foreign_keys(table_name),
    reverse_foreign_keys: fetch_reverse_foreign_keys(table_name)
  }

  @cache_manager.(table_name, )
  
end

#tablesArray<String>

Get all tables in the database

Returns:

  • (Array<String>)

    List of table names



15
16
17
# File 'lib/dbviewer/database/metadata_manager.rb', line 15

def tables
  @connection.tables.sort
end