kv-tube/backend/models/cache.go

91 lines
1.7 KiB
Go

package models
import (
"database/sql"
"encoding/json"
"log"
"time"
)
type CacheEntry struct {
VideoID string
Data []byte
ExpiresAt time.Time
}
// GetCachedVideo retrieves cached video data by video ID
func GetCachedVideo(videoID string) ([]byte, error) {
if DB == nil {
return nil, nil
}
var data []byte
var expiresAt time.Time
err := DB.QueryRow(
`SELECT data, expires_at FROM video_cache WHERE video_id = ? AND expires_at > ?`,
videoID, time.Now(),
).Scan(&data, &expiresAt)
if err == sql.ErrNoRows {
return nil, nil
}
if err != nil {
log.Printf("Cache query error: %v", err)
return nil, err
}
return data, nil
}
// SetCachedVideo stores video data in cache with TTL
func SetCachedVideo(videoID string, data interface{}, ttlSeconds int) error {
if DB == nil {
return nil
}
jsonData, err := json.Marshal(data)
if err != nil {
return err
}
expiresAt := time.Now().Add(time.Duration(ttlSeconds) * time.Second)
_, err = DB.Exec(
`INSERT OR REPLACE INTO video_cache (video_id, data, expires_at) VALUES (?, ?, ?)`,
videoID, string(jsonData), expiresAt,
)
if err != nil {
log.Printf("Cache store error: %v", err)
}
return err
}
// CleanExpiredCache removes expired cache entries
func CleanExpiredCache() {
if DB == nil {
return
}
result, err := DB.Exec(`DELETE FROM video_cache WHERE expires_at < ?`, time.Now())
if err != nil {
log.Printf("Cache cleanup error: %v", err)
return
}
rows, _ := result.RowsAffected()
if rows > 0 {
log.Printf("Cleaned %d expired cache entries", rows)
}
}
// StartCacheCleanupScheduler runs periodic cache cleanup
func StartCacheCleanupScheduler() {
go func() {
ticker := time.NewTicker(1 * time.Hour)
for range ticker.C {
CleanExpiredCache()
}
}()
}