forked from xo/xo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sqlserver.go
95 lines (89 loc) · 2.77 KB
/
sqlserver.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
package loader
import (
"regexp"
"github.com/xo/xo/models"
xo "github.com/xo/xo/types"
)
func init() {
Register("sqlserver", Loader{
Mask: "@p%d",
Schema: models.SqlserverSchema,
Procs: models.SqlserverProcs,
ProcParams: models.SqlserverProcParams,
Tables: models.SqlserverTables,
TableColumns: models.SqlserverTableColumns,
TableSequences: models.SqlserverTableSequences,
TableForeignKeys: models.SqlserverTableForeignKeys,
TableIndexes: models.SqlserverTableIndexes,
IndexColumns: models.SqlserverIndexColumns,
ViewCreate: models.SqlserverViewCreate,
ViewDrop: models.SqlserverViewDrop,
ViewStrip: SqlserverViewStrip,
})
}
// SqlserverGoType parse a mssql type into a Go type based on the column
// definition.
func SqlserverGoType(d xo.Type, schema, itype, utype string) (string, string, error) {
var goType, zero string
switch d.Type {
case "tinyint", "bit":
goType, zero = "bool", "false"
if d.Nullable {
goType, zero = "sql.NullBool", "sql.NullBool{}"
}
case "char", "money", "nchar", "ntext", "nvarchar", "smallmoney", "text", "varchar":
goType, zero = "string", `""`
if d.Nullable {
goType, zero = "sql.NullString", "sql.NullString{}"
}
case "smallint":
goType, zero = "int16", "0"
if d.Nullable {
goType, zero = "sql.NullInt64", "sql.NullInt64{}"
}
case "int":
goType, zero = itype, "0"
if d.Nullable {
goType, zero = "sql.NullInt64", "sql.NullInt64{}"
}
case "bigint":
goType, zero = "int64", "0"
if d.Nullable {
goType, zero = "sql.NullInt64", "sql.NullInt64{}"
}
case "real":
goType, zero = "float32", "0.0"
if d.Nullable {
goType, zero = "sql.NullFloat64", "sql.NullFloat64{}"
}
case "numeric", "decimal", "float":
goType, zero = "float64", "0.0"
if d.Nullable {
goType, zero = "sql.NullFloat64", "sql.NullFloat64{}"
}
case "binary", "image", "varbinary", "xml":
goType, zero = "[]byte", "nil"
case "date", "time", "smalldatetime", "datetime", "datetime2", "datetimeoffset":
goType, zero = "time.Time", "time.Time{}"
if d.Nullable {
goType, zero = "sql.NullTime", "sql.NullTime{}"
}
default:
goType, zero = schemaType(d.Type, d.Nullable, schema)
}
return goType, zero, nil
}
// SqlserverViewStrip strips ORDER BY clauses from the passed query.
func SqlserverViewStrip(query, inspect []string) ([]string, []string, []string, error) {
// sqlserver cannot have an 'ORDER BY' clause in a CREATE VIEW
var res []string
for _, line := range inspect {
if orderByRE.MatchString(line) {
continue
}
res = append(res, line)
}
return query, res, make([]string, len(query)), nil
}
// orderByRE is a regexp matching ORDER by clauses in sqlserver queries.
var orderByRE = regexp.MustCompile(`(?i)^\s*ORDER\s+BY\s+`)