/
constants.go
104 lines (86 loc) · 2.47 KB
/
constants.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
101
102
103
104
package pomegranate
const leadingDigits = 5
const timestampFormat = "20060102150405"
const initForwardTmpl = `BEGIN;
CREATE TABLE migration_state (
name TEXT NOT NULL,
time TIMESTAMP WITH TIME ZONE DEFAULT now() NOT NULL,
who TEXT DEFAULT CURRENT_USER NOT NULL,
PRIMARY KEY (name)
);
CREATE TABLE migration_log (
id SERIAL PRIMARY KEY,
time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
name TEXT NOT NULL,
op TEXT NOT NULL,
who TEXT NOT NULL DEFAULT CURRENT_USER
);
CREATE OR REPLACE FUNCTION record_migration() RETURNS trigger AS $$
BEGIN
IF TG_OP='DELETE' THEN
INSERT INTO migration_log (name, op) VALUES (
OLD.name,
TG_OP
);
RETURN OLD;
ELSE
INSERT INTO migration_log (name, op) VALUES (
NEW.name,
TG_OP
);
RETURN NEW;
END IF;
END;
$$ language plpgsql;
CREATE TRIGGER record_migration AFTER INSERT OR UPDATE OR DELETE ON migration_state
FOR EACH ROW EXECUTE PROCEDURE record_migration();
INSERT INTO migration_state(name) VALUES ('%s');
COMMIT;
`
const initBackwardTmpl = `BEGIN;
CREATE OR REPLACE FUNCTION no_rollback() RETURNS void AS $$
BEGIN
RAISE 'Will not roll back %s. You must manually drop the migration_state and migration_log tables.';
END;
$$ LANGUAGE plpgsql;
SELECT no_rollback();
COMMIT;
`
const forwardTmpl = `BEGIN;
-- vvvvvvvv PUT FORWARD MIGRATION CODE BELOW HERE vvvvvvvv
SELECT 1 / 0; -- delete this line
-- ^^^^^^^^ PUT FORWARD MIGRATION CODE ABOVE HERE ^^^^^^^^
INSERT INTO migration_state(name) VALUES ('%s');
COMMIT;
`
const backwardTmpl = `BEGIN;
-- vvvvvvvv PUT BACKWARD MIGRATION CODE BELOW HERE vvvvvvvv
SELECT 1 / 0; -- delete this line
-- ^^^^^^^^ PUT BACKWARD MIGRATION CODE ABOVE HERE ^^^^^^^^
DELETE FROM migration_state WHERE name='%s';
COMMIT;
`
const srcTmpl = `// Code generated by pmg. DO NOT EDIT.
package {{.PackageName}}
{{if .GenerateTag}}// The following comment tags this file for overwriting by "go generate"
//go:generate pmg ingest -package {{.PackageName}} -gofile {{.GoFile}}
// You can run "go generate {{.GoFile}}" to regenerate this file from the .sql migrations{{end}}
import "github.com/nav-inc/pomegranate"
var All = []pomegranate.Migration{
{{range .Migrations}}{
Name: "{{.Name}}",
ForwardSQL: []string{
{{range $sql := .QuotedTemplateForward}}{{$sql}},{{end}}
},
BackwardSQL: []string{
{{range $sql := .QuotedTemplateBackward}}{{$sql}},{{end}}
},
},{{end}}
}
`
type srcContext struct {
PackageName string
Migrations []Migration
GenerateTag bool
GoFile string
}