| @@ -13,12 +13,33 @@ import ( | |||
| "github.com/Unknwon/com" | |||
| "github.com/go-xorm/xorm" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/setting" | |||
| ) | |||
| const _DB_VER = 1 | |||
| type migration func(*xorm.Engine) error | |||
| type Migration interface { | |||
| Description() string | |||
| Migrate(*xorm.Engine) error | |||
| } | |||
| type migration struct { | |||
| description string | |||
| migrate func(*xorm.Engine) error | |||
| } | |||
| func NewMigration(desc string, fn func(*xorm.Engine) error) Migration { | |||
| return &migration{desc, fn} | |||
| } | |||
| func (m *migration) Description() string { | |||
| return m.description | |||
| } | |||
| func (m *migration) Migrate(x *xorm.Engine) error { | |||
| return m.migrate(x) | |||
| } | |||
| // The version table. Should have only one row with id==1 | |||
| type Version struct { | |||
| @@ -28,8 +49,8 @@ type Version struct { | |||
| // This is a sequence of migrations. Add new migrations to the bottom of the list. | |||
| // If you want to "retire" a migration, replace it with "expiredMigration" | |||
| var migrations = []migration{ | |||
| accessToCollaboration, | |||
| var migrations = []Migration{ | |||
| NewMigration("generate collaboration from access", accessToCollaboration), | |||
| } | |||
| // Migrate database to current version | |||
| @@ -47,13 +68,13 @@ func Migrate(x *xorm.Engine) error { | |||
| if err != nil { | |||
| return err | |||
| } | |||
| // if needsMigration { | |||
| // isEmpty, err := x.IsTableEmpty("user") | |||
| // if err != nil { | |||
| // return err | |||
| // } | |||
| // needsMigration = !isEmpty | |||
| // } | |||
| if needsMigration { | |||
| isEmpty, err := x.IsTableEmpty("user") | |||
| if err != nil { | |||
| return err | |||
| } | |||
| needsMigration = !isEmpty | |||
| } | |||
| if !needsMigration { | |||
| currentVersion.Version = int64(len(migrations)) | |||
| } | |||
| @@ -64,9 +85,10 @@ func Migrate(x *xorm.Engine) error { | |||
| } | |||
| v := currentVersion.Version | |||
| for i, migration := range migrations[v:] { | |||
| if err = migration(x); err != nil { | |||
| return fmt.Errorf("run migration: %v", err) | |||
| for i, m := range migrations[v:] { | |||
| log.Info("Migration: %s", m.Description()) | |||
| if err = m.Migrate(x); err != nil { | |||
| return fmt.Errorf("do migrate: %v", err) | |||
| } | |||
| currentVersion.Version = v + int64(i) + 1 | |||
| if _, err = x.Id(1).Update(currentVersion); err != nil { | |||
| @@ -95,6 +117,12 @@ func accessToCollaboration(x *xorm.Engine) error { | |||
| return err | |||
| } | |||
| sess := x.NewSession() | |||
| defer sess.Close() | |||
| if err = sess.Begin(); err != nil { | |||
| return err | |||
| } | |||
| offset := strings.Split(time.Now().String(), " ")[2] | |||
| for _, result := range results { | |||
| mode := com.StrTo(result["mode"]).MustInt64() | |||
| @@ -121,8 +149,9 @@ func accessToCollaboration(x *xorm.Engine) error { | |||
| ownerName := parts[0] | |||
| repoName := parts[1] | |||
| results, err := x.Query("SELECT u.id as `uid`, ou.uid as `memberid` FROM `user` u LEFT JOIN org_user ou ON ou.org_id=u.id WHERE u.lower_name=?", ownerName) | |||
| results, err := sess.Query("SELECT u.id as `uid`, ou.uid as `memberid` FROM `user` u LEFT JOIN org_user ou ON ou.org_id=u.id WHERE u.lower_name=?", ownerName) | |||
| if err != nil { | |||
| sess.Rollback() | |||
| return err | |||
| } | |||
| if len(results) < 1 { | |||
| @@ -147,21 +176,31 @@ func accessToCollaboration(x *xorm.Engine) error { | |||
| continue | |||
| } | |||
| results, err = x.Query("SELECT id FROM `repository` WHERE owner_id=? AND lower_name=?", ownerID, repoName) | |||
| results, err = sess.Query("SELECT id FROM `repository` WHERE owner_id=? AND lower_name=?", ownerID, repoName) | |||
| if err != nil { | |||
| return err | |||
| } else if len(results) < 1 { | |||
| continue | |||
| } | |||
| if len(results) < 1 { | |||
| collaboration := &Collaboration{ | |||
| UserID: userID, | |||
| RepoID: com.StrTo(results[0]["id"]).MustInt64(), | |||
| } | |||
| has, err := sess.Get(collaboration) | |||
| if err != nil { | |||
| sess.Rollback() | |||
| return err | |||
| } else if has { | |||
| continue | |||
| } | |||
| if _, err = x.InsertOne(&Collaboration{ | |||
| UserID: userID, | |||
| RepoID: com.StrTo(results[0]["id"]).MustInt64(), | |||
| Created: created, | |||
| }); err != nil { | |||
| collaboration.Created = created | |||
| if _, err = sess.InsertOne(collaboration); err != nil { | |||
| sess.Rollback() | |||
| return err | |||
| } | |||
| } | |||
| return nil | |||
| return sess.Commit() | |||
| } | |||