shrooms-server/shroom_internals/sql.go

68 lines
1.5 KiB
Go

package shroom_internals
import (
"database/sql"
"fmt"
)
// TODO write tests for all of these
func CreateTable(db *sql.DB) error {
// create the table for the shroom data if it doesn't exist
create_table := `CREATE TABLE IF NOT EXISTS shrooms (
id INTEGER PRIMARY KEY AUTOINCREMENT,
time INTEGER,
humidity REAL,
temperature REAL,
humidifier_volts REAL
);`
_, err := db.Exec(create_table)
return err
}
type Datapoint struct {
Time uint64
Temperature float32
Humidity float32
HumidifierVolts float32
}
func QueryHistory(db *sql.DB, start int64) ([]Datapoint, error) {
query := "SELECT time, temperature, humidity, humidifier_volts FROM shrooms WHERE time > ?"
rows, err := db.Query(query, start)
if err != nil {
return nil, fmt.Errorf("sql error: %w", err)
}
defer rows.Close()
results := make([]Datapoint, 0)
for rows.Next() {
d := Datapoint{}
err = rows.Scan(&d.Time, &d.Temperature, &d.Humidity, &d.HumidifierVolts)
if err != nil {
return nil, fmt.Errorf("sql scan error: %w", err)
}
results = append(results, d)
}
return results, nil
}
func LatestTime(db *sql.DB) (int64, error) {
query := "SELECT MAX(time) FROM shrooms"
rows, err := db.Query(query)
if err != nil {
return -1, fmt.Errorf("sql error: %w", err)
}
defer rows.Close()
if !rows.Next() {
// i guess the database is empty
return 0, nil
}
t := int64(0)
err = rows.Scan(&t)
if err != nil {
return -1, fmt.Errorf("sql scan error: %w", err)
}
return t, nil
}