/
updateTask.go
142 lines (120 loc) · 4.7 KB
/
updateTask.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
// Copyright (c) 2016 OpenM++
// This code is licensed under the MIT license (see LICENSE.txt for details)
package main
import (
"errors"
"github.com/openmpp/go/ompp/db"
"github.com/openmpp/go/ompp/omppLog"
)
// UpdateTaskDef replace or merge task definition: task text (description and notes) and task input worksets into database.
// It does replace or merge task_txt and task_set db rows.
// If task does not exist then new task created.
func (mc *ModelCatalog) UpdateTaskDef(isReplace bool, tpd *db.TaskDefPub) (bool, string, string, error) {
// validate parameters
if tpd == nil {
omppLog.Log("Error: invalid (empty) modeling task definition")
return false, "", "", errors.New("Error: invalid (empty) modeling task definition")
}
// if model digest-or-name or task name is empty then return empty results
dn := tpd.ModelDigest
if dn == "" {
dn = tpd.ModelName
}
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return false, "", "", nil
}
tn := tpd.Name
if tn == "" {
omppLog.Log("Warning: invalid (empty) modeling task name")
return false, "", "", nil
}
// if model metadata not loaded then read it from database
if _, ok := mc.loadModelMeta(dn); !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return false, dn, tn, nil // return empty result: model not found or error
}
// lock catalog and update model run
mc.theLock.Lock()
defer mc.theLock.Unlock()
idx, ok := mc.indexByDigestOrName(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return false, dn, tn, nil // return empty result: model not found or error
}
// convert run from "public" into db rows
// all input worskset names must exist in workset_lst
tm, isSetNotFound, _, err := (&db.TaskPub{TaskDefPub: *tpd}).FromPublic(mc.modelLst[idx].dbConn, mc.modelLst[idx].meta)
if err != nil {
omppLog.Log("Error at modeling task conversion: ", dn, ": ", tn, ": ", err.Error())
return false, dn, tn, err
}
if isSetNotFound {
omppLog.Log("Error at modeling task conversion, invalid input set name(s): ", dn, ": ", tn, ": ", err.Error())
return false, dn, tn, err
}
// match languages from request into model languages
for k := range tm.Txt {
lc := mc.languageMatch(idx, tm.Txt[k].LangCode)
if lc != "" {
tm.Txt[k].LangCode = lc
}
}
// replace or merge task text and task input worksets into database task_lst, task_txt, task_set tables
if isReplace {
err = tm.ReplaceTaskDef(mc.modelLst[idx].dbConn, mc.modelLst[idx].meta, mc.modelLst[idx].langMeta)
} else {
err = tm.MergeTaskDef(mc.modelLst[idx].dbConn, mc.modelLst[idx].meta, mc.modelLst[idx].langMeta)
}
if err != nil {
omppLog.Log("Error at update modeling task: ", dn, ": ", tn, ": ", err.Error())
return false, dn, tn, err
}
return true, dn, tn, nil
}
// DeleteTask do delete modeling task, task run history from database.
// Task run history deleted only from task_run_lst and task_run_set tables,
// it does not delete model runs or any model input sets (worksets).
// If multiple models with same name exist then result is undefined.
// If task does not exists in database then it is empty operation.
// If modeling task is running during delete then result is undefined and model may fail with database error.
func (mc *ModelCatalog) DeleteTask(dn, tn string) (bool, error) {
// if model digest-or-name or task name is empty then return empty results
if dn == "" {
omppLog.Log("Warning: invalid (empty) model digest and name")
return false, nil
}
if tn == "" {
omppLog.Log("Warning: invalid (empty) task name")
return false, nil
}
// if model metadata not loaded then read it from database
if _, ok := mc.loadModelMeta(dn); !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return false, nil // return empty result: model not found or error
}
// lock catalog and delete task
mc.theLock.Lock()
defer mc.theLock.Unlock()
idx, ok := mc.indexByDigestOrName(dn)
if !ok {
omppLog.Log("Warning: model digest or name not found: ", dn)
return false, nil // return empty result: model not found or error
}
// find task in database
t, err := db.GetTaskByName(mc.modelLst[idx].dbConn, mc.modelLst[idx].meta.Model.ModelId, tn)
if err != nil {
omppLog.Log("Error at get modeling task: ", dn, ": ", tn, ": ", err.Error())
return false, err
}
if t == nil {
return false, nil // return OK: task not found
}
// delete task from database
err = db.DeleteTask(mc.modelLst[idx].dbConn, t.TaskId)
if err != nil {
omppLog.Log("Error at delete task: ", dn, ": ", tn, ": ", err.Error())
return false, err
}
return true, nil
}