/
dataaccess.go
129 lines (99 loc) · 3.47 KB
/
dataaccess.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
package dataaccess
import (
"database/sql"
"fmt"
"github.com/dreyau/bareos_exporter/types"
_ "github.com/go-sql-driver/mysql" // Keep driver import and usage (in GetConnection) in one file
"time"
)
type connection struct {
DB *sql.DB
}
// GetConnection opens a new db connection
func GetConnection(connectionString string) (*connection, error) {
var connection connection
var err error
connection.DB, err = sql.Open("mysql", connectionString)
return &connection, err
}
// GetServerList reads all servers with scheduled backups for current date
func (connection connection) GetServerList() ([]string, error) {
date := fmt.Sprintf("%s%%", time.Now().Format("2006-01-02"))
results, err := connection.DB.Query("SELECT DISTINCT Name FROM job WHERE SchedTime LIKE ?", date)
if err != nil {
return nil, err
}
var servers []string
for results.Next() {
var server string
err = results.Scan(&server)
servers = append(servers, server)
}
return servers, err
}
// TotalBytes returns total bytes saved for a server since the very first backup
func (connection connection) TotalBytes(server string) (*types.TotalBytes, error) {
results, err := connection.DB.Query("SELECT SUM(JobBytes) FROM job WHERE Name=?", server)
if err != nil {
return nil, err
}
var totalBytes types.TotalBytes
if results.Next() {
err = results.Scan(&totalBytes.Bytes)
results.Close()
}
return &totalBytes, err
}
// TotalFiles returns total files saved for a server since the very first backup
func (connection connection) TotalFiles(server string) (*types.TotalFiles, error) {
results, err := connection.DB.Query("SELECT SUM(JobFiles) FROM job WHERE Name=?", server)
if err != nil {
return nil, err
}
var totalFiles types.TotalFiles
if results.Next() {
err = results.Scan(&totalFiles.Files)
results.Close()
}
return &totalFiles, err
}
// LastJob returns metrics for latest executed server backup
func (connection connection) LastJob(server string) (*types.LastJob, error) {
results, err := connection.DB.Query("SELECT Level,JobBytes,JobFiles,JobErrors,DATE(StartTime) AS JobDate FROM job WHERE Name LIKE ? ORDER BY StartTime DESC LIMIT 1", server)
if err != nil {
return nil, err
}
var lastJob types.LastJob
if results.Next() {
err = results.Scan(&lastJob.Level, &lastJob.JobBytes, &lastJob.JobFiles, &lastJob.JobErrors, &lastJob.JobDate)
results.Close()
}
return &lastJob, err
}
// LastJob returns metrics for latest executed server backup with Level F
func (connection connection) LastFullJob(server string) (*types.LastJob, error) {
results, err := connection.DB.Query("SELECT Level,JobBytes,JobFiles,JobErrors,DATE(StartTime) AS JobDate FROM job WHERE Name LIKE ? AND Level = 'F' ORDER BY StartTime DESC LIMIT 1", server)
if err != nil {
return nil, err
}
var lastJob types.LastJob
if results.Next() {
err = results.Scan(&lastJob.Level, &lastJob.JobBytes, &lastJob.JobFiles, &lastJob.JobErrors, &lastJob.JobDate)
results.Close()
}
return &lastJob, err
}
// ScheduledTime returns amount of scheduled jobs
func (connection connection) ScheduledJobs(server string) (*types.ScheduledJob, error) {
date := fmt.Sprintf("%s%%", time.Now().Format("2006-01-02"))
results, err := connection.DB.Query("SELECT COUNT(DATE(SchedTime)) AS JobsScheduled FROM job WHERE Name LIKE ? AND SchedTime >= ?", server, date)
if err != nil {
return nil, err
}
var schedJob types.ScheduledJob
if results.Next() {
err = results.Scan(&schedJob.ScheduledJobs)
results.Close()
}
return &schedJob, err
}