X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FStorage.hs;h=d88a336506a23dd162278ec8b69930ab18a46879;hb=044a917ed3908780479b759ac772e1545616c7fc;hp=7a0d0c212997aef4a51f619678ee803c1823d501;hpb=03585f9c5773f6c0b59497f4f563909576c402b5;p=Rakka.git diff --git a/Rakka/Storage.hs b/Rakka/Storage.hs index 7a0d0c2..d88a336 100644 --- a/Rakka/Storage.hs +++ b/Rakka/Storage.hs @@ -5,38 +5,88 @@ module Rakka.Storage , getPage , putPage + , deletePage , getPageA , putPageA + , deletePageA + + , searchPages + + , rebuildIndex ) where import Control.Arrow.ArrowIO +import Control.Concurrent.STM +import Control.Monad +import Control.Monad.Trans +import Data.Maybe +import Network.HTTP.Lucu import Rakka.Page -import Rakka.Storage.DefaultPage +import Rakka.Storage.Impl +import Rakka.Storage.Types import Subversion.Types +import System.IO +import Subversion.Repository +import Text.HyperEstraier hiding (WriteLock) + + +mkStorage :: FilePath -> Repository -> (Page -> IO Document) -> IO Storage +mkStorage lsdir repos mkDraft + = do chan <- startIndexManager lsdir repos mkDraft + let sto = Storage { + stoRepository = repos + , stoIndexChan = chan + } + syncIndex sto + return sto + + +getPage :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m (Maybe Page) +getPage = ((liftIO .) .) . getPage' . stoRepository + + +putPage :: MonadIO m => Storage -> Page -> m StatusCode +putPage sto page + = liftIO $ do st <- putPage' (stoRepository sto) page + syncIndex sto + return st + + +deletePage :: MonadIO m => Storage -> PageName -> m StatusCode +deletePage sto name + = liftIO $ do st <- deletePage' (stoRepository sto) name + syncIndex sto + return st + +getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page) +getPageA = arrIO2 . getPage -data Storage = Storage -- FIXME +putPageA :: ArrowIO a => Storage -> a Page StatusCode +putPageA = arrIO . putPage -mkStorage :: IO Storage -- FIXME -mkStorage = return Storage +deletePageA :: ArrowIO a => Storage -> a PageName StatusCode +deletePageA = arrIO . deletePage -getPage :: Storage -> PageName -> IO (Maybe Page) -getPage sto name - = loadDefaultPage name -- FIXME +searchPages :: MonadIO m => Storage -> Condition -> m [(PageName, RevNum)] +searchPages sto cond + = liftIO $ + do var <- newEmptyTMVarIO + atomically $ writeTChan (stoIndexChan sto) (SearchIndex cond var) + atomically $ takeTMVar var -putPage :: Storage -> Maybe RevNum -> Page -> IO () -putPage sto oldRev page - = error "FIXME: not implemented" +rebuildIndex :: MonadIO m => Storage -> m () +rebuildIndex sto + = liftIO $ atomically $ writeTChan (stoIndexChan sto) RebuildIndex -getPageA :: ArrowIO a => Storage -> a PageName (Maybe Page) -getPageA = arrIO . getPage +syncIndex :: Storage -> IO () +syncIndex sto + = atomically $ writeTChan (stoIndexChan sto) SyncIndex -putPageA :: ArrowIO a => Storage -> a (Maybe RevNum, Page) () -putPageA = arrIO2 . putPage \ No newline at end of file