diff --git a/stats.go b/stats.go index 33f18f5..4387d47 100644 --- a/stats.go +++ b/stats.go @@ -4,10 +4,26 @@ import ( "fmt" "log" "os" + "time" ) -// Get the size of the database and return as nearest human readable size +type Cache struct { + timestamp time.Time + data string +} + +var cache Cache + +// Get the size of the database and return as nearest human readable size. +// +// e.g. 1.23 KiB, 4.56 MiB, 7.89 GiB, 0.12 TiB +// The size is cached for 10 minutes func GetDBSize() string { + // If cache is less than 10 minutes old, return cached data + if time.Since(cache.timestamp).Minutes() < 10 { + return cache.data + } + fileInfo, err := os.Stat("feedvault.db") if err != nil { log.Println("Error getting file info:", err) @@ -21,19 +37,22 @@ func GetDBSize() string { var size float64 if fileSize < 1024*1024 { size = float64(fileSize) / 1024 - return fmt.Sprintf("%.2f KiB", size) - } - - if fileSize < 1024*1024*1024 { + cache.data = fmt.Sprintf("%.2f KiB", size) + } else if fileSize < 1024*1024*1024 { size = float64(fileSize) / (1024 * 1024) - return fmt.Sprintf("%.2f MiB", size) - } - - if fileSize < 1024*1024*1024*1024 { + cache.data = fmt.Sprintf("%.2f MiB", size) + } else if fileSize < 1024*1024*1024*1024 { size = float64(fileSize) / (1024 * 1024 * 1024) - return fmt.Sprintf("%.2f GiB", size) + cache.data = fmt.Sprintf("%.2f GiB", size) + } else { + size = float64(fileSize) / (1024 * 1024 * 1024 * 1024) + cache.data = fmt.Sprintf("%.2f TiB", size) } - size = float64(fileSize) / (1024 * 1024 * 1024 * 1024) - return fmt.Sprintf("%.2f TiB", size) + // Update cache timestamp + cache.timestamp = time.Now() + + log.Println("Returning database size, it is", cache.data) + + return cache.data } diff --git a/stats_test.go b/stats_test.go new file mode 100644 index 0000000..59ab2dc --- /dev/null +++ b/stats_test.go @@ -0,0 +1,28 @@ +package main + +import ( + "testing" + "time" +) + +// If the cache is less than 10 minutes old, return the cached data. +func TestCacheLessThan10MinutesOld(t *testing.T) { + result := GetDBSize() + + // Assert that the size of the database is returned + if result != cache.data { + t.Errorf("Expected database size, but got %s", result) + } +} + +// If the cache is more than 10 minutes old, return the size of the database. +func TestCacheMoreThan10MinutesOld(t *testing.T) { + // Set the cache timestamp to 11 minutes ago + cache.timestamp = time.Now().Add(-11 * time.Minute) + result := GetDBSize() + + // Assert that the size of the database is returned + if result != cache.data { + t.Errorf("Expected database size, but got %s", result) + } +}