WIP: greenplum support #1668
|
@ -199,15 +199,16 @@ func regDrvsNDialects() bool {
|
||||||
getDriver func() Driver
|
getDriver func() Driver
|
||||||
getDialect func() Dialect
|
getDialect func() Dialect
|
||||||
}{
|
}{
|
||||||
"mssql": {"mssql", func() Driver { return &odbcDriver{} }, func() Dialect { return &mssql{} }},
|
"mssql": {"mssql", func() Driver { return &odbcDriver{"mssql"} }, func() Dialect { return &mssql{} }},
|
||||||
"odbc": {"mssql", func() Driver { return &odbcDriver{} }, func() Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
|
"odbc": {"mssql", func() Driver { return &odbcDriver{"odbc"} }, func() Dialect { return &mssql{} }}, // !nashtsai! TODO change this when supporting MS Access
|
||||||
"mysql": {"mysql", func() Driver { return &mysqlDriver{} }, func() Dialect { return &mysql{} }},
|
"mysql": {"mysql", func() Driver { return &mysqlDriver{} }, func() Dialect { return &mysql{} }},
|
||||||
"mymysql": {"mysql", func() Driver { return &mymysqlDriver{} }, func() Dialect { return &mysql{} }},
|
"mymysql": {"mysql", func() Driver { return &mymysqlDriver{} }, func() Dialect { return &mysql{} }},
|
||||||
"postgres": {"postgres", func() Driver { return &pqDriver{} }, func() Dialect { return &postgres{} }},
|
"postgres": {"postgres", func() Driver { return &pqDriver{"postgres"} }, func() Dialect { return &postgres{} }},
|
||||||
"pgx": {"postgres", func() Driver { return &pqDriverPgx{} }, func() Dialect { return &postgres{} }},
|
"pgx": {"postgres", func() Driver { return &pqDriverPgx{} }, func() Dialect { return &postgres{} }},
|
||||||
"sqlite3": {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }},
|
"sqlite3": {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }},
|
||||||
"oci8": {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }},
|
"oci8": {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }},
|
||||||
"goracle": {"oracle", func() Driver { return &goracleDriver{} }, func() Dialect { return &oracle{} }},
|
"goracle": {"oracle", func() Driver { return &goracleDriver{} }, func() Dialect { return &oracle{} }},
|
||||||
|
"greenplum": {schemas.GREENPLUM, func() Driver { return &pqDriver{"postgres"} }, func() Dialect { return &greenplum{} }},
|
||||||
}
|
}
|
||||||
|
|
||||||
for driverName, v := range providedDrvsNDialects {
|
for driverName, v := range providedDrvsNDialects {
|
||||||
|
|
|
@ -8,7 +8,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Driver represents a driver interface
|
||||||
type Driver interface {
|
type Driver interface {
|
||||||
|
Name() string
|
||||||
Parse(string, string) (*URI, error)
|
Parse(string, string) (*URI, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,6 +18,7 @@ var (
|
||||||
drivers = map[string]Driver{}
|
drivers = map[string]Driver{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// RegisterDriver register a driver
|
||||||
func RegisterDriver(driverName string, driver Driver) {
|
func RegisterDriver(driverName string, driver Driver) {
|
||||||
if driver == nil {
|
if driver == nil {
|
||||||
panic("core: Register driver is nil")
|
panic("core: Register driver is nil")
|
||||||
|
|
64
dialects/green_plum.go
Normal file
64
dialects/green_plum.go
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
// Copyright 2020 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 (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"xorm.io/xorm/schemas"
|
||||||
|
)
|
||||||
|
|
||||||
|
type greenplum struct {
|
||||||
|
postgres
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (db *greenplum) CreateTableSQL(table *schemas.Table, tableName string) ([]string, bool) {
|
||||||
|
var sql string
|
||||||
|
sql = "CREATE TABLE IF NOT EXISTS "
|
||||||
|
if tableName == "" {
|
||||||
|
tableName = table.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
quoter := db.Quoter()
|
||||||
|
sql += quoter.Quote(tableName)
|
||||||
|
sql += " ("
|
||||||
|
|
||||||
|
if len(table.ColumnsSeq()) > 0 {
|
||||||
|
var uniqueCols []string
|
||||||
|
pkList := table.PrimaryKeys
|
||||||
|
|
||||||
|
for _, colName := range table.ColumnsSeq() {
|
||||||
|
col := table.GetColumn(colName)
|
||||||
|
s, _ := ColumnString(db, col, col.IsPrimaryKey && len(pkList) == 1)
|
||||||
|
sql += s
|
||||||
|
sql = strings.TrimSpace(sql)
|
||||||
|
sql += ", "
|
||||||
|
|
||||||
|
for _, v := range col.Indexes {
|
||||||
|
if v == schemas.UniqueType {
|
||||||
|
uniqueCols = append(uniqueCols, colName)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(pkList) > 1 {
|
||||||
|
sql += "PRIMARY KEY ( "
|
||||||
|
sql += quoter.Join(pkList, ",")
|
||||||
|
sql += " ), "
|
||||||
|
}
|
||||||
|
|
||||||
|
sql = sql[:len(sql)-2]
|
||||||
|
|
||||||
|
if len(uniqueCols) > 0 {
|
||||||
|
sql += fmt.Sprintf(" distributed by (%s)", strings.Join(uniqueCols, ","))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql += ")"
|
||||||
|
|
||||||
|
return []string{sql}, true
|
||||||
|
}
|
|
@ -531,6 +531,11 @@ func (db *mssql) Filters() []Filter {
|
||||||
}
|
}
|
||||||
|
|
||||||
type odbcDriver struct {
|
type odbcDriver struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *odbcDriver) Name() string {
|
||||||
|
return p.name
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *odbcDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (p *odbcDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
|
|
|
@ -573,6 +573,10 @@ func (db *mysql) Filters() []Filter {
|
||||||
type mymysqlDriver struct {
|
type mymysqlDriver struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *mymysqlDriver) Name() string {
|
||||||
|
return "mymysql"
|
||||||
|
}
|
||||||
|
|
||||||
func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
uri := &URI{DBType: schemas.MYSQL}
|
uri := &URI{DBType: schemas.MYSQL}
|
||||||
|
|
||||||
|
@ -625,6 +629,10 @@ func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
type mysqlDriver struct {
|
type mysqlDriver struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *mysqlDriver) Name() string {
|
||||||
|
return "mysql"
|
||||||
|
}
|
||||||
|
|
||||||
func (p *mysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (p *mysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
dsnPattern := regexp.MustCompile(
|
dsnPattern := regexp.MustCompile(
|
||||||
`^(?:(?P<user>.*?)(?::(?P<passwd>.*))?@)?` + // [user[:password]@]
|
`^(?:(?P<user>.*?)(?::(?P<passwd>.*))?@)?` + // [user[:password]@]
|
||||||
|
|
|
@ -805,6 +805,10 @@ func (db *oracle) Filters() []Filter {
|
||||||
type goracleDriver struct {
|
type goracleDriver struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *goracleDriver) Name() string {
|
||||||
|
return "goracle"
|
||||||
|
}
|
||||||
|
|
||||||
func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
db := &URI{DBType: schemas.ORACLE}
|
db := &URI{DBType: schemas.ORACLE}
|
||||||
dsnPattern := regexp.MustCompile(
|
dsnPattern := regexp.MustCompile(
|
||||||
|
@ -831,6 +835,10 @@ func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error)
|
||||||
type oci8Driver struct {
|
type oci8Driver struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *oci8Driver) Name() string {
|
||||||
|
return "oci8"
|
||||||
|
}
|
||||||
|
|
||||||
// dataSourceName=user/password@ipv4:port/dbname
|
// dataSourceName=user/password@ipv4:port/dbname
|
||||||
// dataSourceName=user/password@[ipv6]:port/dbname
|
// dataSourceName=user/password@[ipv6]:port/dbname
|
||||||
func (p *oci8Driver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (p *oci8Driver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
|
|
|
@ -1241,6 +1241,11 @@ func (db *postgres) Filters() []Filter {
|
||||||
}
|
}
|
||||||
|
|
||||||
type pqDriver struct {
|
type pqDriver struct {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *pqDriver) Name() string {
|
||||||
|
return d.name
|
||||||
}
|
}
|
||||||
|
|
||||||
type values map[string]string
|
type values map[string]string
|
||||||
|
@ -1321,6 +1326,10 @@ type pqDriverPgx struct {
|
||||||
pqDriver
|
pqDriver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pgx *pqDriverPgx) Name() string {
|
||||||
|
return "pgx"
|
||||||
|
}
|
||||||
|
|
||||||
func (pgx *pqDriverPgx) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (pgx *pqDriverPgx) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
// Remove the leading characters for driver to work
|
// Remove the leading characters for driver to work
|
||||||
if len(dataSourceName) >= 9 && dataSourceName[0] == 0 {
|
if len(dataSourceName) >= 9 && dataSourceName[0] == 0 {
|
||||||
|
|
|
@ -520,6 +520,10 @@ func (db *sqlite3) Filters() []Filter {
|
||||||
type sqlite3Driver struct {
|
type sqlite3Driver struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *sqlite3Driver) Name() string {
|
||||||
|
return "sqlite3"
|
||||||
|
}
|
||||||
|
|
||||||
func (p *sqlite3Driver) Parse(driverName, dataSourceName string) (*URI, error) {
|
func (p *sqlite3Driver) Parse(driverName, dataSourceName string) (*URI, error) {
|
||||||
if strings.Contains(dataSourceName, "?") {
|
if strings.Contains(dataSourceName, "?") {
|
||||||
dataSourceName = dataSourceName[:strings.Index(dataSourceName, "?")]
|
dataSourceName = dataSourceName[:strings.Index(dataSourceName, "?")]
|
||||||
|
|
|
@ -19,6 +19,7 @@ const (
|
||||||
MYSQL DBType = "mysql"
|
MYSQL DBType = "mysql"
|
||||||
MSSQL DBType = "mssql"
|
MSSQL DBType = "mssql"
|
||||||
ORACLE DBType = "oracle"
|
ORACLE DBType = "oracle"
|
||||||
|
GREENPLUM DBType = "greenplum"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SQLType represents SQL types
|
// SQLType represents SQL types
|
||||||
|
|
Loading…
Reference in New Issue
Block a user