...
1 package goqu
2
3 import (
4 "strings"
5 "sync"
6
7 "github.com/doug-martin/goqu/v9/exp"
8 "github.com/doug-martin/goqu/v9/internal/sb"
9 "github.com/doug-martin/goqu/v9/sqlgen"
10 )
11
12 type (
13 SQLDialectOptions = sqlgen.SQLDialectOptions
14
15
16 SQLDialect interface {
17 Dialect() string
18 ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses)
19 ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses)
20 ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses)
21 ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses)
22 ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses)
23 }
24
25
26
27 sqlDialect struct {
28 dialect string
29 dialectOptions *SQLDialectOptions
30 selectGen sqlgen.SelectSQLGenerator
31 updateGen sqlgen.UpdateSQLGenerator
32 insertGen sqlgen.InsertSQLGenerator
33 deleteGen sqlgen.DeleteSQLGenerator
34 truncateGen sqlgen.TruncateSQLGenerator
35 }
36 )
37
38 var (
39 dialects = make(map[string]SQLDialect)
40 DefaultDialectOptions = sqlgen.DefaultDialectOptions
41 dialectsMu sync.RWMutex
42 )
43
44 func init() {
45 RegisterDialect("default", DefaultDialectOptions())
46 }
47
48 func RegisterDialect(name string, do *SQLDialectOptions) {
49 dialectsMu.Lock()
50 defer dialectsMu.Unlock()
51 lowerName := strings.ToLower(name)
52 dialects[lowerName] = newDialect(lowerName, do)
53 }
54
55 func DeregisterDialect(name string) {
56 dialectsMu.Lock()
57 defer dialectsMu.Unlock()
58 delete(dialects, strings.ToLower(name))
59 }
60
61 func GetDialect(name string) SQLDialect {
62 name = strings.ToLower(name)
63 if d, ok := dialects[name]; ok {
64 return d
65 }
66 return newDialect("default", DefaultDialectOptions())
67 }
68
69 func newDialect(dialect string, do *SQLDialectOptions) SQLDialect {
70 return &sqlDialect{
71 dialect: dialect,
72 dialectOptions: do,
73 selectGen: sqlgen.NewSelectSQLGenerator(dialect, do),
74 updateGen: sqlgen.NewUpdateSQLGenerator(dialect, do),
75 insertGen: sqlgen.NewInsertSQLGenerator(dialect, do),
76 deleteGen: sqlgen.NewDeleteSQLGenerator(dialect, do),
77 truncateGen: sqlgen.NewTruncateSQLGenerator(dialect, do),
78 }
79 }
80
81 func (d *sqlDialect) Dialect() string {
82 return d.dialect
83 }
84
85 func (d *sqlDialect) ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses) {
86 d.selectGen.Generate(b, clauses)
87 }
88
89 func (d *sqlDialect) ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses) {
90 d.updateGen.Generate(b, clauses)
91 }
92
93 func (d *sqlDialect) ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses) {
94 d.insertGen.Generate(b, clauses)
95 }
96
97 func (d *sqlDialect) ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses) {
98 d.deleteGen.Generate(b, clauses)
99 }
100
101 func (d *sqlDialect) ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses) {
102 d.truncateGen.Generate(b, clauses)
103 }
104
View as plain text