docstore/pkg/server/queue.go
2022-10-06 18:48:41 +02:00

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")
}
}