-
Notifications
You must be signed in to change notification settings - Fork 172
/
migration.go
100 lines (80 loc) · 2.51 KB
/
migration.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
* Copyright (c) 2018. Abstrium SAS <team (at) pydio.com>
* This file is part of Pydio Cells.
*
* Pydio Cells is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Pydio Cells is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Pydio Cells. If not, see <http://www.gnu.org/licenses/>.
*
* The latest code can be found at <https://pydio.com>.
*/
package sql
import (
"bytes"
"fmt"
"path"
"sort"
"strings"
migrate "github.com/rubenv/sql-migrate"
)
type byId []*migrate.Migration
func (b byId) Len() int { return len(b) }
func (b byId) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func (b byId) Less(i, j int) bool { return b[i].Less(b[j]) }
// Avoids pulling in the packr library for everyone, mimicks the bits of
// packr.Box that we need.
type PackrBox interface {
List() []string
Bytes(name string) []byte
}
// Migrations from a packr box.
type PackrMigrationSource struct {
Box PackrBox
// Path in the box to use.
Dir string
TablePrefix string
}
var _ migrate.MigrationSource = (*PackrMigrationSource)(nil)
func (p PackrMigrationSource) FindMigrations() ([]*migrate.Migration, error) {
migrations := make([]*migrate.Migration, 0)
items := p.Box.List()
prefix := ""
dir := path.Clean(p.Dir)
if dir != "." {
prefix = fmt.Sprintf("%s/", dir)
}
for _, item := range items {
// On windows, items can have \\ (not packed) or / (packed)
lookup := strings.Replace(item, "\\", "/", -1)
if !strings.HasPrefix(lookup, prefix) {
continue
}
name := strings.TrimPrefix(lookup, prefix)
if strings.Contains(name, "/") {
continue
}
// Making sure we have the table prefix
name = p.TablePrefix + "_" + name
if strings.HasSuffix(name, ".sql") {
file := p.Box.Bytes(item)
content := bytes.Replace(file, []byte("%%PREFIX%%"), []byte(p.TablePrefix), -1)
migration, err := migrate.ParseMigration(name, bytes.NewReader(content))
if err != nil {
return nil, err
}
migrations = append(migrations, migration)
}
}
// Make sure migrations are sorted
sort.Sort(byId(migrations))
return migrations, nil
}