summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/go-xorm/xorm/engine.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-xorm/xorm/engine.go')
-rw-r--r--vendor/github.com/go-xorm/xorm/engine.go222
1 files changed, 65 insertions, 157 deletions
diff --git a/vendor/github.com/go-xorm/xorm/engine.go b/vendor/github.com/go-xorm/xorm/engine.go
index c56aa06389..9e7b003782 100644
--- a/vendor/github.com/go-xorm/xorm/engine.go
+++ b/vendor/github.com/go-xorm/xorm/engine.go
@@ -46,7 +46,7 @@ type Engine struct {
disableGlobalCache bool
}
-// ShowSQL show SQL statment or not on logger if log level is great than INFO
+// ShowSQL show SQL statement or not on logger if log level is great than INFO
func (engine *Engine) ShowSQL(show ...bool) {
engine.logger.ShowSQL(show...)
if len(show) == 0 {
@@ -56,7 +56,7 @@ func (engine *Engine) ShowSQL(show ...bool) {
}
}
-// ShowExecTime show SQL statment and execute time or not on logger if log level is great than INFO
+// ShowExecTime show SQL statement and execute time or not on logger if log level is great than INFO
func (engine *Engine) ShowExecTime(show ...bool) {
if len(show) == 0 {
engine.showExecTime = true
@@ -117,7 +117,7 @@ func (engine *Engine) SupportInsertMany() bool {
return engine.dialect.SupportInsertMany()
}
-// QuoteStr Engine's database use which charactor as quote.
+// QuoteStr Engine's database use which character as quote.
// mysql, sqlite use ` and postgres use "
func (engine *Engine) QuoteStr() string {
return engine.dialect.QuoteStr()
@@ -305,7 +305,7 @@ func (engine *Engine) Sql(querystring string, args ...interface{}) *Session {
return engine.SQL(querystring, args...)
}
-// SQL method let's you manualy write raw SQL and operate
+// SQL method let's you manually write raw SQL and operate
// For example:
//
// engine.SQL("select * from user").Find(&users)
@@ -348,8 +348,6 @@ func (engine *Engine) DBMetas() ([]*core.Table, error) {
for _, name := range colSeq {
table.AddColumn(cols[name])
}
- //table.Columns = cols
- //table.ColumnsSeq = colSeq
indexes, err := engine.dialect.GetIndexes(table.Name)
if err != nil {
return nil, err
@@ -370,18 +368,22 @@ func (engine *Engine) DBMetas() ([]*core.Table, error) {
}
// DumpAllToFile dump database all table structs and data to a file
-func (engine *Engine) DumpAllToFile(fp string) error {
+func (engine *Engine) DumpAllToFile(fp string, tp ...core.DbType) error {
f, err := os.Create(fp)
if err != nil {
return err
}
defer f.Close()
- return engine.DumpAll(f)
+ return engine.DumpAll(f, tp...)
}
// DumpAll dump database all table structs and data to w
-func (engine *Engine) DumpAll(w io.Writer) error {
- return engine.dumpAll(w, engine.dialect.DBType())
+func (engine *Engine) DumpAll(w io.Writer, tp ...core.DbType) error {
+ tables, err := engine.DBMetas()
+ if err != nil {
+ return err
+ }
+ return engine.DumpTables(tables, w, tp...)
}
// DumpTablesToFile dump specified tables to SQL file.
@@ -399,140 +401,7 @@ func (engine *Engine) DumpTables(tables []*core.Table, w io.Writer, tp ...core.D
return engine.dumpTables(tables, w, tp...)
}
-func (engine *Engine) tableName(beanOrTableName interface{}) (string, error) {
- v := rValue(beanOrTableName)
- if v.Type().Kind() == reflect.String {
- return beanOrTableName.(string), nil
- } else if v.Type().Kind() == reflect.Struct {
- return engine.tbName(v), nil
- }
- return "", errors.New("bean should be a struct or struct's point")
-}
-
-func (engine *Engine) tbName(v reflect.Value) string {
- if tb, ok := v.Interface().(TableName); ok {
- return tb.TableName()
- }
-
- if v.Type().Kind() == reflect.Ptr {
- if tb, ok := reflect.Indirect(v).Interface().(TableName); ok {
- return tb.TableName()
- }
- } else if v.CanAddr() {
- if tb, ok := v.Addr().Interface().(TableName); ok {
- return tb.TableName()
- }
- }
- return engine.TableMapper.Obj2Table(reflect.Indirect(v).Type().Name())
-}
-
-// DumpAll dump database all table structs and data to w with specify db type
-func (engine *Engine) dumpAll(w io.Writer, tp ...core.DbType) error {
- tables, err := engine.DBMetas()
- if err != nil {
- return err
- }
-
- var dialect core.Dialect
- if len(tp) == 0 {
- dialect = engine.dialect
- } else {
- dialect = core.QueryDialect(tp[0])
- if dialect == nil {
- return errors.New("Unsupported database type")
- }
- dialect.Init(nil, engine.dialect.URI(), "", "")
- }
-
- _, err = io.WriteString(w, fmt.Sprintf("/*Generated by xorm v%s %s*/\n\n",
- Version, time.Now().In(engine.TZLocation).Format("2006-01-02 15:04:05")))
- if err != nil {
- return err
- }
-
- for i, table := range tables {
- if i > 0 {
- _, err = io.WriteString(w, "\n")
- if err != nil {
- return err
- }
- }
- _, err = io.WriteString(w, dialect.CreateTableSql(table, "", table.StoreEngine, "")+";\n")
- if err != nil {
- return err
- }
- for _, index := range table.Indexes {
- _, err = io.WriteString(w, dialect.CreateIndexSql(table.Name, index)+";\n")
- if err != nil {
- return err
- }
- }
-
- rows, err := engine.DB().Query("SELECT * FROM " + engine.Quote(table.Name))
- if err != nil {
- return err
- }
- defer rows.Close()
-
- cols, err := rows.Columns()
- if err != nil {
- return err
- }
- if len(cols) == 0 {
- continue
- }
- for rows.Next() {
- dest := make([]interface{}, len(cols))
- err = rows.ScanSlice(&dest)
- if err != nil {
- return err
- }
-
- _, err = io.WriteString(w, "INSERT INTO "+dialect.Quote(table.Name)+" ("+dialect.Quote(strings.Join(cols, dialect.Quote(", ")))+") VALUES (")
- if err != nil {
- return err
- }
-
- var temp string
- for i, d := range dest {
- col := table.GetColumn(cols[i])
- if d == nil {
- temp += ", NULL"
- } else if col.SQLType.IsText() || col.SQLType.IsTime() {
- var v = fmt.Sprintf("%s", d)
- temp += ", '" + strings.Replace(v, "'", "''", -1) + "'"
- } else if col.SQLType.IsBlob() {
- if reflect.TypeOf(d).Kind() == reflect.Slice {
- temp += fmt.Sprintf(", %s", dialect.FormatBytes(d.([]byte)))
- } else if reflect.TypeOf(d).Kind() == reflect.String {
- temp += fmt.Sprintf(", '%s'", d.(string))
- }
- } else if col.SQLType.IsNumeric() {
- switch reflect.TypeOf(d).Kind() {
- case reflect.Slice:
- temp += fmt.Sprintf(", %s", string(d.([]byte)))
- default:
- temp += fmt.Sprintf(", %v", d)
- }
- } else {
- s := fmt.Sprintf("%v", d)
- if strings.Contains(s, ":") || strings.Contains(s, "-") {
- temp += fmt.Sprintf(", '%s'", s)
- } else {
- temp += fmt.Sprintf(", %s", s)
- }
- }
- }
- _, err = io.WriteString(w, temp[2:]+");\n")
- if err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-// DumpAll dump database all table structs and data to w with specify db type
+// dumpTables dump database all table structs and data to w with specify db type
func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.DbType) error {
var dialect core.Dialect
var distDBName string
@@ -572,19 +441,15 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D
}
}
- rows, err := engine.DB().Query("SELECT * FROM " + engine.Quote(table.Name))
+ cols := table.ColumnsSeq()
+ colNames := dialect.Quote(strings.Join(cols, dialect.Quote(", ")))
+
+ rows, err := engine.DB().Query("SELECT " + colNames + " FROM " + engine.Quote(table.Name))
if err != nil {
return err
}
defer rows.Close()
- cols, err := rows.Columns()
- if err != nil {
- return err
- }
- if len(cols) == 0 {
- continue
- }
for rows.Next() {
dest := make([]interface{}, len(cols))
err = rows.ScanSlice(&dest)
@@ -592,7 +457,7 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D
return err
}
- _, err = io.WriteString(w, "INSERT INTO "+dialect.Quote(table.Name)+" ("+dialect.Quote(strings.Join(cols, dialect.Quote(", ")))+") VALUES (")
+ _, err = io.WriteString(w, "INSERT INTO "+dialect.Quote(table.Name)+" ("+colNames+") VALUES (")
if err != nil {
return err
}
@@ -600,6 +465,10 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D
var temp string
for i, d := range dest {
col := table.GetColumn(cols[i])
+ if col == nil {
+ return errors.New("unknow column error")
+ }
+
if d == nil {
temp += ", NULL"
} else if col.SQLType.IsText() || col.SQLType.IsTime() {
@@ -619,6 +488,18 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D
switch reflect.TypeOf(d).Kind() {
case reflect.Slice:
temp += fmt.Sprintf(", %s", string(d.([]byte)))
+ case reflect.Int16, reflect.Int8, reflect.Int32, reflect.Int64, reflect.Int:
+ if col.SQLType.Name == core.Bool {
+ temp += fmt.Sprintf(", %v", strconv.FormatBool(reflect.ValueOf(d).Int() > 0))
+ } else {
+ temp += fmt.Sprintf(", %v", d)
+ }
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ if col.SQLType.Name == core.Bool {
+ temp += fmt.Sprintf(", %v", strconv.FormatBool(reflect.ValueOf(d).Uint() > 0))
+ } else {
+ temp += fmt.Sprintf(", %v", d)
+ }
default:
temp += fmt.Sprintf(", %v", d)
}
@@ -644,6 +525,33 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D
return nil
}
+func (engine *Engine) tableName(beanOrTableName interface{}) (string, error) {
+ v := rValue(beanOrTableName)
+ if v.Type().Kind() == reflect.String {
+ return beanOrTableName.(string), nil
+ } else if v.Type().Kind() == reflect.Struct {
+ return engine.tbName(v), nil
+ }
+ return "", errors.New("bean should be a struct or struct's point")
+}
+
+func (engine *Engine) tbName(v reflect.Value) string {
+ if tb, ok := v.Interface().(TableName); ok {
+ return tb.TableName()
+ }
+
+ if v.Type().Kind() == reflect.Ptr {
+ if tb, ok := reflect.Indirect(v).Interface().(TableName); ok {
+ return tb.TableName()
+ }
+ } else if v.CanAddr() {
+ if tb, ok := v.Addr().Interface().(TableName); ok {
+ return tb.TableName()
+ }
+ }
+ return engine.TableMapper.Obj2Table(reflect.Indirect(v).Type().Name())
+}
+
// Cascade use cascade or not
func (engine *Engine) Cascade(trueOrFalse ...bool) *Session {
session := engine.NewSession()
@@ -716,7 +624,7 @@ func (engine *Engine) Select(str string) *Session {
return session.Select(str)
}
-// Cols only use the paramters as select or update columns
+// Cols only use the parameters as select or update columns
func (engine *Engine) Cols(columns ...string) *Session {
session := engine.NewSession()
session.IsAutoClose = true
@@ -740,15 +648,15 @@ func (engine *Engine) MustCols(columns ...string) *Session {
// UseBool xorm automatically retrieve condition according struct, but
// if struct has bool field, it will ignore them. So use UseBool
// to tell system to do not ignore them.
-// If no paramters, it will use all the bool field of struct, or
-// it will use paramters's columns
+// If no parameters, it will use all the bool field of struct, or
+// it will use parameters's columns
func (engine *Engine) UseBool(columns ...string) *Session {
session := engine.NewSession()
session.IsAutoClose = true
return session.UseBool(columns...)
}
-// Omit only not use the paramters as select or update columns
+// Omit only not use the parameters as select or update columns
func (engine *Engine) Omit(columns ...string) *Session {
session := engine.NewSession()
session.IsAutoClose = true