/
introspection.go
82 lines (68 loc) · 1.98 KB
/
introspection.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package migrations
import (
_ "embed"
"github.com/lib/pq"
"github.com/teamkeel/keel/db"
)
func getConstraints(database db.Database) ([]*ConstraintRow, error) {
rows := []*ConstraintRow{}
return rows, database.GetDB().Raw(constraintsQuery).Scan(&rows).Error
}
func getTriggers(database db.Database) ([]*TriggerRow, error) {
rows := []*TriggerRow{}
return rows, database.GetDB().Raw(triggersQuery).Scan(&rows).Error
}
func getColumns(database db.Database) ([]*ColumnRow, error) {
rows := []*ColumnRow{}
return rows, database.GetDB().Raw(columnsQuery).Scan(&rows).Error
}
var (
//go:embed columns.sql
columnsQuery string
//go:embed constraints.sql
constraintsQuery string
//go:embed triggers.sql
triggersQuery string
)
type ColumnRow struct {
TableName string `json:"table_name"`
ColumnName string `json:"column_name"`
ColumnNum int `json:"column_num"`
NotNull bool `json:"not_null"`
HasDefault bool `json:"has_default"`
DefaultValue string `json:"default_value"`
DataType string `json:"data_type"`
}
type ConstraintRow struct {
TableName string
ConstraintName string
ConstrainedColumns pq.Int64Array `gorm:"type:smallint[]"`
// If a foreign key constraint the referenced table and columns
OnTable *string
ReferencesColumns pq.Int64Array `gorm:"type:smallint[]"`
// c = check constraint,
// f = foreign key constraint,
// p = primary key constraint,
// u = unique constraint,
// t = constraint trigger,
// x = exclusion constraint
ConstraintType string
// a = no action
// r = restrict
// c = cascade
// n = set null
// d = set default
OnDelete string
}
type TriggerRow struct {
// company_employee_delete
TriggerName string `json:"trigger_name"`
// e.g. company_employee
TableName string `json:"table_name"`
// e.g. DELETE
StatementType string `json:"statement_type"`
// e.g. EXECUTE PROCEDURE process_audit()
ActionStatement string `json:"action_statement"`
// e.g. AFTER
ActionTiming string `json:"action_timing"`
}