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

93 lines
2.1 KiB
Go

package periodic_scanner
import (
"log"
"sync"
"time"
"github.com/photoview/photoview/api/graphql/models"
"github.com/photoview/photoview/api/scanner/scanner_queue"
"gorm.io/gorm"
)
type periodicScanner struct {
ticker *time.Ticker
ticker_changed chan bool
mutex *sync.Mutex
db *gorm.DB
}
var mainPeriodicScanner *periodicScanner = nil
func getPeriodicScanInterval(db *gorm.DB) (time.Duration, error) {
var siteInfo models.SiteInfo
if err := db.First(&siteInfo).Error; err != nil {
return 0, err
}
return time.Duration(siteInfo.PeriodicScanInterval) * time.Second, nil
}
func InitializePeriodicScanner(db *gorm.DB) error {
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")
scanner_queue.AddAllToQueue()
}
} else {
<-mainPeriodicScanner.ticker_changed
log.Print("Scan interval runner: New ticker detected")
}
}
}