summaryrefslogtreecommitdiffstats
path: root/models/migrations/migrations.go
diff options
context:
space:
mode:
authorPeter Smit <peter@smitmail.eu>2015-01-22 14:49:52 +0200
committerPeter Smit <peter@smitmail.eu>2015-01-22 14:52:58 +0200
commitbb103e87239e6789b42eb4ceaab45f6cf49adb2e (patch)
tree59503b516dfa967c756c49d211180709b07896bf /models/migrations/migrations.go
parent161774d4fb61d1c2b28a90812b15d077312083f3 (diff)
downloadgitea-bb103e87239e6789b42eb4ceaab45f6cf49adb2e.tar.gz
gitea-bb103e87239e6789b42eb4ceaab45f6cf49adb2e.zip
Create db migrations framework
Diffstat (limited to 'models/migrations/migrations.go')
-rw-r--r--models/migrations/migrations.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
new file mode 100644
index 0000000000..0b52708172
--- /dev/null
+++ b/models/migrations/migrations.go
@@ -0,0 +1,47 @@
+package migrations
+
+import (
+ "errors"
+ "github.com/go-xorm/xorm"
+)
+
+type migration func(*xorm.Engine) error
+
+// The version table. Should have only one row with id==1
+type Version struct {
+ Id int64 `xorm:"pk"`
+ Version int64
+}
+
+// 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{}
+
+// Migrate database to current version
+func Migrate(x *xorm.Engine) error {
+ x.Sync(new(Version))
+
+ currentVersion := &Version{Id: 1}
+ has, err := x.Get(currentVersion)
+ if err != nil {
+ return err
+ }
+ if !has {
+ _, err = x.InsertOne(currentVersion)
+ }
+
+ v := currentVersion.Version
+
+ for i, migration := range migrations[v:] {
+ if err = migration(x); err != nil {
+ return err
+ }
+ currentVersion.Version = v + int64(i) + 1
+ x.Id(1).Update(currentVersion)
+ }
+ return nil
+}
+
+func expiredMigration(x *xorm.Engine) error {
+ return errors.New("You are migrating from a too old gogs version")
+}