// Copyright (C) 2022 Marius Schellenberger package server import "context" type ScanQueue struct { ctx context.Context srv *HTTPServer jobs chan job } type job struct { path string callback func() } func NewScanQueue(ctx context.Context, srv *HTTPServer, buffer int) *ScanQueue { return &ScanQueue{ ctx: ctx, srv: srv, jobs: make(chan job, buffer), } } func (sq *ScanQueue) Add(path string, callback func()) (err error) { err = sq.srv.FS.AddScan(path) if err != nil { return } go func() { select { case <-sq.ctx.Done(): return case sq.jobs <- job{path, callback}: } }() return } func (sq *ScanQueue) Scan() { for { select { case <-sq.ctx.Done(): //close(sq.jobs) return case j := <-sq.jobs: sq.scanFile(j) } } } func (sq *ScanQueue) scanFile(j job) { srv := sq.srv path := j.path if j.callback != nil { defer j.callback() } defer srv.FS.RemoveScan(path) log := srv.Log.WithValues("file", path) file, txt, err := srv.Scanner.Scan(path) if err != nil { log.Error(err, "error scanning file") return } tags, err := srv.DB.GetAllRTags() if err != nil { log.Error(err, "error getting tags") } found := tags.Match(txt) id, err := srv.DB.Index.Add(txt, found) if err != nil { log.Error(err, "error adding file to index") return } err = srv.DB.NewFile(id, file, found) if err != nil { log.Error(err, "error adding file to DB") } }