@@ -33,42 +33,66 @@ func renameExistingUserAvatarName(x *xorm.Engine) error {
33
33
return err
34
34
}
35
35
36
- deleteList := make ([]string , 0 , len (users ))
36
+ deleteList := make (map [string ]struct {})
37
+ sessionOpCount := 0
37
38
for _ , user := range users {
38
39
oldAvatar := user .Avatar
39
40
newAvatar := fmt .Sprintf ("%x" , md5 .Sum ([]byte (fmt .Sprintf ("%d-%s" , user .ID , user .Avatar ))))
40
-
41
41
if _ , err := os .Stat (filepath .Join (setting .AvatarUploadPath , oldAvatar )); err != nil {
42
42
continue
43
43
}
44
44
45
45
fr , err := os .Open (filepath .Join (setting .AvatarUploadPath , oldAvatar ))
46
46
if err != nil {
47
- return err
47
+ _ = commitSession (sess )
48
+ return fmt .Errorf ("os.Open: %v" , err )
48
49
}
49
50
defer fr .Close ()
50
51
51
52
fw , err := os .Create (filepath .Join (setting .AvatarUploadPath , newAvatar ))
52
53
if err != nil {
53
- return err
54
+ _ = commitSession (sess )
55
+ return fmt .Errorf ("os.Create: %v" , err )
54
56
}
55
57
defer fw .Close ()
56
58
57
59
if _ , err := io .Copy (fw , fr ); err != nil {
58
- return err
60
+ _ = commitSession (sess )
61
+ return fmt .Errorf ("io.Copy: %v" , err )
59
62
}
60
63
61
64
user .Avatar = newAvatar
62
65
if _ , err := sess .ID (user .ID ).Update (& user ); err != nil {
63
- return err
66
+ return fmt . Errorf ( "user table update: %v" , err )
64
67
}
65
68
66
- deleteList = append (deleteList , filepath .Join (setting .AvatarUploadPath , oldAvatar ))
69
+ deleteList [filepath .Join (setting .AvatarUploadPath , oldAvatar )] = struct {}{}
70
+
71
+ if sessionOpCount ++ ; sessionOpCount >= 100 {
72
+ if err := commitSession (sess ); err != nil {
73
+ return err
74
+ }
75
+ sessionOpCount = 0
76
+ if err := sess .Begin (); err != nil {
77
+ return err
78
+ }
79
+ }
80
+ }
81
+ if err := commitSession (sess ); err != nil {
82
+ return err
67
83
}
68
- for _ , file := range deleteList {
84
+ for file := range deleteList {
69
85
if err := os .Remove (file ); err != nil {
70
- return err
86
+ return fmt . Errorf ( "os.Remove: %v" , err )
71
87
}
72
88
}
73
- return sess .Commit ()
89
+ return nil
90
+ }
91
+
92
+ func commitSession (sess * xorm.Session ) error {
93
+ if err := sess .Commit (); err != nil {
94
+ _ = sess .Rollback ()
95
+ return fmt .Errorf ("db update: %v" , err )
96
+ }
97
+ return nil
74
98
}
0 commit comments