/
normalize.go
108 lines (95 loc) · 1.79 KB
/
normalize.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package schema
import (
"strings"
"golang.org/x/exp/slices"
)
func NormalizeType(s ColumnType) ColumnType {
m := strings.ToLower(string(s))
switch m {
case "int", "integer", "tinyint", "smallint", "mediumint":
return Int
case "int64", "bigint":
return Int64
case "boolean", "bool":
return Bool
case "real", "double", "float":
return Float
case "blob":
return Blob
case "text", "string", "clob":
return Text
case "date":
return Date
case "time":
return Time
case "datetime", "timestamp":
return Timestamp
case "uuid", "guid":
return UUID
default:
for _, prefix := range []string{
"character(",
"varchar(",
"nchar(",
"nvarchar(",
} {
if strings.HasPrefix(m, prefix) {
return Text
}
}
}
return s
}
func NormalizeDefault(c *Column) {
if !c.Nullable || c.Default == nil {
return
}
switch d := (c.Default).(type) {
case NULL:
c.Default = nil
case RawLiteral:
if strings.ToLower(string(d)) == "null" {
c.Default = nil
}
}
}
func NormalizeNames(t *Table, uppercase bool) {
norm := func(s string) string {
if uppercase {
return strings.ToUpper(s)
} else {
return strings.ToLower(s)
}
}
t.Name = norm(t.Name)
for _, c := range t.Columns {
c.Name = norm(c.Name)
}
for _, i := range t.Indices {
i.Name = norm(i.Name)
}
}
func compStrings(a, b string) int {
if a == b {
return 0
} else if a < b {
return -1
} else {
return +1
}
}
func SortColumns(t *Table) {
slices.SortStableFunc(t.Columns, func(a, b *Column) int {
return compStrings(a.Name, b.Name)
})
}
func SortIndices(t *Table) {
slices.SortStableFunc(t.Indices, func(a, b *Index) int {
return compStrings(a.Name, b.Name)
})
}
func SortTables(tt []*Table) {
slices.SortStableFunc(tt, func(a, b *Table) int {
return compStrings(a.Name, b.Name)
})
}