browser init refactoring

This commit is contained in:
Chakib Ben Ziane 2019-03-01 18:30:50 +01:00
parent ab3c292307
commit 509af26a61
6 changed files with 155 additions and 100 deletions

View File

@ -13,6 +13,7 @@ import (
"gomark/database"
"gomark/index"
"gomark/parsing"
"gomark/profiles"
"gomark/tree"
"gomark/watch"
"io"
@ -48,10 +49,9 @@ type BrowserPaths struct {
type IBrowser interface {
IWatchable
InitBuffer() error // init buffer db, TODO: defer closings and shutdown
InitIndex() // Creates in memory Index (RB-Tree)
Init() error // browser initializiation goes here
RegisterHooks(...parsing.Hook)
Load() // Loads bookmarks to db without watching
Load() error // Loads bookmarks to db without watching
Shutdown() // Graceful shutdown, it should call the BaseBrowser.Close()
}
@ -93,6 +93,12 @@ type BaseBrowser struct {
parseHooks []parsing.Hook
io.Closer // Close database connections
baseInit bool
bufferInit bool
//TODO: profile manager here
ProfileManager profiles.ProfileManager
}
func (bw *BaseBrowser) GetWatcher() *Watcher {
@ -103,22 +109,26 @@ func (bw *BaseBrowser) GetWatcher() *Watcher {
}
return nil
}
func (bw *BaseBrowser) Load() {
log.Debug("BaseBrowser Load()")
func (bw *BaseBrowser) Load() error {
log.Debug("base loader")
bw.InitIndex()
if !bw.baseInit {
return fmt.Errorf("base init on <%s> missing, call Init() on BaseBrowser !", bw.name)
}
// Check if cache is initialized
if CacheDB == nil || CacheDB.Handle == nil {
log.Criticalf("<%s> Loading bookmarks while cache not yet initialized !", bw.name)
return fmt.Errorf("<%s> Loading bookmarks while cache not yet initialized !", bw.name)
}
// In case we use other types of watchers/events
if bw.useFileWatcher && bw.watcher == nil {
log.Warningf("<%s> watcher not initialized, use SetupFileWatcher() when creating the browser !", bw.name)
return fmt.Errorf("<%s> watcher not initialized, use SetupFileWatcher() when creating the browser !", bw.name)
}
log.Debugf("<%s> preloading bookmarks", bw.name)
return nil
}
func (bw *BaseBrowser) GetBookmarksPath() string {
@ -189,23 +199,40 @@ func (bw *BaseBrowser) Close() error {
return err
}
if bw.bufferInit {
err = bw.BufferDB.Close()
if err != nil {
return err
}
}
return nil
}
func (bw *BaseBrowser) Shutdown() {
err := bw.Close()
func (b *BaseBrowser) Shutdown() {
err := b.Close()
if err != nil {
log.Critical(err)
}
}
func (b *BaseBrowser) InitIndex() {
func (b *BaseBrowser) Init() error {
log.Debug("base init")
// Init browser buffer
err := b.initBuffer()
if err != nil {
return err
}
b.bufferInit = true
// Creates in memory Index (RB-Tree)
b.URLIndex = index.NewIndex()
b.baseInit = true
return nil
}
func (b *BaseBrowser) RebuildIndex() {
@ -222,7 +249,8 @@ func (b *BaseBrowser) RebuildNodeTree() {
}
}
func (b *BaseBrowser) InitBuffer() error {
// init buffer db, TODO: defer closings and shutdown
func (b *BaseBrowser) initBuffer() error {
var err error
bufferName := fmt.Sprintf("buffer_%s", b.name)

View File

@ -91,9 +91,6 @@ func NewChromeBrowser() IBrowser {
browser.NodeTree = &tree.Node{Name: "root", Parent: nil, Type: "root"}
browser.useFileWatcher = true
// Across jobs buffer
browser.InitBuffer()
// Create watch objects, we will watch the basedir for create events
watchedEvents := []fsnotify.Op{fsnotify.Create}
w := &Watch{
@ -118,11 +115,22 @@ func (bw *ChromeBrowser) Watch() bool {
return false
}
func (bw *ChromeBrowser) Load() {
func (bw *ChromeBrowser) Init() error {
log.Debug("chrome init")
return bw.BaseBrowser.Init()
}
func (bw *ChromeBrowser) Load() error {
// BaseBrowser load method
bw.BaseBrowser.Load()
err := bw.BaseBrowser.Load()
if err != nil {
return err
}
bw.Run()
return nil
}
func (bw *ChromeBrowser) Run() {

View File

@ -43,7 +43,21 @@ func startServer(c *cli.Context) {
for _, b := range browsers {
defer b.Shutdown()
b.RegisterHooks(parsing.ParseTags)
b.Load()
err := b.Init()
if err != nil {
log.Critical(err)
b.Shutdown()
continue
}
err = b.Load()
if err != nil {
log.Critical(err)
b.Shutdown()
continue
}
b.Watch()
}

View File

@ -5,6 +5,7 @@ package main
import (
"database/sql"
"errors"
"fmt"
"gomark/database"
"gomark/mozilla"
"gomark/parsing"
@ -121,7 +122,6 @@ func FFPlacesUpdateHook(op int, db string, table string, rowid int64) {
// In case of critical errors degrade the browser to only log errors and disable
// all directives
func NewFFBrowser() IBrowser {
var err error
browser := new(FFBrowser)
browser.name = "firefox"
@ -133,76 +133,6 @@ func NewFFBrowser() IBrowser {
browser.NodeTree = &tree.Node{Name: "root", Parent: nil, Type: "root"}
browser.tagMap = make(map[sqlid]*tree.Node)
// Initialize `places.sqlite`
bookmarkPath := path.Join(browser.baseDir, browser.bkFile)
// Check if BookmarkPath exists
exists, err := utils.CheckFileExists(bookmarkPath)
if err != nil {
log.Critical(err)
log.Critical(ErrInitFirefox)
return nil
}
if !exists {
log.Criticalf("Bookmark path <%s> does not exist", bookmarkPath)
log.Critical(ErrInitFirefox)
return nil
}
opts := mozilla.Config.PlacesDSN
browser.places, err = database.New("places",
bookmarkPath,
database.DBTypeFileDSN, opts).Init()
if err != nil {
//Check Lock Error
if err == database.ErrVfsLocked {
// Try to unlock db
e := mozilla.UnlockPlaces()
if e != nil {
log.Panic(e)
}
} else {
log.Panic(err)
}
}
// Buffer that lives accross Run() jobs
browser.InitBuffer()
// Setup watcher
expandedBaseDir, err := filepath.EvalSymlinks(browser.baseDir)
if err != nil {
log.Critical(err)
}
w := &Watch{
Path: expandedBaseDir,
EventTypes: []fsnotify.Op{fsnotify.Write},
EventNames: []string{filepath.Join(expandedBaseDir, "places.sqlite-wal")},
ResetWatch: false,
}
browser.SetupFileWatcher(w)
/*
*Run reducer to avoid duplicate running of jobs
*when a batch of events is received
*/
browser.eventsChan = make(chan fsnotify.Event, EventsChanLen)
go utils.ReduceEvents(MozMinJobInterval, browser.eventsChan, browser)
//
//
//
//
//
return browser
}
@ -229,8 +159,80 @@ func (bw *FFBrowser) Watch() bool {
return false
}
func (bw *FFBrowser) Load() {
bw.BaseBrowser.Load()
func (browser *FFBrowser) Init() error {
log.Debug("ff init")
// Initialize `places.sqlite`
bookmarkPath := path.Join(browser.baseDir, browser.bkFile)
// Check if BookmarkPath exists
exists, err := utils.CheckFileExists(bookmarkPath)
if err != nil {
log.Critical(err)
return ErrInitFirefox
}
if !exists {
return fmt.Errorf("Bookmark path <%s> does not exist", bookmarkPath)
}
opts := mozilla.Config.PlacesDSN
browser.places, err = database.New("places",
bookmarkPath,
database.DBTypeFileDSN, opts).Init()
if err != nil {
//Check Lock Error
if err == database.ErrVfsLocked {
// Try to unlock db
e := mozilla.UnlockPlaces()
if e != nil {
return e
}
} else {
return err
}
}
// Setup watcher
expandedBaseDir, err := filepath.EvalSymlinks(browser.baseDir)
if err != nil {
return err
}
w := &Watch{
Path: expandedBaseDir,
EventTypes: []fsnotify.Op{fsnotify.Write},
EventNames: []string{filepath.Join(expandedBaseDir, "places.sqlite-wal")},
ResetWatch: false,
}
browser.SetupFileWatcher(w)
/*
*Run reducer to avoid duplicate running of jobs
*when a batch of events is received
*/
browser.eventsChan = make(chan fsnotify.Event, EventsChanLen)
go utils.ReduceEvents(MozMinJobInterval, browser.eventsChan, browser)
// Base browser init
err = browser.BaseBrowser.Init()
return err
}
func (bw *FFBrowser) Load() error {
err := bw.BaseBrowser.Load()
if err != nil {
return err
}
// Parse bookmarks to a flat tree (for compatibility with tree system)
start := time.Now()
@ -266,6 +268,8 @@ func (bw *FFBrowser) Load() {
bw.BufferDB.SyncTo(CacheDB)
}
go CacheDB.SyncToDisk(database.GetDBFullPath())
return err
}
func getFFBookmarks(bw *FFBrowser) {

View File

@ -10,4 +10,5 @@ const (
var (
log = logging.GetLogger("FF")
ConfigFolder = "$HOME/.mozilla/firefox"
)

View File

@ -7,6 +7,7 @@ import (
"gomark/config"
"gomark/profiles"
"gomark/utils"
"os"
"path/filepath"
"regexp"
@ -22,7 +23,6 @@ const (
)
var (
ConfigFolder = ".mozilla/firefox"
ReIniProfiles = regexp.MustCompile(`(?i)profile`)
firefoxProfile = &ProfileGetter{
@ -140,13 +140,13 @@ func (pm *FFProfileManager) ListProfiles() ([]string, error) {
}
func initFirefoxConfig() {
log.Debug("Initializing firefox config")
ConfigFolder = filepath.Join(utils.GetHomeDir(), ConfigFolder)
log.Debug("initializing firefox config")
ConfigFolder = filepath.Join(os.ExpandEnv(ConfigFolder))
// Check if base folder exists
configFolderExists, err := utils.CheckDirExists(ConfigFolder)
if !configFolderExists {
log.Criticalf("The base firefox folder <%s> does not exist",
log.Criticalf("the base firefox folder <%s> does not exist",
ConfigFolder)
}