1
Fork 0
photoview/api/scanner/periodic_scanner.go

92 lines
2.0 KiB
Go
Raw Normal View History

2020-09-21 12:34:56 +02:00
package scanner
import (
"log"
"sync"
"time"
2020-11-23 19:59:01 +01:00
"github.com/viktorstrate/photoview/api/graphql/models"
"gorm.io/gorm"
2020-09-21 12:34:56 +02:00
)
type periodicScanner struct {
ticker *time.Ticker
ticker_changed chan bool
mutex *sync.Mutex
db *gorm.DB
2020-09-21 12:34:56 +02:00
}
var mainPeriodicScanner *periodicScanner = nil
func getPeriodicScanInterval(db *gorm.DB) (time.Duration, error) {
2020-09-21 12:34:56 +02:00
2020-11-23 19:59:01 +01:00
var siteInfo models.SiteInfo
if err := db.First(&siteInfo).Error; err != nil {
2020-09-21 12:34:56 +02:00
return 0, err
}
2020-11-23 19:59:01 +01:00
return time.Duration(siteInfo.PeriodicScanInterval) * time.Second, nil
2020-09-21 12:34:56 +02:00
}
func InitializePeriodicScanner(db *gorm.DB) error {
2020-09-21 12:34:56 +02:00
if mainPeriodicScanner != nil {
panic("periodic scanner has already been initialized")
}
scanInterval, err := getPeriodicScanInterval(db)
if err != nil {
return err
}
mainPeriodicScanner = &periodicScanner{
db: db,
ticker_changed: make(chan bool),
mutex: &sync.Mutex{},
}
go scanIntervalRunner()
ChangePeriodicScanInterval(scanInterval)
return nil
}
func ChangePeriodicScanInterval(duration time.Duration) {
var new_ticker *time.Ticker = nil
if duration > 0 {
new_ticker = time.NewTicker(duration)
log.Printf("Periodic scan interval changed: %s", duration.String())
} else {
log.Print("Periodic scan interval changed: disabled")
}
{
mainPeriodicScanner.mutex.Lock()
defer mainPeriodicScanner.mutex.Unlock()
if mainPeriodicScanner.ticker != nil {
mainPeriodicScanner.ticker.Stop()
}
mainPeriodicScanner.ticker = new_ticker
mainPeriodicScanner.ticker_changed <- true
}
}
func scanIntervalRunner() {
for {
log.Print("Scan interval runner: Waiting for signal")
if mainPeriodicScanner.ticker != nil {
select {
case <-mainPeriodicScanner.ticker_changed:
log.Print("Scan interval runner: New ticker detected")
case <-mainPeriodicScanner.ticker.C:
log.Print("Scan interval runner: Starting periodic scan")
AddAllToQueue()
}
} else {
<-mainPeriodicScanner.ticker_changed
log.Print("Scan interval runner: New ticker detected")
}
}
}