2017-10-20 10:51:56 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2017-11-16 13:27:50 +00:00
|
|
|
"database/sql"
|
|
|
|
"path"
|
2017-11-09 20:27:03 +00:00
|
|
|
|
2017-10-20 10:51:56 +00:00
|
|
|
"github.com/fsnotify/fsnotify"
|
|
|
|
)
|
|
|
|
|
2017-11-16 13:27:50 +00:00
|
|
|
type bookmarkWatcher struct {
|
|
|
|
watcher *fsnotify.Watcher
|
|
|
|
baseDir string
|
|
|
|
bkFile string
|
|
|
|
parseFunc func(*bookmarkWatcher)
|
|
|
|
bufferDB *sql.DB
|
2017-11-17 18:06:34 +00:00
|
|
|
stats *parserStat
|
2017-11-16 13:27:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (bw *bookmarkWatcher) Close() error {
|
|
|
|
if err := bw.watcher.Close(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-11-19 16:00:37 +00:00
|
|
|
func (bw *bookmarkWatcher) Init(basedir string, bkfile string, bkType BrowserType) *bookmarkWatcher {
|
2017-11-16 13:27:50 +00:00
|
|
|
var err error
|
|
|
|
|
|
|
|
bw.baseDir = basedir
|
|
|
|
bw.bkFile = bkfile
|
|
|
|
|
2017-11-17 18:06:34 +00:00
|
|
|
bw.stats = &parserStat{}
|
|
|
|
|
2017-11-16 13:27:50 +00:00
|
|
|
bw.watcher, err = fsnotify.NewWatcher()
|
|
|
|
logPanic(err)
|
|
|
|
|
|
|
|
switch bkType {
|
|
|
|
case Chrome:
|
|
|
|
bw.parseFunc = googleParseBookmarks
|
|
|
|
}
|
|
|
|
|
|
|
|
return bw
|
|
|
|
}
|
|
|
|
|
2017-11-17 15:58:16 +00:00
|
|
|
func (bw *bookmarkWatcher) Preload() *bookmarkWatcher {
|
|
|
|
|
|
|
|
// Check if cache is initialized
|
2017-11-19 16:00:37 +00:00
|
|
|
if cacheDB == nil || cacheDB.handle == nil {
|
|
|
|
log.Critical("cache is not yet initialized !")
|
|
|
|
panic("cache is not yet initialized !")
|
2017-11-17 15:58:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if bw.watcher == nil {
|
|
|
|
log.Fatal("please run bookmarkWatcher.Init() first !")
|
|
|
|
}
|
|
|
|
|
2017-11-19 16:00:37 +00:00
|
|
|
debugPrint("preloading bookmarks")
|
2017-11-17 15:58:16 +00:00
|
|
|
bw.parseFunc(bw)
|
|
|
|
|
|
|
|
return bw
|
|
|
|
}
|
|
|
|
|
2017-11-16 13:27:50 +00:00
|
|
|
func (bw *bookmarkWatcher) Start() error {
|
|
|
|
|
|
|
|
if err := bw.watcher.Add(bw.baseDir); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
go bWatcherThread(bw, bw.parseFunc)
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func bWatcherThread(bw *bookmarkWatcher, parseFunc func(bw *bookmarkWatcher)) {
|
|
|
|
|
|
|
|
bookmarkPath := path.Join(bw.baseDir, bw.bkFile)
|
2017-11-19 16:00:37 +00:00
|
|
|
log.Infof("watching %s", bookmarkPath)
|
2017-11-16 13:27:50 +00:00
|
|
|
|
2017-11-09 20:27:03 +00:00
|
|
|
for {
|
|
|
|
select {
|
2017-11-16 13:27:50 +00:00
|
|
|
case event := <-bw.watcher.Events:
|
2017-10-20 10:51:56 +00:00
|
|
|
|
2017-11-09 20:27:03 +00:00
|
|
|
if event.Op&fsnotify.Create == fsnotify.Create &&
|
2017-11-16 13:27:50 +00:00
|
|
|
event.Name == bookmarkPath {
|
2017-10-20 10:51:56 +00:00
|
|
|
|
2017-11-16 14:43:09 +00:00
|
|
|
debugPrint("event: %v | eventName: %v", event.Op, event.Name)
|
2017-11-17 15:58:16 +00:00
|
|
|
//debugPrint("modified file: %s", event.Name)
|
|
|
|
//start := time.Now()
|
2017-11-16 13:27:50 +00:00
|
|
|
parseFunc(bw)
|
2017-11-17 15:58:16 +00:00
|
|
|
//elapsed := time.Since(start)
|
|
|
|
//debugPrint("parsed in %s", elapsed)
|
2017-10-20 10:51:56 +00:00
|
|
|
}
|
2017-11-16 13:27:50 +00:00
|
|
|
case err := <-bw.watcher.Errors:
|
2017-11-19 16:00:37 +00:00
|
|
|
log.Errorf("error: %s", err)
|
2017-10-20 10:51:56 +00:00
|
|
|
}
|
|
|
|
}
|
2017-11-16 13:27:50 +00:00
|
|
|
|
|
|
|
debugPrint("Exiting watch thread")
|
2017-10-20 10:51:56 +00:00
|
|
|
}
|