99 lines
2.1 KiB
Go
99 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
|
||
|
}
|