diff --git a/shroom_internals/sql.go b/shroom_internals/sql.go index 6d1a782..98ad60a 100644 --- a/shroom_internals/sql.go +++ b/shroom_internals/sql.go @@ -66,8 +66,32 @@ func LatestTime(db *sql.DB) (int64, error) { 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) VALUES (?, ?, ?, ?)", *s.Time, *s.Temperature, *s.Humidity, *s.HumidifierVolts) return err } + +func ClearOldRows(db *sql.DB, min_time int64) error { + _, err := db.Exec("DELETE FROM shrooms WHERE t < ?", min_time) + return err +} diff --git a/shroom_server.go b/shroom_server.go index 4c6a7ed..f5042df 100644 --- a/shroom_server.go +++ b/shroom_server.go @@ -38,6 +38,8 @@ type adminMsg struct { Msg map[string]interface{} `json:"data"` } +// returns a function that multiplies the number at the very last segment of the url +// and returns the data that was collected in the last n*multiplier milliseconds func dumpData(db *sql.DB, multiplier int64) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, req *http.Request) { now := time.Now().Unix() @@ -200,9 +202,28 @@ func main() { http.HandleFunc("/api/update", updateHandler) http.HandleFunc("/api/status_update", statusUpdateHandler) - // TODO periodically clear old entries from the database + // periodically clear old entries from the database + go func() { + // TODO maybe make this exit gracefully + for { + t, err := s.OldestTime(db) + if err != nil { + log.Println("unable to get oldest time: ", err) + } + now := time.Now().Unix() + diff := now*1000 - t + log.Println("oldest time", t, " current time", now, "diff", diff) + if diff > 2*7*24*60*60*1000 { + err = s.ClearOldRows(db, now-8*24*60*60*1000) + if err != nil { + log.Println("unable to delete rows: ", err) + } + } + time.Sleep(24 * time.Hour) + } + }() - err = http.ListenAndServe("localhost:8080", nil) + err = http.ListenAndServe("localhost:8085", nil) if err != nil { log.Fatal("unable to start server: ", err) }