2018-06-08 16:27:33 +00:00
package main
2018-06-14 00:30:18 +00:00
import (
2018-10-23 20:14:54 +00:00
"fmt"
2018-06-14 14:42:54 +00:00
"path"
2018-06-14 00:30:18 +00:00
)
2018-06-08 16:27:33 +00:00
var Firefox = BrowserPaths {
"places.sqlite" ,
"/home/spike/.mozilla/firefox/p1rrgord.default/" ,
}
2018-10-23 20:14:54 +00:00
const (
MozPlacesRootID = 1
MozPlacesTagsRootID = 4
MozPlacesMobileRootID = 6
)
2018-06-08 16:27:33 +00:00
type FFBrowser struct {
BaseBrowser //embedding
2018-10-23 20:14:54 +00:00
_places * DB
}
type FFTag struct {
id int
title string
2018-06-08 16:27:33 +00:00
}
func NewFFBrowser ( ) IBrowser {
browser := & FFBrowser { }
browser . name = "firefox"
browser . bType = TFirefox
browser . baseDir = Firefox . BookmarkDir
browser . bkFile = Firefox . BookmarkFile
browser . Stats = & ParserStats { }
browser . NodeTree = & Node { Name : "root" , Parent : nil }
// Across jobs buffer
browser . InitBuffer ( )
browser . SetupWatcher ( )
2018-10-23 20:14:54 +00:00
/ *
* Run debouncer to avoid duplicate running of jobs
* when a batch of events is received
* /
//browser.eventsChan = make(chan fsnotify.Event, EventsChanLen)
//go debouncer(3000*time.Millisecond, browser.eventsChan, browser)
2018-06-14 00:30:18 +00:00
2018-06-08 16:27:33 +00:00
return browser
}
func ( bw * FFBrowser ) Watch ( ) bool {
2018-10-23 20:14:54 +00:00
log . Debugf ( "<%s> NOT IMPLEMENTED! " , bw . name )
//if !bw.isWatching {
//go WatcherThread(bw)
//bw.isWatching = true
//return true
//}
2018-06-08 16:27:33 +00:00
2018-10-23 20:14:54 +00:00
//return false
2018-06-08 16:27:33 +00:00
return false
}
func ( bw * FFBrowser ) Load ( ) {
bw . BaseBrowser . Load ( )
bw . Run ( )
}
2018-10-23 20:14:54 +00:00
func getTags ( bw * FFBrowser ) {
var tags [ ] * FFTag
QGetTags := "SELECT id,title from moz_bookmarks WHERE parent = %d"
rows , err := bw . _places . Handle . Query ( fmt . Sprintf ( QGetTags , MozPlacesTagsRootID ) )
logPanic ( err )
for rows . Next ( ) {
tag := & FFTag { }
err = rows . Scan ( & tag . id , & tag . title )
logPanic ( err )
tags = append ( tags , tag )
}
log . Debug ( len ( tags ) )
//bookmarksToBufferFromTags(bw, tag)
}
func bookmarksToBufferFromTag ( bw * FFBrowser , tag * FFTag ) {
log . Debugf ( "db cons: %d" , bw . _places . Handle . Stats ( ) . OpenConnections )
//log.Debugf("bookmarks for %s", tag.title)
QGetBookmarksForTag := ` SELECT moz_places . url , IFNULL ( moz_places . title , ' ' )
FROM moz_places
LEFT OUTER JOIN moz_bookmarks
ON moz_places . id = moz_bookmarks . fk
WHERE moz_bookmarks . parent = ? `
// WITH bookmarks AS (SELECT moz_places.url , moz_bookmarks.parent AS tagId FROM moz_places LEFT OUTER JOIN moz_bookmarks ON moz_places.id = moz_bookmarks.fk WHERE moz_bookmarks.parent IN (SELECT id FROM moz_bookmarks WHERE parent = 4 )) SELECT url, tagId, moz_bookmarks.title FROM bookmarks LEFT OUTER JOIN moz_bookmarks ON tagId = moz_bookmarks.id ORDER BY moz_bookmarks.title WHERE title = 'bitcoin'
rows , err := bw . _places . Handle . Query ( QGetBookmarksForTag , tag . id )
logPanic ( err )
//log.Debugf("Query is %s", fmt.Sprintf(QGetBookmarksForTag, tag.id))
for rows . Next ( ) {
var url string
var title string
err = rows . Scan ( & url , & title )
logPanic ( err )
//log.Debugf("%s ---> %s", tag.title, url)
}
//bk := new(Bookmark)
//bk.Tags = append(bk.Tags, tag.title)
}
2018-06-08 16:27:33 +00:00
func ( bw * FFBrowser ) Run ( ) {
2018-10-23 20:14:54 +00:00
log . Debugf ( "<%s> start bookmark parsing" , bw . name )
2018-06-08 16:27:33 +00:00
2018-10-23 20:14:54 +00:00
// TODO: Node tree is not used for now as the folder
// parsing is not implemented
2018-06-14 14:42:54 +00:00
// Rebuild node tree
2018-10-23 20:14:54 +00:00
// bw.NodeTree = &Node{Name: "root", Parent: nil}
2018-06-14 14:42:54 +00:00
// Open firefox sqlite db
bookmarkPath := path . Join ( bw . baseDir , bw . bkFile )
placesDB := DB { } . New ( "Places" , bookmarkPath )
placesDB . InitRO ( )
defer placesDB . Close ( )
2018-10-23 20:14:54 +00:00
bw . _places = placesDB
2018-06-14 14:42:54 +00:00
2018-10-23 20:14:54 +00:00
// Start parsing from the root node (id = 1, type = 2) and down the tree
2018-06-14 14:42:54 +00:00
2018-10-23 20:14:54 +00:00
// First get all tags and register them as nodes under the root node
getTags ( bw )
log . Debugf ( "<%s> finished parsing tags" , bw . name )
2018-06-14 14:42:54 +00:00
2018-06-08 16:27:33 +00:00
}