fork github.com/doug-martin
This commit is contained in:
+103
@@ -0,0 +1,103 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"git.fsdpf.net/go/db/v2/exp"
|
||||
"git.fsdpf.net/go/db/v2/internal/sb"
|
||||
"git.fsdpf.net/go/db/v2/sqlgen"
|
||||
)
|
||||
|
||||
type (
|
||||
SQLDialectOptions = sqlgen.SQLDialectOptions
|
||||
// An adapter interface to be used by a Dataset to generate SQL for a specific dialect.
|
||||
// See DefaultAdapter for a concrete implementation and examples.
|
||||
SQLDialect interface {
|
||||
Dialect() string
|
||||
ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses)
|
||||
ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses)
|
||||
ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses)
|
||||
ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses)
|
||||
ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses)
|
||||
}
|
||||
// The default adapter. This class should be used when building a new adapter. When creating a new adapter you can
|
||||
// either override methods, or more typically update default values.
|
||||
// See (github.com/doug-martin/goqu/dialect/postgres)
|
||||
sqlDialect struct {
|
||||
dialect string
|
||||
dialectOptions *SQLDialectOptions
|
||||
selectGen sqlgen.SelectSQLGenerator
|
||||
updateGen sqlgen.UpdateSQLGenerator
|
||||
insertGen sqlgen.InsertSQLGenerator
|
||||
deleteGen sqlgen.DeleteSQLGenerator
|
||||
truncateGen sqlgen.TruncateSQLGenerator
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
dialects = make(map[string]SQLDialect)
|
||||
DefaultDialectOptions = sqlgen.DefaultDialectOptions
|
||||
dialectsMu sync.RWMutex
|
||||
)
|
||||
|
||||
func init() {
|
||||
RegisterDialect("default", DefaultDialectOptions())
|
||||
}
|
||||
|
||||
func RegisterDialect(name string, do *SQLDialectOptions) {
|
||||
dialectsMu.Lock()
|
||||
defer dialectsMu.Unlock()
|
||||
lowerName := strings.ToLower(name)
|
||||
dialects[lowerName] = newDialect(lowerName, do)
|
||||
}
|
||||
|
||||
func DeregisterDialect(name string) {
|
||||
dialectsMu.Lock()
|
||||
defer dialectsMu.Unlock()
|
||||
delete(dialects, strings.ToLower(name))
|
||||
}
|
||||
|
||||
func GetDialect(name string) SQLDialect {
|
||||
name = strings.ToLower(name)
|
||||
if d, ok := dialects[name]; ok {
|
||||
return d
|
||||
}
|
||||
return newDialect("default", DefaultDialectOptions())
|
||||
}
|
||||
|
||||
func newDialect(dialect string, do *SQLDialectOptions) SQLDialect {
|
||||
return &sqlDialect{
|
||||
dialect: dialect,
|
||||
dialectOptions: do,
|
||||
selectGen: sqlgen.NewSelectSQLGenerator(dialect, do),
|
||||
updateGen: sqlgen.NewUpdateSQLGenerator(dialect, do),
|
||||
insertGen: sqlgen.NewInsertSQLGenerator(dialect, do),
|
||||
deleteGen: sqlgen.NewDeleteSQLGenerator(dialect, do),
|
||||
truncateGen: sqlgen.NewTruncateSQLGenerator(dialect, do),
|
||||
}
|
||||
}
|
||||
|
||||
func (d *sqlDialect) Dialect() string {
|
||||
return d.dialect
|
||||
}
|
||||
|
||||
func (d *sqlDialect) ToSelectSQL(b sb.SQLBuilder, clauses exp.SelectClauses) {
|
||||
d.selectGen.Generate(b, clauses)
|
||||
}
|
||||
|
||||
func (d *sqlDialect) ToUpdateSQL(b sb.SQLBuilder, clauses exp.UpdateClauses) {
|
||||
d.updateGen.Generate(b, clauses)
|
||||
}
|
||||
|
||||
func (d *sqlDialect) ToInsertSQL(b sb.SQLBuilder, clauses exp.InsertClauses) {
|
||||
d.insertGen.Generate(b, clauses)
|
||||
}
|
||||
|
||||
func (d *sqlDialect) ToDeleteSQL(b sb.SQLBuilder, clauses exp.DeleteClauses) {
|
||||
d.deleteGen.Generate(b, clauses)
|
||||
}
|
||||
|
||||
func (d *sqlDialect) ToTruncateSQL(b sb.SQLBuilder, clauses exp.TruncateClauses) {
|
||||
d.truncateGen.Generate(b, clauses)
|
||||
}
|
||||
Reference in New Issue
Block a user