MCPcopy Create free account
hub / github.com/bytebase/bytebase / getForeignKeys

Function getForeignKeys

backend/plugin/db/redshift/sync.go:118–182  ·  view source on GitHub ↗
(txn *sql.Tx)

Source from the content-addressed store, hash-verified

116}
117
118func getForeignKeys(txn *sql.Tx) (map[db.TableKey][]*storepb.ForeignKeyMetadata, error) {
119 query := `
120 SELECT
121 n.nspname AS fk_schema,
122 quote_ident(fk_nsp.nspname) || '.' || quote_ident(fk_cls.relname) AS fk_table,
123 conname AS fk_name,
124 ref_nsp.nspname AS fk_ref_schema,
125 quote_ident(ref_nsp.nspname) || '.' || quote_ident(ref_cls.relname) AS fk_ref_table,
126 confdeltype AS delete_option,
127 confupdtype AS update_option,
128 confmatchtype AS match_option,
129 pg_get_constraintdef(c.oid) AS fk_def
130 FROM
131 pg_constraint c
132 JOIN pg_namespace n ON n.oid = c.connamespace
133 JOIN pg_class fk_cls ON fk_cls.oid = c.conrelid
134 JOIN pg_namespace fk_nsp ON fk_nsp.oid = fk_cls.relnamespace
135 JOIN pg_class ref_cls ON ref_cls.oid = c.confrelid
136 JOIN pg_namespace ref_nsp ON ref_nsp.oid = ref_cls.relnamespace
137 WHERE
138 n.nspname NOT IN('pg_catalog', 'information_schema')
139 AND c.contype = 'f'
140 ORDER BY fk_schema, fk_table, fk_name;
141 `
142 foreignKeysMap := make(map[db.TableKey][]*storepb.ForeignKeyMetadata)
143 rows, err := txn.Query(query)
144 if err != nil {
145 return nil, err
146 }
147 defer rows.Close()
148
149 for rows.Next() {
150 var fkMetadata storepb.ForeignKeyMetadata
151 var fkSchema, fkTable, fkDefinition string
152 if err := rows.Scan(
153 &fkSchema,
154 &fkTable,
155 &fkMetadata.Name,
156 &fkMetadata.ReferencedSchema,
157 &fkMetadata.ReferencedTable,
158 &fkMetadata.OnDelete,
159 &fkMetadata.OnUpdate,
160 &fkMetadata.MatchType,
161 &fkDefinition,
162 ); err != nil {
163 return nil, err
164 }
165
166 fkTable = formatTableNameFromRegclass(fkTable)
167 fkMetadata.ReferencedTable = formatTableNameFromRegclass(fkMetadata.ReferencedTable)
168 fkMetadata.OnDelete = convertForeignKeyActionCode(fkMetadata.OnDelete)
169 fkMetadata.OnUpdate = convertForeignKeyActionCode(fkMetadata.OnUpdate)
170 fkMetadata.MatchType = convertForeignKeyMatchType(fkMetadata.MatchType)
171
172 if fkMetadata.Columns, fkMetadata.ReferencedColumns, err = getForeignKeyColumnsAndReferencedColumns(fkDefinition); err != nil {
173 return nil, err
174 }
175 key := db.TableKey{Schema: fkSchema, Table: fkTable}

Callers 1

getTablesFunction · 0.70

Calls 8

ScanMethod · 0.80
QueryMethod · 0.65
CloseMethod · 0.65
NextMethod · 0.45

Tested by

no test coverage detected