| 98 | } |
| 99 | |
| 100 | func execute(ctx context.DnoteCtx, m migration, schemaKey string) error { |
| 101 | log.Debug("running migration %s\n", m.name) |
| 102 | |
| 103 | tx, err := ctx.DB.Begin() |
| 104 | if err != nil { |
| 105 | return errors.Wrap(err, "beginning a transaction") |
| 106 | } |
| 107 | |
| 108 | err = m.run(ctx, tx) |
| 109 | if err != nil { |
| 110 | tx.Rollback() |
| 111 | return errors.Wrapf(err, "running '%s'", m.name) |
| 112 | } |
| 113 | |
| 114 | var currentSchema int |
| 115 | err = tx.QueryRow("SELECT value FROM system WHERE key = ?", schemaKey).Scan(¤tSchema) |
| 116 | if err != nil { |
| 117 | tx.Rollback() |
| 118 | return errors.Wrap(err, "getting current schema") |
| 119 | } |
| 120 | |
| 121 | _, err = tx.Exec("UPDATE system SET value = value + 1 WHERE key = ?", schemaKey) |
| 122 | if err != nil { |
| 123 | tx.Rollback() |
| 124 | return errors.Wrap(err, "incrementing schema") |
| 125 | } |
| 126 | |
| 127 | tx.Commit() |
| 128 | |
| 129 | return nil |
| 130 | } |
| 131 | |
| 132 | // Run performs unrun migrations |
| 133 | func Run(ctx context.DnoteCtx, migrations []migration, mode int) error { |