@@ -13,7 +13,7 @@ import (
13
13
"os"
14
14
"path"
15
15
"path/filepath"
16
- "reflect "
16
+ "sort "
17
17
"strings"
18
18
19
19
"code.gitea.io/gitea/modules/log"
@@ -373,35 +373,33 @@ func dumpTableFixtures(bean interface{}, dirPath string) error {
373
373
return err
374
374
}
375
375
defer f .Close ()
376
- var bufferSize = 100
377
- var objs = make ([]interface {}, 0 , bufferSize )
378
- err = x .BufferSize (bufferSize ).Iterate (bean , func (idx int , obj interface {}) error {
379
- objs = append (objs , obj )
380
- if len (objs ) == bufferSize {
381
- // BLOCK: need yaml support gonic name mapper
382
- data , err := yaml .Marshal (objs )
383
- if err != nil {
384
- return err
385
- }
386
- _ , err = f .Write (data )
387
- if err != nil {
388
- return err
389
- }
390
- objs = make ([]interface {}, 0 , bufferSize )
376
+
377
+ const bufferSize = 100
378
+ var start = 0
379
+ for {
380
+ objs , err := x .Table (table .Name ).Limit (bufferSize , start ).QueryInterface ()
381
+ if err != nil {
382
+ return err
391
383
}
392
- return err
393
- })
394
- if err != nil {
395
- return err
396
- }
397
- if len (objs ) > 0 {
384
+ if len (objs ) == 0 {
385
+ break
386
+ }
387
+
398
388
data , err := yaml .Marshal (objs )
399
389
if err != nil {
400
390
return err
401
391
}
402
392
_ , err = f .Write (data )
393
+ if err != nil {
394
+ return err
395
+ }
396
+ if len (objs ) < bufferSize {
397
+ break
398
+ }
399
+ start += len (objs )
403
400
}
404
- return err
401
+
402
+ return nil
405
403
}
406
404
407
405
// RestoreDatabaseFixtures restores all data from dir to database
@@ -421,14 +419,44 @@ func restoreTableFixtures(bean interface{}, dirPath string) error {
421
419
return err
422
420
}
423
421
424
- var bufferSize = 100
425
- v := reflect .MakeSlice (table .Type , 0 , bufferSize )
426
- // BLOCK: need yaml support gonic name mapper
427
- err = yaml .Unmarshal (data , v .Interface ())
422
+ const bufferSize = 100
423
+ var records = make ([]map [string ]interface {}, 0 , bufferSize * 10 )
424
+ err = yaml .Unmarshal (data , records )
428
425
if err != nil {
429
426
return err
430
427
}
431
428
432
- _ , err = x .Insert (v .Interface ())
429
+ if len (records ) == 0 {
430
+ return nil
431
+ }
432
+
433
+ var columns = make ([]string , 0 , len (records [0 ]))
434
+ for k , _ := range records [0 ] {
435
+ columns = append (columns , k )
436
+ }
437
+ sort .Strings (columns )
438
+
439
+ qm := strings .Repeat ("?," , len (columns ))
440
+ qm = "(" + qm [:len (qm )- 1 ] + ")"
441
+
442
+ var sql = "INSERT INTO " + table .Name + "(" + strings .Join (columns , "," ) + ") VALUES "
443
+ var args = make ([]interface {}, 0 , bufferSize )
444
+ var insertSQLs = make ([]string , 0 , bufferSize )
445
+ for i , vals := range records {
446
+ insertSQLs = append (insertSQLs , qm )
447
+ for _ , colName := range columns {
448
+ args = append (args , vals [colName ])
449
+ }
450
+
451
+ if i + 1 % 100 == 0 || i == len (records )- 1 {
452
+ _ , err = x .Exec (sql + strings .Join (insertSQLs , "," ), args ... )
453
+ if err != nil {
454
+ return err
455
+ }
456
+ insertSQLs = make ([]string , 0 , bufferSize )
457
+ args = make ([]interface {}, 0 , bufferSize )
458
+ }
459
+ }
460
+
433
461
return err
434
462
}
0 commit comments