20 import Control.Arrow.ArrowIO
21 import Control.Concurrent.STM
23 import Control.Monad.Trans
25 import Network.HTTP.Lucu
27 import Rakka.Storage.Impl
28 import Rakka.Storage.Types
29 import Subversion.Types
31 import Subversion.Repository
32 import Text.HyperEstraier hiding (WriteLock)
35 mkStorage :: FilePath -> Repository -> (Page -> IO Document) -> IO Storage
36 mkStorage lsdir repos mkDraft
37 = do chan <- startIndexManager lsdir repos mkDraft
46 getPage :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m (Maybe Page)
47 getPage = ((liftIO .) .) . getPage' . stoRepository
50 putPage :: MonadIO m => Storage -> Page -> m StatusCode
52 = liftIO $ do st <- putPage' (stoRepository sto) page
57 deletePage :: MonadIO m => Storage -> PageName -> m StatusCode
59 = liftIO $ do st <- deletePage' (stoRepository sto) name
64 getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
65 getPageA = arrIO2 . getPage
68 putPageA :: ArrowIO a => Storage -> a Page StatusCode
69 putPageA = arrIO . putPage
72 deletePageA :: ArrowIO a => Storage -> a PageName StatusCode
73 deletePageA = arrIO . deletePage
76 searchPages :: MonadIO m => Storage -> Condition -> m [(PageName, RevNum)]
79 do var <- newEmptyTMVarIO
80 atomically $ writeTChan (stoIndexChan sto) (SearchIndex cond var)
81 atomically $ takeTMVar var
84 rebuildIndex :: MonadIO m => Storage -> m ()
86 = liftIO $ atomically $ writeTChan (stoIndexChan sto) RebuildIndex
89 syncIndex :: Storage -> IO ()
91 = atomically $ writeTChan (stoIndexChan sto) SyncIndex