, getPageA
, putPageA
+
+ , 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
-data Storage = Storage -- FIXME
+getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
+getPageA = arrIO2 . getPage
-mkStorage :: Storage -- FIXME
-mkStorage = Storage
+putPageA :: ArrowIO a => Storage -> a Page StatusCode
+putPageA = arrIO . putPage
-getPage :: MonadIO m => Storage -> PageName -> m (Maybe Page)
-getPage sto name
- = liftIO $ 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 :: MonadIO m => Storage -> Maybe RevNum -> Page -> m ()
-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