-
Notifications
You must be signed in to change notification settings - Fork 3
/
db_flags.go
155 lines (125 loc) · 3.27 KB
/
db_flags.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
package database
import (
"database/sql"
"github.com/nsec/askgod/api"
"github.com/nsec/askgod/internal/utils"
)
// GetFlags retrieves all the flag entries from the database
func (db *DB) GetFlags() ([]api.AdminFlag, error) {
// Return a list of flags
resp := []api.AdminFlag{}
// Query all the flags from the database
rows, err := db.Query("SELECT id, flag, value, return_string, description, tags FROM flag ORDER BY id ASC;")
if err != nil {
return nil, err
}
defer rows.Close()
// Iterate through the results
for rows.Next() {
row := api.AdminFlag{}
tags := ""
err := rows.Scan(&row.ID, &row.Flag, &row.Value, &row.ReturnString, &row.Description, &tags)
if err != nil {
return nil, err
}
row.Tags, err = utils.ParseTags(tags)
if err != nil {
return nil, err
}
resp = append(resp, row)
}
// Check for any error that might have happened
err = rows.Err()
if err != nil {
return nil, err
}
return resp, nil
}
// GetFlag retrieves a single flag entry from the database
func (db *DB) GetFlag(id int64) (*api.AdminFlag, error) {
// Query the database entry
row := api.AdminFlag{}
tags := ""
err := db.QueryRow("SELECT id, flag, value, return_string, description, tags FROM flag WHERE id=$1;", id).Scan(
&row.ID, &row.Flag, &row.Value, &row.ReturnString, &row.Description, &tags)
if err != nil {
return nil, err
}
row.Tags, err = utils.ParseTags(tags)
if err != nil {
return nil, err
}
return &row, nil
}
// CreateFlag adds a new flag to the database
func (db *DB) CreateFlag(flag api.AdminFlagPost) (int64, error) {
id := int64(-1)
// Create the database entry
err := db.QueryRow("INSERT INTO flag (flag, value, return_string, description, tags) VALUES ($1, $2, $3, $4, $5) RETURNING id",
flag.Flag, flag.Value, flag.ReturnString, flag.Description, utils.PackTags(flag.Tags)).Scan(&id)
if err != nil {
return -1, err
}
return id, nil
}
// UpdateFlag updates an existing flag
func (db *DB) UpdateFlag(id int64, flag api.AdminFlagPut) error {
// Update the database entry
result, err := db.Exec("UPDATE flag SET flag=$1, value=$2, return_string=$3, description=$4, tags=$5 WHERE id=$6;",
flag.Flag, flag.Value, flag.ReturnString, flag.Description, utils.PackTags(flag.Tags), id)
if err != nil {
return err
}
// Check that a change indeed happened
count, err := result.RowsAffected()
if err != nil {
return err
}
if count == 0 {
return sql.ErrNoRows
}
return nil
}
// DeleteFlag deletes a single flag from the database
func (db *DB) DeleteFlag(id int64) error {
// Delete the database entry
result, err := db.Exec("DELETE FROM flag WHERE id=$1;", id)
if err != nil {
return err
}
// Check that a change indeed happened
count, err := result.RowsAffected()
if err != nil {
return err
}
if count == 0 {
return sql.ErrNoRows
}
return nil
}
// ClearFlags wipes all flag entries from the database
func (db *DB) ClearFlags() error {
// Start a transaction
tx, err := db.Begin()
if err != nil {
return err
}
// Wipe the table
_, err = tx.Exec("DELETE FROM flag;")
if err != nil {
tx.Rollback()
return err
}
// Reset the sequence
_, err = tx.Exec("ALTER SEQUENCE flag_id_seq RESTART;")
if err != nil {
tx.Rollback()
return err
}
// Commit
err = tx.Commit()
if err != nil {
return err
}
return nil
}