23 import Control.Arrow.ArrowIO
24 import Control.Concurrent.STM
26 import Control.Monad.Trans
28 import Network.HTTP.Lucu
30 import Rakka.Storage.Impl
31 import Rakka.Storage.Types
32 import Subversion.Types
34 import Subversion.Repository
35 import Text.HyperEstraier hiding (WriteLock)
38 mkStorage :: FilePath -> Repository -> (Page -> IO Document) -> IO Storage
39 mkStorage lsdir repos mkDraft
40 = do chan <- startIndexManager lsdir repos mkDraft
49 getPage :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m (Maybe Page)
50 getPage = ((liftIO .) .) . getPage' . stoRepository
53 putPage :: MonadIO m => Storage -> Maybe String -> Page -> m StatusCode
54 putPage sto userID page
55 = liftIO $ do st <- putPage' (stoRepository sto) userID page
60 deletePage :: MonadIO m => Storage -> Maybe String -> PageName -> m StatusCode
61 deletePage sto userID name
62 = liftIO $ do st <- deletePage' (stoRepository sto) userID name
67 getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
68 getPageA = arrIO2 . getPage
71 putPageA :: ArrowIO a => Storage -> a (Maybe String, Page) StatusCode
72 putPageA = arrIO2 . putPage
75 deletePageA :: ArrowIO a => Storage -> a (Maybe String, PageName) StatusCode
76 deletePageA = arrIO2 . deletePage
79 getDirContents :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m [PageName]
80 getDirContents = ((liftIO .) .) . getDirContents' . stoRepository
83 getDirContentsA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) [PageName]
84 getDirContentsA = arrIO2 . getDirContents
87 searchPages :: MonadIO m => Storage -> Condition -> m [(PageName, RevNum)]
90 do var <- newEmptyTMVarIO
91 atomically $ writeTChan (stoIndexChan sto) (SearchIndex cond var)
92 atomically $ takeTMVar var
95 rebuildIndex :: MonadIO m => Storage -> m ()
97 = liftIO $ atomically $ writeTChan (stoIndexChan sto) RebuildIndex
100 syncIndex :: Storage -> IO ()
102 = atomically $ writeTChan (stoIndexChan sto) SyncIndex