Generic dialect support. (MySQL and Postgres)
This commit is contained in:
parent
043a0dc4c0
commit
5dda5e1e11
27 changed files with 440 additions and 92 deletions
97
dialects.go
Normal file
97
dialects.go
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
package jet
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
var (
|
||||
PostgreSQL = newPostgresDialect()
|
||||
MySql = newMySQLDialect()
|
||||
)
|
||||
|
||||
func newPostgresDialect() Dialect {
|
||||
postgresDialect := newDialect("PostgreSQL", "postgres")
|
||||
|
||||
postgresDialect.OperatorOverrides["IS DISTINCT FROM"] = postgresIS_DISTINCT_FROM
|
||||
postgresDialect.CastOverride = postgresCAST
|
||||
postgresDialect.AliasQuoteChar = '"'
|
||||
postgresDialect.IdentifierQuoteChar = '"'
|
||||
postgresDialect.ArgumentPlaceholder = func(ord int) string {
|
||||
return "$" + strconv.Itoa(ord)
|
||||
}
|
||||
|
||||
return postgresDialect
|
||||
}
|
||||
|
||||
func newMySQLDialect() Dialect {
|
||||
mySQLDialect := newDialect("MySQL", "mysql")
|
||||
|
||||
mySQLDialect.AliasQuoteChar = '"'
|
||||
mySQLDialect.IdentifierQuoteChar = '"'
|
||||
mySQLDialect.ArgumentPlaceholder = func(int) string {
|
||||
return "?"
|
||||
}
|
||||
|
||||
return mySQLDialect
|
||||
}
|
||||
|
||||
type Dialect struct {
|
||||
Name string
|
||||
PackageName string
|
||||
OperatorOverrides map[string]serializeOverride
|
||||
CastOverride castOverride
|
||||
AliasQuoteChar byte
|
||||
IdentifierQuoteChar byte
|
||||
ArgumentPlaceholder queryPlaceholderFunc
|
||||
}
|
||||
|
||||
func (d *Dialect) serializeOverride(operator string) serializeOverride {
|
||||
return d.OperatorOverrides[operator]
|
||||
}
|
||||
|
||||
type queryPlaceholderFunc func(ord int) string
|
||||
|
||||
func newDialect(name, packageName string) Dialect {
|
||||
newDialect := Dialect{
|
||||
Name: name,
|
||||
PackageName: packageName,
|
||||
}
|
||||
newDialect.OperatorOverrides = make(map[string]serializeOverride)
|
||||
|
||||
return newDialect
|
||||
}
|
||||
|
||||
func postgresIS_DISTINCT_FROM(expressions ...Expression) serializeFunc {
|
||||
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
|
||||
if len(expressions) != 2 {
|
||||
return errors.New("Invalid number of expressions for operator")
|
||||
}
|
||||
if err := expressions[0].serialize(statement, out); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
out.writeString("IS DISTINCT FROM")
|
||||
|
||||
if err := expressions[1].serialize(statement, out); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func postgresCAST(expression Expression, castType string) serializeFunc {
|
||||
return func(statement statementType, out *sqlBuilder, options ...serializeOption) error {
|
||||
if err := expression.serialize(statement, out, options...); err != nil {
|
||||
return err
|
||||
}
|
||||
out.writeString("::" + castType)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
type serializeFunc func(statement statementType, out *sqlBuilder, options ...serializeOption) error
|
||||
type serializeOverride func(expressions ...Expression) serializeFunc
|
||||
|
||||
type castOverride func(expression Expression, castType string) serializeFunc
|
||||
Loading…
Add table
Add a link
Reference in a new issue