|
|
@@ -3,11 +3,12 @@ package migrator
|
|
|
import (
|
|
|
"fmt"
|
|
|
"strings"
|
|
|
+
|
|
|
+ "github.com/go-xorm/xorm"
|
|
|
)
|
|
|
|
|
|
type Dialect interface {
|
|
|
DriverName() string
|
|
|
- QuoteStr() string
|
|
|
Quote(string) string
|
|
|
AndStr() string
|
|
|
AutoIncrStr() string
|
|
|
@@ -31,16 +32,29 @@ type Dialect interface {
|
|
|
TableCheckSql(tableName string) (string, []interface{})
|
|
|
RenameTable(oldName string, newName string) string
|
|
|
UpdateTableSql(tableName string, columns []*Column) string
|
|
|
+
|
|
|
+ ColString(*Column) string
|
|
|
+ ColStringNoPk(*Column) string
|
|
|
+
|
|
|
+ Limit(limit int64) string
|
|
|
+ LimitOffset(limit int64, offset int64) string
|
|
|
+
|
|
|
+ PreInsertId(table string, sess *xorm.Session) error
|
|
|
+ PostInsertId(table string, sess *xorm.Session) error
|
|
|
+
|
|
|
+ CleanDB() error
|
|
|
+ NoOpSql() string
|
|
|
}
|
|
|
|
|
|
-func NewDialect(name string) Dialect {
|
|
|
+func NewDialect(engine *xorm.Engine) Dialect {
|
|
|
+ name := engine.DriverName()
|
|
|
switch name {
|
|
|
case MYSQL:
|
|
|
- return NewMysqlDialect()
|
|
|
+ return NewMysqlDialect(engine)
|
|
|
case SQLITE:
|
|
|
- return NewSqlite3Dialect()
|
|
|
+ return NewSqlite3Dialect(engine)
|
|
|
case POSTGRES:
|
|
|
- return NewPostgresDialect()
|
|
|
+ return NewPostgresDialect(engine)
|
|
|
}
|
|
|
|
|
|
panic("Unsupported database type: " + name)
|
|
|
@@ -48,6 +62,7 @@ func NewDialect(name string) Dialect {
|
|
|
|
|
|
type BaseDialect struct {
|
|
|
dialect Dialect
|
|
|
+ engine *xorm.Engine
|
|
|
driverName string
|
|
|
}
|
|
|
|
|
|
@@ -100,9 +115,12 @@ func (b *BaseDialect) CreateTableSql(table *Table) string {
|
|
|
}
|
|
|
|
|
|
if len(pkList) > 1 {
|
|
|
- sql += "PRIMARY KEY ( "
|
|
|
- sql += b.dialect.Quote(strings.Join(pkList, b.dialect.Quote(",")))
|
|
|
- sql += " ), "
|
|
|
+ quotedCols := []string{}
|
|
|
+ for _, col := range pkList {
|
|
|
+ quotedCols = append(quotedCols, b.dialect.Quote(col))
|
|
|
+ }
|
|
|
+
|
|
|
+ sql += "PRIMARY KEY ( " + strings.Join(quotedCols, ",") + " ), "
|
|
|
}
|
|
|
|
|
|
sql = sql[:len(sql)-2] + ")"
|
|
|
@@ -127,9 +145,12 @@ func (db *BaseDialect) CreateIndexSql(tableName string, index *Index) string {
|
|
|
|
|
|
idxName := index.XName(tableName)
|
|
|
|
|
|
- return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v);", unique,
|
|
|
- quote(idxName), quote(tableName),
|
|
|
- quote(strings.Join(index.Cols, quote(","))))
|
|
|
+ quotedCols := []string{}
|
|
|
+ for _, col := range index.Cols {
|
|
|
+ quotedCols = append(quotedCols, db.dialect.Quote(col))
|
|
|
+ }
|
|
|
+
|
|
|
+ return fmt.Sprintf("CREATE%s INDEX %v ON %v (%v);", unique, quote(idxName), quote(tableName), strings.Join(quotedCols, ","))
|
|
|
}
|
|
|
|
|
|
func (db *BaseDialect) QuoteColList(cols []string) string {
|
|
|
@@ -168,3 +189,74 @@ func (db *BaseDialect) DropIndexSql(tableName string, index *Index) string {
|
|
|
func (db *BaseDialect) UpdateTableSql(tableName string, columns []*Column) string {
|
|
|
return "-- NOT REQUIRED"
|
|
|
}
|
|
|
+
|
|
|
+func (db *BaseDialect) ColString(col *Column) string {
|
|
|
+ sql := db.dialect.Quote(col.Name) + " "
|
|
|
+
|
|
|
+ sql += db.dialect.SqlType(col) + " "
|
|
|
+
|
|
|
+ if col.IsPrimaryKey {
|
|
|
+ sql += "PRIMARY KEY "
|
|
|
+ if col.IsAutoIncrement {
|
|
|
+ sql += db.dialect.AutoIncrStr() + " "
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if db.dialect.ShowCreateNull() {
|
|
|
+ if col.Nullable {
|
|
|
+ sql += "NULL "
|
|
|
+ } else {
|
|
|
+ sql += "NOT NULL "
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if col.Default != "" {
|
|
|
+ sql += "DEFAULT " + db.dialect.Default(col) + " "
|
|
|
+ }
|
|
|
+
|
|
|
+ return sql
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) ColStringNoPk(col *Column) string {
|
|
|
+ sql := db.dialect.Quote(col.Name) + " "
|
|
|
+
|
|
|
+ sql += db.dialect.SqlType(col) + " "
|
|
|
+
|
|
|
+ if db.dialect.ShowCreateNull() {
|
|
|
+ if col.Nullable {
|
|
|
+ sql += "NULL "
|
|
|
+ } else {
|
|
|
+ sql += "NOT NULL "
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if col.Default != "" {
|
|
|
+ sql += "DEFAULT " + db.dialect.Default(col) + " "
|
|
|
+ }
|
|
|
+
|
|
|
+ return sql
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) Limit(limit int64) string {
|
|
|
+ return fmt.Sprintf(" LIMIT %d", limit)
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) LimitOffset(limit int64, offset int64) string {
|
|
|
+ return fmt.Sprintf(" LIMIT %d OFFSET %d", limit, offset)
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) PreInsertId(table string, sess *xorm.Session) error {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) PostInsertId(table string, sess *xorm.Session) error {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) CleanDB() error {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (db *BaseDialect) NoOpSql() string {
|
|
|
+ return "SELECT 0;"
|
|
|
+}
|