folder.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. // Copyright (C) 2014 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package stats
  7. import (
  8. "time"
  9. "github.com/syncthing/syncthing/internal/db"
  10. )
  11. type FolderStatistics struct {
  12. LastFile LastFile `json:"lastFile"`
  13. LastScan time.Time `json:"lastScan"`
  14. }
  15. type FolderStatisticsReference struct {
  16. kv *db.Typed
  17. }
  18. type LastFile struct {
  19. At time.Time `json:"at"`
  20. Filename string `json:"filename"`
  21. Deleted bool `json:"deleted"`
  22. }
  23. func NewFolderStatisticsReference(kv *db.Typed) *FolderStatisticsReference {
  24. return &FolderStatisticsReference{
  25. kv: kv,
  26. }
  27. }
  28. func (s *FolderStatisticsReference) GetLastFile() (LastFile, error) {
  29. at, ok, err := s.kv.Time("lastFileAt")
  30. if err != nil {
  31. return LastFile{}, err
  32. } else if !ok {
  33. return LastFile{}, nil
  34. }
  35. file, ok, err := s.kv.String("lastFileName")
  36. if err != nil {
  37. return LastFile{}, err
  38. } else if !ok {
  39. return LastFile{}, nil
  40. }
  41. deleted, _, err := s.kv.Bool("lastFileDeleted")
  42. if err != nil {
  43. return LastFile{}, err
  44. }
  45. return LastFile{
  46. At: at,
  47. Filename: file,
  48. Deleted: deleted,
  49. }, nil
  50. }
  51. func (s *FolderStatisticsReference) ReceivedFile(file string, deleted bool) error {
  52. if err := s.kv.PutTime("lastFileAt", time.Now().Truncate(time.Second)); err != nil {
  53. return err
  54. }
  55. if err := s.kv.PutString("lastFileName", file); err != nil {
  56. return err
  57. }
  58. if err := s.kv.PutBool("lastFileDeleted", deleted); err != nil {
  59. return err
  60. }
  61. return nil
  62. }
  63. func (s *FolderStatisticsReference) ScanCompleted() error {
  64. return s.kv.PutTime("lastScan", time.Now().Truncate(time.Second))
  65. }
  66. func (s *FolderStatisticsReference) GetLastScanTime() (time.Time, error) {
  67. lastScan, ok, err := s.kv.Time("lastScan")
  68. if err != nil {
  69. return time.Time{}, err
  70. } else if !ok {
  71. return time.Time{}, nil
  72. }
  73. return lastScan, nil
  74. }
  75. func (s *FolderStatisticsReference) GetStatistics() (FolderStatistics, error) {
  76. lastFile, err := s.GetLastFile()
  77. if err != nil {
  78. return FolderStatistics{}, err
  79. }
  80. lastScanTime, err := s.GetLastScanTime()
  81. if err != nil {
  82. return FolderStatistics{}, err
  83. }
  84. return FolderStatistics{
  85. LastFile: lastFile,
  86. LastScan: lastScanTime,
  87. }, nil
  88. }