fermentord/internal/dal/readings.go

98 lines
2.1 KiB
Go

package dal
import (
"context"
"database/sql"
"time"
)
type ChamberState int
const (
ChamberStateIdle = iota
ChamberStateCooling
ChamberStateHeating
)
type TemperatureReadingDto struct {
Time time.Time
Sensor string
Value int
}
type ChamberStateChangeDto struct {
Time time.Time
State ChamberState
}
func LoadTemperatureReadingsSince(ctx context.Context, tx *sql.Tx, since time.Time) ([]TemperatureReadingDto, error) {
q := `
SELECT
c_time,
sensor,
value
FROM temperature_reading
WHERE
c_time > ?
ORDER BY c_time
`
r, err := tx.QueryContext(ctx, q, since)
if err != nil {
return nil, err
}
defer r.Close()
readings := make([]TemperatureReadingDto, 0)
var reading TemperatureReadingDto
for r.Next() {
err = r.Scan(&reading.Time, &reading.Sensor, &reading.Value)
if err != nil {
return nil, err
}
readings = append(readings, reading)
}
return readings, nil
}
func SaveTemperatureReading(ctx context.Context, tx *sql.Tx, sensor string, value int64) error {
q := "INSERT INTO temperature_reading (sensor, value) VALUES (?, ?)"
_, err := tx.ExecContext(ctx, q, sensor, value)
return err
}
func SaveChamberState(ctx context.Context, tx *sql.Tx, state ChamberState) error {
q := "INSERT INTO state_log (state) VALUES (?)"
_, err := tx.ExecContext(ctx, q, state)
return err
}
func LoadLastChamberStateChange(ctx context.Context, tx *sql.Tx) (t time.Time, err error) {
q := "SELECT c_time FROM state_log ORDER BY c_time DESC LIMIT 1"
err = tx.QueryRowContext(ctx, q).Scan(&t)
return
}
func LoadChamberStateChangesSince(ctx context.Context, tx *sql.Tx, since time.Time) ([]ChamberStateChangeDto, error) {
q := "SELECT c_time, state FROM state_log WHERE c_time > ? ORDER BY c_time"
r, err := tx.QueryContext(ctx, q, since)
if err != nil {
return nil, err
}
defer r.Close()
readings := make([]ChamberStateChangeDto, 0)
var reading ChamberStateChangeDto
for r.Next() {
err = r.Scan(&reading.Time, &reading.Time, &reading.State)
if err != nil {
return nil, err
}
readings = append(readings, reading)
}
return readings, nil
}