/
sql.go
66 lines (53 loc) · 1.17 KB
/
sql.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
package owner
import (
"bytes"
"github.com/olekukonko/tablewriter"
"github.com/pollen5/taiga/db"
"github.com/sapphire-cord/sapphire"
)
// Execute some SQL queries.
// Usage: <query:string...>
func OwnerSQL(ctx *sapphire.CommandContext) {
rows, err := db.Query(ctx.JoinedArgs())
if err != nil {
ctx.CodeBlock("", err.Error())
return
}
cols, err := rows.Columns()
if err != nil {
ctx.CodeBlock("", err.Error())
return
}
rawResult := make([][]byte, len(cols))
result := make([]string, len(cols))
dest := make([]interface{}, len(cols)) // A temporary interface{} slice
for i, _ := range rawResult {
dest[i] = &rawResult[i] // Put pointers to each string in the interface slice
}
b := &bytes.Buffer{}
table := tablewriter.NewWriter(b)
table.SetHeader(cols)
for rows.Next() {
err := rows.Scan(dest...)
if err != nil {
ctx.CodeBlock("", err.Error())
return
}
for i, raw := range rawResult {
if raw == nil {
result[i] = ""
} else {
result[i] = string(raw)
}
}
table.Append(result)
}
defer rows.Close()
table.Render()
str := b.String()
if len(str) > 2040 {
ctx.Reply("Results too long.")
return
}
ctx.CodeBlock("", str)
}