From f25d0eedf2b7aa38220c3ad4551d7eb8f940f389 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 24 Apr 2020 22:45:31 +0800 Subject: [PATCH 1/2] add greenplum support --- dialects/green_plum.go | 64 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 dialects/green_plum.go diff --git a/dialects/green_plum.go b/dialects/green_plum.go new file mode 100644 index 00000000..88b3bbb9 --- /dev/null +++ b/dialects/green_plum.go @@ -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 +} \ No newline at end of file -- 2.40.1 From eca45c6f242d786e97263b557d95eca498fa802f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 28 Apr 2020 16:16:24 +0800 Subject: [PATCH 2/2] Support greenplum --- dialects/dialect.go | 19 ++++++++++--------- dialects/driver.go | 3 +++ dialects/mssql.go | 5 +++++ dialects/mysql.go | 8 ++++++++ dialects/oracle.go | 8 ++++++++ dialects/postgres.go | 9 +++++++++ dialects/sqlite3.go | 4 ++++ schemas/type.go | 1 + 8 files changed, 48 insertions(+), 9 deletions(-) diff --git a/dialects/dialect.go b/dialects/dialect.go index dc96f73a..e0e37dd6 100644 --- a/dialects/dialect.go +++ b/dialects/dialect.go @@ -199,15 +199,16 @@ func regDrvsNDialects() bool { 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{} }}, - "oci8": {"oracle", func() Driver { return &oci8Driver{} }, func() Dialect { return &oracle{} }}, - "goracle": {"oracle", func() Driver { return &goracleDriver{} }, func() Dialect { return &oracle{} }}, + "mssql": {"mssql", func() Driver { return &odbcDriver{"mssql"} }, func() Dialect { return &mssql{} }}, + "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{} }}, + "mymysql": {"mysql", func() Driver { return &mymysqlDriver{} }, func() Dialect { return &mysql{} }}, + "postgres": {"postgres", func() Driver { return &pqDriver{"postgres"} }, func() Dialect { return &postgres{} }}, + "pgx": {"postgres", func() Driver { return &pqDriverPgx{} }, func() Dialect { return &postgres{} }}, + "sqlite3": {"sqlite3", func() Driver { return &sqlite3Driver{} }, func() Dialect { return &sqlite3{} }}, + "oci8": {"oracle", func() Driver { return &oci8Driver{} }, 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 { diff --git a/dialects/driver.go b/dialects/driver.go index ae3afe42..b5ee7a14 100644 --- a/dialects/driver.go +++ b/dialects/driver.go @@ -8,7 +8,9 @@ import ( "fmt" ) +// Driver represents a driver interface type Driver interface { + Name() string Parse(string, string) (*URI, error) } @@ -16,6 +18,7 @@ var ( drivers = map[string]Driver{} ) +// RegisterDriver register a driver func RegisterDriver(driverName string, driver Driver) { if driver == nil { panic("core: Register driver is nil") diff --git a/dialects/mssql.go b/dialects/mssql.go index 8ef924b8..1342b777 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -531,6 +531,11 @@ func (db *mssql) Filters() []Filter { } type odbcDriver struct { + name string +} + +func (p *odbcDriver) Name() string { + return p.name } func (p *odbcDriver) Parse(driverName, dataSourceName string) (*URI, error) { diff --git a/dialects/mysql.go b/dialects/mysql.go index ac916c89..9012e735 100644 --- a/dialects/mysql.go +++ b/dialects/mysql.go @@ -573,6 +573,10 @@ func (db *mysql) Filters() []Filter { type mymysqlDriver struct { } +func (d *mymysqlDriver) Name() string { + return "mymysql" +} + func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) { uri := &URI{DBType: schemas.MYSQL} @@ -625,6 +629,10 @@ func (p *mymysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) { type mysqlDriver struct { } +func (d *mysqlDriver) Name() string { + return "mysql" +} + func (p *mysqlDriver) Parse(driverName, dataSourceName string) (*URI, error) { dsnPattern := regexp.MustCompile( `^(?:(?P.*?)(?::(?P.*))?@)?` + // [user[:password]@] diff --git a/dialects/oracle.go b/dialects/oracle.go index 2620b0bb..a64ed6b7 100644 --- a/dialects/oracle.go +++ b/dialects/oracle.go @@ -805,6 +805,10 @@ func (db *oracle) Filters() []Filter { type goracleDriver struct { } +func (d *goracleDriver) Name() string { + return "goracle" +} + func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error) { db := &URI{DBType: schemas.ORACLE} dsnPattern := regexp.MustCompile( @@ -831,6 +835,10 @@ func (cfg *goracleDriver) Parse(driverName, dataSourceName string) (*URI, error) type oci8Driver struct { } +func (d *oci8Driver) Name() string { + return "oci8" +} + // dataSourceName=user/password@ipv4:port/dbname // dataSourceName=user/password@[ipv6]:port/dbname func (p *oci8Driver) Parse(driverName, dataSourceName string) (*URI, error) { diff --git a/dialects/postgres.go b/dialects/postgres.go index 1996c49d..229dfe50 100644 --- a/dialects/postgres.go +++ b/dialects/postgres.go @@ -1241,6 +1241,11 @@ func (db *postgres) Filters() []Filter { } type pqDriver struct { + name string +} + +func (d *pqDriver) Name() string { + return d.name } type values map[string]string @@ -1321,6 +1326,10 @@ type pqDriverPgx struct { pqDriver } +func (pgx *pqDriverPgx) Name() string { + return "pgx" +} + func (pgx *pqDriverPgx) Parse(driverName, dataSourceName string) (*URI, error) { // Remove the leading characters for driver to work if len(dataSourceName) >= 9 && dataSourceName[0] == 0 { diff --git a/dialects/sqlite3.go b/dialects/sqlite3.go index 0e910934..72d08d07 100644 --- a/dialects/sqlite3.go +++ b/dialects/sqlite3.go @@ -520,6 +520,10 @@ func (db *sqlite3) Filters() []Filter { type sqlite3Driver struct { } +func (p *sqlite3Driver) Name() string { + return "sqlite3" +} + func (p *sqlite3Driver) Parse(driverName, dataSourceName string) (*URI, error) { if strings.Contains(dataSourceName, "?") { dataSourceName = dataSourceName[:strings.Index(dataSourceName, "?")] diff --git a/schemas/type.go b/schemas/type.go index 89459a4d..343d15a8 100644 --- a/schemas/type.go +++ b/schemas/type.go @@ -19,6 +19,7 @@ const ( MYSQL DBType = "mysql" MSSQL DBType = "mssql" ORACLE DBType = "oracle" + GREENPLUM DBType = "greenplum" ) // SQLType represents SQL types -- 2.40.1