-
Notifications
You must be signed in to change notification settings - Fork 439
/
Copy pathdao_hook_model.go
159 lines (141 loc) · 5.19 KB
/
dao_hook_model.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package workflow
import (
"context"
"database/sql"
"encoding/json"
"github.com/go-gorp/gorp"
"github.com/rockbears/log"
"github.com/ovh/cds/sdk"
)
//PostInsert is a db hook
func (r *hookModel) PostInsert(db gorp.SqlExecutor) error {
return r.PostUpdate(db)
}
//PostUpdate is a db hook
func (r *hookModel) PostUpdate(db gorp.SqlExecutor) error {
if r.DefaultConfig == nil {
r.DefaultConfig = sdk.WorkflowNodeHookConfig{}
}
btes, errm := json.Marshal(r.DefaultConfig)
if errm != nil {
return errm
}
if _, err := db.Exec("update workflow_hook_model set default_config = $2 where id = $1", r.ID, btes); err != nil {
return err
}
return nil
}
//PostGet is a db hook
func (r *hookModel) PostGet(db gorp.SqlExecutor) error {
confStr, err := db.SelectStr("select default_config from workflow_hook_model where id = $1", r.ID)
if err != nil {
return err
}
conf := sdk.WorkflowNodeHookConfig{}
if err := sdk.JSONUnmarshal([]byte(confStr), &conf); err != nil {
return err
}
r.DefaultConfig = conf
return nil
}
//CreateBuiltinWorkflowHookModels insert all builtin hook models in database
func CreateBuiltinWorkflowHookModels(db *gorp.DbMap) error {
tx, err := db.Begin()
if err != nil {
return sdk.WrapError(err, "Unable to start transaction")
}
defer tx.Rollback() // nolint
if _, err := tx.Exec("LOCK TABLE workflow_hook_model IN ACCESS EXCLUSIVE MODE"); err != nil {
return sdk.WrapError(err, "Unable to lock table")
}
for _, h := range sdk.BuiltinHookModels {
ok, err := checkBuiltinWorkflowHookModelExist(tx, h)
if err != nil {
return sdk.WrapError(err, "CreateBuiltinWorkflowHookModels")
}
if !ok {
log.Debug(context.TODO(), "CreateBuiltinWorkflowHookModels> inserting hooks config: %s", h.Name)
if err := InsertHookModel(tx, h); err != nil {
return sdk.WrapError(err, "CreateBuiltinWorkflowHookModels error on insert")
}
} else {
log.Debug(context.TODO(), "CreateBuiltinWorkflowHookModels> updating hooks config: %s", h.Name)
// update default values
if err := UpdateHookModel(tx, h); err != nil {
return sdk.WrapError(err, "CreateBuiltinWorkflowHookModels error on update")
}
}
}
return tx.Commit()
}
func checkBuiltinWorkflowHookModelExist(db gorp.SqlExecutor, h *sdk.WorkflowHookModel) (bool, error) {
var count = 0
if err := db.QueryRow("select count(1), id from workflow_hook_model where name = $1 group by id", h.Name).Scan(&count, &h.ID); err != nil {
if err == sql.ErrNoRows {
return false, nil
}
return false, sdk.WrapError(err, "checkBuiltinWorkflowHookModelExist")
}
return count > 0, nil
}
// LoadHookModels returns all hook models available
func LoadHookModels(db gorp.SqlExecutor) ([]sdk.WorkflowHookModel, error) {
dbModels := []hookModel{}
if _, err := db.Select(&dbModels, "select id, name, type, command, author, description, identifier, icon from workflow_hook_model"); err != nil {
return nil, sdk.WrapError(err, "unable to load WorkflowHookModel")
}
models := make([]sdk.WorkflowHookModel, len(dbModels))
for i := range dbModels {
m := dbModels[i]
if err := m.PostGet(db); err != nil {
return nil, sdk.WrapError(err, "unable to load WorkflowHookModel")
}
models[i] = sdk.WorkflowHookModel(m)
}
return models, nil
}
// LoadHookModelByID returns a hook model by it's id, if not found, it returns an error
func LoadHookModelByID(db gorp.SqlExecutor, id int64) (*sdk.WorkflowHookModel, error) {
m := hookModel{}
query := "select id, name, type, command, default_config, author, description, identifier, icon from workflow_hook_model where id = $1"
if err := db.SelectOne(&m, query, id); err != nil {
if err == sql.ErrNoRows {
return nil, sdk.WrapError(sdk.ErrNotFound, "LoadHookModelByID> Unable to load WorkflowHookModel")
}
return nil, sdk.WrapError(err, "Unable to load WorkflowHookModel")
}
model := sdk.WorkflowHookModel(m)
return &model, nil
}
// LoadHookModelByName returns a hook model by it's name, if not found, it returns an error
func LoadHookModelByName(db gorp.SqlExecutor, name string) (*sdk.WorkflowHookModel, error) {
m := hookModel{}
query := "select id, name, type, command, default_config, author, description, identifier, icon from workflow_hook_model where name = $1"
if err := db.SelectOne(&m, query, name); err != nil {
if err == sql.ErrNoRows {
return nil, sdk.WrapError(sdk.ErrNotFound, "LoadHookModelByName> Unable to load WorkflowHookModel '%s'", name)
}
return nil, sdk.WrapError(err, "Unable to load WorkflowHookModel '%s'", name)
}
model := sdk.WorkflowHookModel(m)
return &model, nil
}
// UpdateHookModel updates a hook model in database
func UpdateHookModel(db gorp.SqlExecutor, m *sdk.WorkflowHookModel) error {
dbm := hookModel(*m)
if n, err := db.Update(&dbm); err != nil {
return sdk.WrapError(err, "Unable to update hook model %s", m.Name)
} else if n == 0 {
return sdk.WrapError(sdk.ErrNotFound, "UpdateHookModel> Unable to update hook model %s", m.Name)
}
return nil
}
// InsertHookModel inserts a hook model in database
func InsertHookModel(db gorp.SqlExecutor, m *sdk.WorkflowHookModel) error {
dbm := hookModel(*m)
if err := db.Insert(&dbm); err != nil {
return sdk.WrapError(err, "Unable to insert hook model %s", m.Name)
}
*m = sdk.WorkflowHookModel(dbm)
return nil
}