Files
2025-08-17 18:46:42 +10:00

70 lines
1.4 KiB
Go

package plg_search_sqlitefts
import (
"container/heap"
"sync"
. "github.com/mickael-kerjean/filestash/server/common"
"github.com/mickael-kerjean/filestash/server/plugin/plg_search_sqlitefts/indexer"
)
var DaemonState = daemonState{
idx: make([]Crawler, 0),
n: -1,
}
type daemonState struct {
idx []Crawler
n int
mu sync.RWMutex
}
type Crawler struct {
Id string
FoldersUnknown HeapDoc
CurrentPhase string
Backend IBackend
State indexer.Index
mu sync.Mutex
}
func NewCrawler(id string, b IBackend) (Crawler, error) {
s := Crawler{
Id: id,
Backend: b,
State: indexer.NewIndex(id),
FoldersUnknown: make(HeapDoc, 0, 1),
}
if err := s.State.Init(); err != nil {
return s, err
}
heap.Init(&s.FoldersUnknown)
return s, nil
}
func GetCrawler(app *App) *Crawler {
id := GenerateID(app.Session)
DaemonState.mu.RLock()
defer DaemonState.mu.RUnlock()
for i := len(DaemonState.idx) - 1; i >= 0; i-- {
if id == DaemonState.idx[i].Id {
return &DaemonState.idx[i]
}
}
return nil
}
func NextCrawler() *Crawler {
DaemonState.mu.Lock()
defer DaemonState.mu.Unlock()
if len(DaemonState.idx) == 0 {
return nil
}
if DaemonState.n >= len(DaemonState.idx)-1 || DaemonState.n < 0 {
DaemonState.n = 0
} else {
DaemonState.n = DaemonState.n + 1
}
return &DaemonState.idx[DaemonState.n]
}