browser init refactoring
This commit is contained in:
parent
ab3c292307
commit
509af26a61
60
browsers.go
60
browsers.go
@ -13,6 +13,7 @@ import (
|
||||
"gomark/database"
|
||||
"gomark/index"
|
||||
"gomark/parsing"
|
||||
"gomark/profiles"
|
||||
"gomark/tree"
|
||||
"gomark/watch"
|
||||
"io"
|
||||
@ -48,11 +49,10 @@ 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
|
||||
Shutdown() // Graceful shutdown, it should call the BaseBrowser.Close()
|
||||
Load() error // Loads bookmarks to db without watching
|
||||
Shutdown() // Graceful shutdown, it should call the BaseBrowser.Close()
|
||||
}
|
||||
|
||||
// Base browser class serves as reference for implmented browser types
|
||||
@ -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
|
||||
}
|
||||
|
||||
err = bw.BufferDB.Close()
|
||||
if err != nil {
|
||||
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)
|
||||
|
18
chrome.go
18
chrome.go
@ -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() {
|
||||
|
16
commands.go
16
commands.go
@ -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()
|
||||
}
|
||||
|
||||
|
150
firefox.go
150
firefox.go
@ -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) {
|
||||
|
@ -9,5 +9,6 @@ const (
|
||||
)
|
||||
|
||||
var (
|
||||
log = logging.GetLogger("FF")
|
||||
log = logging.GetLogger("FF")
|
||||
ConfigFolder = "$HOME/.mozilla/firefox"
|
||||
)
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user