shrooms-server/shroom_internals/sql.go

100 lines
2.4 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,
humidifier_volts2 REAL
);`
_, err := db.Exec(create_table)
return err
}
type Datapoint struct {
Time uint64 `json:"t"`
Temperature float32 `json:"temp"`
Humidity float32 `json:"hum"`
HumidifierVolts float32 `json:"hv"`
HumidifierVolts2 float32 `json:"hv2"`
}
func QueryHistory(db *sql.DB, start int64) ([]Datapoint, error) {
query := "SELECT time, temperature, humidity, humidifier_volts, humidifier_volts2 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, &d.HumidifierVolts2)
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
}
func OldestTime(db *sql.DB) (int64, error) {
query := "SELECT MIN(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
}
func InsertRow(db *sql.DB, s *DataJson) error {
_, err := db.Exec("INSERT INTO shrooms (time, temperature, humidity, humidifier_volts, humidifier_volts2) VALUES (?, ?, ?, ?, ?)",
*s.Time, *s.Temperature, *s.Humidity, *s.HumidifierVolts, *s.HumidifierVolts2)
return err
}
func ClearOldRows(db *sql.DB, min_time int64) error {
_, err := db.Exec("DELETE FROM shrooms WHERE time < ?", min_time)
return err
}