2021-08-30 20:46:38 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2021-11-16 05:19:24 +00:00
|
|
|
func SaveTemperatureReading(ctx context.Context, tx *sql.Tx, ts time.Time, sensor string, value int64) error {
|
|
|
|
q := "INSERT INTO temperature_reading (c_time, sensor, value) VALUES (?, ?, ?)"
|
|
|
|
_, err := tx.ExecContext(ctx, q, ts, sensor, value)
|
2021-08-30 20:46:38 +00:00
|
|
|
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
|
|
|
|
}
|