clean.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright (C) 2014-2015 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. package main
  3. import (
  4. "database/sql"
  5. "log"
  6. "time"
  7. )
  8. type cleansrv struct {
  9. intv time.Duration
  10. db *sql.DB
  11. prep map[string]*sql.Stmt
  12. }
  13. func (s *cleansrv) Serve() {
  14. for {
  15. time.Sleep(next(s.intv))
  16. err := s.cleanOldEntries()
  17. if err != nil {
  18. log.Println("Clean:", err)
  19. }
  20. }
  21. }
  22. func (s *cleansrv) Stop() {
  23. panic("stop unimplemented")
  24. }
  25. func (s *cleansrv) cleanOldEntries() (err error) {
  26. var tx *sql.Tx
  27. tx, err = s.db.Begin()
  28. if err != nil {
  29. return err
  30. }
  31. defer func() {
  32. if err == nil {
  33. err = tx.Commit()
  34. } else {
  35. tx.Rollback()
  36. }
  37. }()
  38. res, err := tx.Stmt(s.prep["cleanAddress"]).Exec()
  39. if err != nil {
  40. return err
  41. }
  42. if rows, _ := res.RowsAffected(); rows > 0 {
  43. log.Printf("Clean: %d old addresses", rows)
  44. }
  45. res, err = tx.Stmt(s.prep["cleanDevice"]).Exec()
  46. if err != nil {
  47. return err
  48. }
  49. if rows, _ := res.RowsAffected(); rows > 0 {
  50. log.Printf("Clean: %d old devices", rows)
  51. }
  52. var devs, addrs int
  53. row := tx.Stmt(s.prep["countDevice"]).QueryRow()
  54. if err = row.Scan(&devs); err != nil {
  55. return err
  56. }
  57. row = tx.Stmt(s.prep["countAddress"]).QueryRow()
  58. if err = row.Scan(&addrs); err != nil {
  59. return err
  60. }
  61. log.Printf("Database: %d devices, %d addresses", devs, addrs)
  62. return nil
  63. }