18 import Control.Arrow.ArrowIO
19 import Control.Concurrent.STM
21 import Control.Monad.Trans
23 import Network.HTTP.Lucu
25 import Rakka.Storage.Impl
26 import Rakka.Storage.Types
27 import Subversion.Types
29 import Subversion.Repository
30 import Text.HyperEstraier hiding (WriteLock)
33 mkStorage :: FilePath -> Repository -> (Page -> IO Document) -> IO Storage
34 mkStorage lsdir repos mkDraft
35 = do chan <- startIndexManager lsdir repos mkDraft
44 getPage :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m (Maybe Page)
45 getPage = ((liftIO .) .) . getPage' . stoRepository
48 putPage :: MonadIO m => Storage -> Page -> m StatusCode
50 = liftIO $ do st <- putPage' (stoRepository sto) page
55 getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
56 getPageA = arrIO2 . getPage
59 putPageA :: ArrowIO a => Storage -> a Page StatusCode
60 putPageA = arrIO . putPage
63 searchPages :: MonadIO m => Storage -> Condition -> m [(PageName, RevNum)]
66 do var <- newEmptyTMVarIO
67 atomically $ writeTChan (stoIndexChan sto) (SearchIndex cond var)
68 atomically $ takeTMVar var
71 rebuildIndex :: MonadIO m => Storage -> m ()
73 = liftIO $ atomically $ writeTChan (stoIndexChan sto) RebuildIndex
76 syncIndex :: Storage -> IO ()
78 = atomically $ writeTChan (stoIndexChan sto) SyncIndex