summaryrefslogtreecommitdiffstats
path: root/vendor/xorm.io/xorm/dialects/dialect.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/xorm.io/xorm/dialects/dialect.go')
-rw-r--r--vendor/xorm.io/xorm/dialects/dialect.go330
1 files changed, 0 insertions, 330 deletions
diff --git a/vendor/xorm.io/xorm/dialects/dialect.go b/vendor/xorm.io/xorm/dialects/dialect.go
deleted file mode 100644
index c234f19a2f..0000000000
--- a/vendor/xorm.io/xorm/dialects/dialect.go
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2019 The Xorm Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package dialects
-
-import (
- "context"
- "fmt"
- "strings"
- "time"
-
- "xorm.io/xorm/core"
- "xorm.io/xorm/schemas"
-)
-
-// URI represents an uri to visit database
-type URI struct {
- DBType schemas.DBType
- Proto string
- Host string
- Port string
- DBName string
- User string
- Passwd string
- Charset string
- Laddr string
- Raddr string
- Timeout time.Duration
- Schema string
-}
-
-// SetSchema set schema
-func (uri *URI) SetSchema(schema string) {
- // hack me
- if uri.DBType == schemas.POSTGRES {
- uri.Schema = strings.TrimSpace(schema)
- }
-}
-
-// Dialect represents a kind of database
-type Dialect interface {
- Init(*URI) error
- URI() *URI
- Version(ctx context.Context, queryer core.Queryer) (*schemas.Version, error)
-
- SQLType(*schemas.Column) string
- Alias(string) string // return what a sql type's alias of
- ColumnTypeKind(string) int // database column type kind
-
- IsReserved(string) bool
- Quoter() schemas.Quoter
- SetQuotePolicy(quotePolicy QuotePolicy)
-
- AutoIncrStr() string
-
- GetIndexes(queryer core.Queryer, ctx context.Context, tableName string) (map[string]*schemas.Index, error)
- IndexCheckSQL(tableName, idxName string) (string, []interface{})
- CreateIndexSQL(tableName string, index *schemas.Index) string
- DropIndexSQL(tableName string, index *schemas.Index) string
-
- GetTables(queryer core.Queryer, ctx context.Context) ([]*schemas.Table, error)
- IsTableExist(queryer core.Queryer, ctx context.Context, tableName string) (bool, error)
- CreateTableSQL(table *schemas.Table, tableName string) ([]string, bool)
- DropTableSQL(tableName string) (string, bool)
-
- GetColumns(queryer core.Queryer, ctx context.Context, tableName string) ([]string, map[string]*schemas.Column, error)
- IsColumnExist(queryer core.Queryer, ctx context.Context, tableName string, colName string) (bool, error)
- AddColumnSQL(tableName string, col *schemas.Column) string
- ModifyColumnSQL(tableName string, col *schemas.Column) string
-
- ForUpdateSQL(query string) string
-
- Filters() []Filter
- SetParams(params map[string]string)
-}
-
-// Base represents a basic dialect and all real dialects could embed this struct
-type Base struct {
- dialect Dialect
- uri *URI
- quoter schemas.Quoter
-}
-
-// Alias returned col itself
-func (db *Base) Alias(col string) string {
- return col
-}
-
-// Quoter returns the current database Quoter
-func (db *Base) Quoter() schemas.Quoter {
- return db.quoter
-}
-
-// Init initialize the dialect
-func (db *Base) Init(dialect Dialect, uri *URI) error {
- db.dialect, db.uri = dialect, uri
- return nil
-}
-
-// URI returns the uri of database
-func (db *Base) URI() *URI {
- return db.uri
-}
-
-// CreateTableSQL implements Dialect
-func (db *Base) CreateTableSQL(table *schemas.Table, tableName string) ([]string, bool) {
- if tableName == "" {
- tableName = table.Name
- }
-
- quoter := db.dialect.Quoter()
- var b strings.Builder
- b.WriteString("CREATE TABLE IF NOT EXISTS ")
- quoter.QuoteTo(&b, tableName)
- b.WriteString(" (")
-
- for i, colName := range table.ColumnsSeq() {
- col := table.GetColumn(colName)
- s, _ := ColumnString(db.dialect, col, col.IsPrimaryKey && len(table.PrimaryKeys) == 1)
- b.WriteString(s)
-
- if i != len(table.ColumnsSeq())-1 {
- b.WriteString(", ")
- }
- }
-
- if len(table.PrimaryKeys) > 1 {
- b.WriteString(", PRIMARY KEY (")
- b.WriteString(quoter.Join(table.PrimaryKeys, ","))
- b.WriteString(")")
- }
-
- b.WriteString(")")
-
- return []string{b.String()}, false
-}
-
-// DropTableSQL returns drop table SQL
-func (db *Base) DropTableSQL(tableName string) (string, bool) {
- quote := db.dialect.Quoter().Quote
- return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)), true
-}
-
-// HasRecords returns true if the SQL has records returned
-func (db *Base) HasRecords(queryer core.Queryer, ctx context.Context, query string, args ...interface{}) (bool, error) {
- rows, err := queryer.QueryContext(ctx, query, args...)
- if err != nil {
- return false, err
- }
- defer rows.Close()
-
- if rows.Next() {
- return true, nil
- }
- return false, rows.Err()
-}
-
-// IsColumnExist returns true if the column of the table exist
-func (db *Base) IsColumnExist(queryer core.Queryer, ctx context.Context, tableName, colName string) (bool, error) {
- quote := db.dialect.Quoter().Quote
- query := fmt.Sprintf(
- "SELECT %v FROM %v.%v WHERE %v = ? AND %v = ? AND %v = ?",
- quote("COLUMN_NAME"),
- quote("INFORMATION_SCHEMA"),
- quote("COLUMNS"),
- quote("TABLE_SCHEMA"),
- quote("TABLE_NAME"),
- quote("COLUMN_NAME"),
- )
- return db.HasRecords(queryer, ctx, query, db.uri.DBName, tableName, colName)
-}
-
-// AddColumnSQL returns a SQL to add a column
-func (db *Base) AddColumnSQL(tableName string, col *schemas.Column) string {
- s, _ := ColumnString(db.dialect, col, true)
- return fmt.Sprintf("ALTER TABLE %v ADD %v", db.dialect.Quoter().Quote(tableName), s)
-}
-
-// CreateIndexSQL returns a SQL to create index
-func (db *Base) CreateIndexSQL(tableName string, index *schemas.Index) string {
- quoter := db.dialect.Quoter()
- var unique string
- var idxName string
- if index.Type == schemas.UniqueType {
- unique = " UNIQUE"
- }
- idxName = index.XName(tableName)
- return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v)", unique,
- quoter.Quote(idxName), quoter.Quote(tableName),
- quoter.Join(index.Cols, ","))
-}
-
-// DropIndexSQL returns a SQL to drop index
-func (db *Base) DropIndexSQL(tableName string, index *schemas.Index) string {
- quote := db.dialect.Quoter().Quote
- var name string
- if index.IsRegular {
- name = index.XName(tableName)
- } else {
- name = index.Name
- }
- return fmt.Sprintf("DROP INDEX %v ON %s", quote(name), quote(tableName))
-}
-
-// ModifyColumnSQL returns a SQL to modify SQL
-func (db *Base) ModifyColumnSQL(tableName string, col *schemas.Column) string {
- s, _ := ColumnString(db.dialect, col, false)
- return fmt.Sprintf("ALTER TABLE %s MODIFY COLUMN %s", db.quoter.Quote(tableName), s)
-}
-
-// ForUpdateSQL returns for updateSQL
-func (db *Base) ForUpdateSQL(query string) string {
- return query + " FOR UPDATE"
-}
-
-// SetParams set params
-func (db *Base) SetParams(params map[string]string) {
-}
-
-var (
- dialects = map[string]func() Dialect{}
-)
-
-// RegisterDialect register database dialect
-func RegisterDialect(dbName schemas.DBType, dialectFunc func() Dialect) {
- if dialectFunc == nil {
- panic("core: Register dialect is nil")
- }
- dialects[strings.ToLower(string(dbName))] = dialectFunc // !nashtsai! allow override dialect
-}
-
-// QueryDialect query if registered database dialect
-func QueryDialect(dbName schemas.DBType) Dialect {
- if d, ok := dialects[strings.ToLower(string(dbName))]; ok {
- return d()
- }
- return nil
-}
-
-func regDrvsNDialects() bool {
- providedDrvsNDialects := map[string]struct {
- dbType schemas.DBType
- getDriver func() Driver
- getDialect func() Dialect
- }{
- "mssql": {"mssql", func() Driver { return &odbcDriver{} }, func() Dialect { return &mssql{} }},
- "odbc": {"mssql", func() Driver { return &odbcDriver{} }, func() Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
- "mysql": {"mysql", func() Driver { return &mysqlDriver{} }, func() Dialect { return &mysql{} }},
- "mymysql": {"mysql", func() Driver { return &mymysqlDriver{} }, func() Dialect { return &mysql{} }},
- "postgres": {"postgres", func() Driver { return &pqDriver{} }, func() Dialect { return &postgres{} }},
- "pgx": {"postgres", func() Driver { return &pqDriverPgx{} }, func() Dialect { return &postgres{} }},
- "sqlite3": {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }},
- "sqlite": {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }},
- "oci8": {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }},
- "godror": {"oracle", func() Driver { return &godrorDriver{} }, func() Dialect { return &oracle{} }},
- }
-
- for driverName, v := range providedDrvsNDialects {
- if driver := QueryDriver(driverName); driver == nil {
- RegisterDriver(driverName, v.getDriver())
- RegisterDialect(v.dbType, v.getDialect)
- }
- }
- return true
-}
-
-func init() {
- regDrvsNDialects()
-}
-
-// ColumnString generate column description string according dialect
-func ColumnString(dialect Dialect, col *schemas.Column, includePrimaryKey bool) (string, error) {
- bd := strings.Builder{}
-
- if err := dialect.Quoter().QuoteTo(&bd, col.Name); err != nil {
- return "", err
- }
-
- if err := bd.WriteByte(' '); err != nil {
- return "", err
- }
-
- if _, err := bd.WriteString(dialect.SQLType(col)); err != nil {
- return "", err
- }
-
- if err := bd.WriteByte(' '); err != nil {
- return "", err
- }
-
- if includePrimaryKey && col.IsPrimaryKey {
- if _, err := bd.WriteString("PRIMARY KEY "); err != nil {
- return "", err
- }
-
- if col.IsAutoIncrement {
- if _, err := bd.WriteString(dialect.AutoIncrStr()); err != nil {
- return "", err
- }
- if err := bd.WriteByte(' '); err != nil {
- return "", err
- }
- }
- }
-
- if col.Default != "" {
- if _, err := bd.WriteString("DEFAULT "); err != nil {
- return "", err
- }
- if _, err := bd.WriteString(col.Default); err != nil {
- return "", err
- }
- if err := bd.WriteByte(' '); err != nil {
- return "", err
- }
- }
-
- if col.Nullable {
- if _, err := bd.WriteString("NULL "); err != nil {
- return "", err
- }
- } else {
- if _, err := bd.WriteString("NOT NULL "); err != nil {
- return "", err
- }
- }
-
- return bd.String(), nil
-}