diff options
Diffstat (limited to 'database')
-rw-r--r-- | database/backups.go | 51 | ||||
-rw-r--r-- | database/conn.go | 17 | ||||
-rw-r--r-- | database/migrate.go | 42 |
3 files changed, 110 insertions, 0 deletions
diff --git a/database/backups.go b/database/backups.go new file mode 100644 index 0000000..ab2155f --- /dev/null +++ b/database/backups.go @@ -0,0 +1,51 @@ +package database + +import ( + "database/sql" + "log" + "time" +) + +type Backup struct { + Hostname string + ReceivedOn time.Time +} + +func ListBackups(dbConn *sql.DB) ([]Backup, error) { + log.Println("listing backups") + + rows, err := dbConn.Query(`SELECT hostname, received_on FROM backups;`) + if err != nil { + return nil, err + } + defer rows.Close() + + backups := []Backup{} + for rows.Next() { + var backup Backup + err := rows.Scan(&backup.Hostname, &backup.ReceivedOn) + if err != nil { + return nil, err + } + backups = append(backups, backup) + } + + return backups, nil +} + +func DeleteOldBackups(dbConn *sql.DB, days int) error { + log.Println("deleting old backups") + + duration := time.Duration(days) * 24 * time.Hour + _, err := dbConn.Exec(`DELETE FROM backups WHERE received_on < ?;`, time.Now().Add(-duration)) + + return err +} + +func ReceivedBackup(dbConn *sql.DB, hostname string) error { + log.Println("received backup for", hostname) + + _, err := dbConn.Exec(`INSERT INTO backups (hostname) VALUES (?);`, hostname) + + return err +} diff --git a/database/conn.go b/database/conn.go new file mode 100644 index 0000000..be27586 --- /dev/null +++ b/database/conn.go @@ -0,0 +1,17 @@ +package database + +import ( + "database/sql" + _ "github.com/mattn/go-sqlite3" + "log" +) + +func MakeConn(databasePath *string) *sql.DB { + log.Println("opening database at", *databasePath, "with foreign keys enabled") + dbConn, err := sql.Open("sqlite3", *databasePath+"?_foreign_keys=on") + if err != nil { + panic(err) + } + + return dbConn +} diff --git a/database/migrate.go b/database/migrate.go new file mode 100644 index 0000000..f2087cc --- /dev/null +++ b/database/migrate.go @@ -0,0 +1,42 @@ +package database + +import ( + "log" + + "database/sql" + + _ "github.com/mattn/go-sqlite3" +) + +type Migrator func(*sql.DB) (*sql.DB, error) + +func MigrateBackups(dbConn *sql.DB) (*sql.DB, error) { + log.Println("migrating backups table") + + _, err := dbConn.Exec(`CREATE TABLE IF NOT EXISTS backups ( + hostname TEXT NOT NULL, + received_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP + );`) + if err != nil { + return dbConn, err + } + + return dbConn, nil +} + +func Migrate(dbConn *sql.DB) (*sql.DB, error) { + log.Println("migrating database") + + migrations := []Migrator{ + MigrateBackups, + } + + for _, migration := range migrations { + dbConn, err := migration(dbConn) + if err != nil { + return dbConn, err + } + } + + return dbConn, nil +} |