80 lines
1.4 KiB
Go
80 lines
1.4 KiB
Go
// 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")
|
|
}
|
|
}
|