From b1f3760e06266da69c19b3dc05ea5750b9f30bab Mon Sep 17 00:00:00 2001 From: Mats Rauhala Date: Sun, 3 Jan 2021 09:18:04 +0200 Subject: [PATCH] Query bookmarks from firefox N+1 queries :/ --- src/Operations/Import/Firefox.hs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/Operations/Import/Firefox.hs b/src/Operations/Import/Firefox.hs index 9671aa7..b36b970 100644 --- a/src/Operations/Import/Firefox.hs +++ b/src/Operations/Import/Firefox.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} {-| Module : Operations.Import.Firefox Description : Imports from firefox @@ -14,6 +16,9 @@ module Operations.Import.Firefox where import Conduit import qualified Data.Conduit.Combinators as C +import Data.Text + (Text) + import System.FilePath (takeFileName, ()) @@ -25,6 +30,14 @@ import System.Environment import GHC.Stack +import Control.Lens + (makeLenses) + +import qualified Database.SQLite.Simple as SQL + +import Data.Traversable + (for) + -- select p.title, p.url from moz_bookmarks b join moz_places p on b.fk = p.id -- -- select keyword from moz_keywords where place_id = ? @@ -34,6 +47,15 @@ newtype ImportException deriving stock (Show) deriving anyclass (Exception) +data Firefox + = Firefox { _url :: Text + , _title :: Text + , _keywords :: [Text] + } + deriving stock (Show, Eq) + +makeLenses ''Firefox + stores :: MonadResource m => MonadThrow m @@ -45,3 +67,10 @@ stores = liftIO (lookupEnv "HOME") >>= maybe (throwM (HomeNotFound callStack)) l listStores home = sourceDirectoryDeep False (home ".mozilla/firefox") .| C.filter (\p -> takeFileName p == "places.sqlite") + +bookmarks :: MonadIO m => FilePath -> m [Firefox] +bookmarks path = liftIO $ SQL.withConnection path $ \conn -> do + elems <- SQL.query_ conn "select p.id, p.title, p.url from moz_bookmarks b join moz_places p on b.fk = p.id" + for elems $ \(_id, _title, _url) -> do + _keywords <- fmap SQL.fromOnly <$> SQL.query conn "select keyword from moz_keywords where place_id = ?" (SQL.Only @Int _id) + pure Firefox{..}