mirror of
https://github.com/mickael-kerjean/filestash.git
synced 2025-11-01 10:56:31 +08:00
70 lines
1.4 KiB
Go
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]
|
|
}
|