From 7810e439d4daae0acd88c456495d688ccb61695b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 8 May 2018 07:07:16 +0800 Subject: [PATCH] fix name convert --- models/models.go | 84 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/models/models.go b/models/models.go index bb1b2d5e3..5ac109ea1 100644 --- a/models/models.go +++ b/models/models.go @@ -13,7 +13,7 @@ import ( "os" "path" "path/filepath" - "reflect" + "sort" "strings" "code.gitea.io/gitea/modules/log" @@ -373,35 +373,33 @@ func dumpTableFixtures(bean interface{}, dirPath string) error { return err } defer f.Close() - var bufferSize = 100 - var objs = make([]interface{}, 0, bufferSize) - err = x.BufferSize(bufferSize).Iterate(bean, func(idx int, obj interface{}) error { - objs = append(objs, obj) - if len(objs) == bufferSize { - // BLOCK: need yaml support gonic name mapper - data, err := yaml.Marshal(objs) - if err != nil { - return err - } - _, err = f.Write(data) - if err != nil { - return err - } - objs = make([]interface{}, 0, bufferSize) + + const bufferSize = 100 + var start = 0 + for { + objs, err := x.Table(table.Name).Limit(bufferSize, start).QueryInterface() + if err != nil { + return err } - return err - }) - if err != nil { - return err - } - if len(objs) > 0 { + if len(objs) == 0 { + break + } + data, err := yaml.Marshal(objs) if err != nil { return err } _, err = f.Write(data) + if err != nil { + return err + } + if len(objs) < bufferSize { + break + } + start += len(objs) } - return err + + return nil } // RestoreDatabaseFixtures restores all data from dir to database @@ -421,14 +419,44 @@ func restoreTableFixtures(bean interface{}, dirPath string) error { return err } - var bufferSize = 100 - v := reflect.MakeSlice(table.Type, 0, bufferSize) - // BLOCK: need yaml support gonic name mapper - err = yaml.Unmarshal(data, v.Interface()) + const bufferSize = 100 + var records = make([]map[string]interface{}, 0, bufferSize*10) + err = yaml.Unmarshal(data, records) if err != nil { return err } - _, err = x.Insert(v.Interface()) + if len(records) == 0 { + return nil + } + + var columns = make([]string, 0, len(records[0])) + for k, _ := range records[0] { + columns = append(columns, k) + } + sort.Strings(columns) + + qm := strings.Repeat("?,", len(columns)) + qm = "(" + qm[:len(qm)-1] + ")" + + var sql = "INSERT INTO " + table.Name + "(" + strings.Join(columns, ",") + ") VALUES " + var args = make([]interface{}, 0, bufferSize) + var insertSQLs = make([]string, 0, bufferSize) + for i, vals := range records { + insertSQLs = append(insertSQLs, qm) + for _, colName := range columns { + args = append(args, vals[colName]) + } + + if i+1%100 == 0 || i == len(records)-1 { + _, err = x.Exec(sql+strings.Join(insertSQLs, ","), args...) + if err != nil { + return err + } + insertSQLs = make([]string, 0, bufferSize) + args = make([]interface{}, 0, bufferSize) + } + } + return err }