/
plugins.go
110 lines (89 loc) · 2.06 KB
/
plugins.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
package db
import (
"strings"
"time"
dlog "github.com/amoghe/distillog"
sql "github.com/lazada/sqle"
_ "github.com/mattn/go-sqlite3" // Register some sql
)
// User ...
type Plugin struct {
ID int64 `sql:"id"`
Name string `sql:"name"`
State string `sql:"state"`
CreatedAt time.Time `sql:"created_at"`
}
func (p *Plugin) String() string {
var b strings.Builder
b.WriteString(p.Name)
b.WriteRune(' ')
b.WriteRune('—')
b.WriteRune(' ')
b.WriteString(p.State)
return b.String()
}
// AddPluginIfNotExist ...
func AddPluginIfNotExist(db *sql.DB, plugin *Plugin) (*Plugin, error) {
var returnModel Plugin
result, err := QuerySQLObject(db, returnModel, `SELECT * FROM plugins WHERE name = ?;`, plugin.Name)
if err != nil {
return nil, err
}
if returnModel, ok := result.Interface().(*Plugin); ok && returnModel.Name != "" {
return returnModel, nil
}
res, err := db.Exec(
"INSERT INTO plugins (name, state) VALUES (?, ?);",
plugin.Name,
plugin.State,
)
if err != nil {
return nil, err
}
plugin.ID, err = res.LastInsertId()
if err != nil {
return nil, err
}
plugin.CreatedAt = time.Now()
dlog.Debugf("%s (%s) added at %s\n", plugin.Name, plugin.State, plugin.CreatedAt)
return plugin, nil
}
// UpdatePluginState ...
func UpdatePluginState(db *sql.DB, plugin *Plugin) (int64, error) {
result, err := db.Exec(
"UPDATE plugins SET state = ? WHERE name = ? AND state != ?;",
plugin.State,
plugin.Name,
plugin.State)
if err != nil {
return -1, err
}
rows, err := result.RowsAffected()
if err != nil {
return -1, err
}
return rows, nil
}
// GetPlugins ...
func GetPlugins(db *sql.DB) (plugins []*Plugin, err error) {
var returnModel Plugin
sql := `SELECT
*
FROM
plugins
ORDER BY
name;`
result, err := QuerySQLList(db, returnModel, sql, nil)
if err != nil {
return plugins, err
}
for _, item := range result {
if returnModel, ok := item.Interface().(*Plugin); ok {
plugins = append(plugins, returnModel)
}
}
return plugins, err
}
func (p *Plugin) IsEnabled() bool {
return p.State == "enabled"
}