]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - Rakka/Storage.hs
continue working on page search
[Rakka.git] / Rakka / Storage.hs
index d830131d962b5c2eeb6fb3f6acc43e113a14650a..03b8c54134c3a3316e03bb18c57c145b3583d831 100644 (file)
 module Rakka.Storage
     ( Storage
 
+    -- re-export from Rakka.Storage.Types
+    , SearchResult(..) 
+    , SnippetFragment(..)
+
     , mkStorage -- private
 
     , getPage
-    , savePage
+    , putPage
+    , deletePage
+
+    , getPageA
+    , putPageA
+    , deletePageA
+
+    , getAttachment
+    , putAttachment
+
+    , getDirContents
+    , getDirContentsA
+
+    , 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.Attachment
 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 -> Maybe String -> Page -> m StatusCode
+putPage sto userID page
+    = liftIO $ do st <- putPage' (stoRepository sto) userID page
+                  syncIndex sto
+                  return st
+
+
+deletePage :: MonadIO m => Storage -> Maybe String -> PageName -> m StatusCode
+deletePage sto userID name
+    = liftIO $ do st <- deletePage' (stoRepository sto) userID name
+                  syncIndex sto
+                  return st
+
+
+getPageA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) (Maybe Page)
+getPageA = arrIO2 . getPage 
+
+
+putPageA :: ArrowIO a => Storage -> a (Maybe String, Page) StatusCode
+putPageA = arrIO2 . putPage
+
+
+deletePageA :: ArrowIO a => Storage -> a (Maybe String, PageName) StatusCode
+deletePageA = arrIO2 . deletePage
+
+
+getDirContents :: MonadIO m => Storage -> PageName -> Maybe RevNum -> m [PageName]
+getDirContents = ((liftIO .) .) . getDirContents' . stoRepository
+
+
+getDirContentsA :: ArrowIO a => Storage -> a (PageName, Maybe RevNum) [PageName]
+getDirContentsA = arrIO2 . getDirContents
+
+
+searchPages :: MonadIO m => Storage -> Condition -> m [SearchResult]
+searchPages sto cond
+    = liftIO $
+      do var <- newEmptyTMVarIO
+         atomically $ writeTChan (stoIndexChan sto) (SearchIndex cond var)
+         atomically $ takeTMVar var
 
 
-data Storage = Storage -- FIXME
+rebuildIndex :: MonadIO m => Storage -> m ()
+rebuildIndex sto
+    = liftIO $ atomically $ writeTChan (stoIndexChan sto) RebuildIndex
 
 
-mkStorage :: IO Storage -- FIXME
-mkStorage = return Storage
+syncIndex :: Storage -> IO ()
+syncIndex sto
+    = atomically $ writeTChan (stoIndexChan sto) SyncIndex
 
 
-getPage :: Storage -> PageName -> IO (Maybe Page)
-getPage sto name
-    = loadDefaultPage name -- FIXME
+getAttachment :: (Attachment a, MonadIO m) =>
+                 Storage
+              -> PageName
+              -> String
+              -> Maybe RevNum
+              -> m (Maybe a)
+getAttachment = (((liftIO .) .) .) . getAttachment' . stoRepository
 
 
-savePage :: Storage -> PageName -> Page -> IO ()
-savePage sto name page
-    = error "FIXME: not implemented"
+putAttachment :: (Attachment a, MonadIO m) =>
+                 Storage
+              -> Maybe String
+              -> Maybe RevNum
+              -> PageName
+              -> String
+              -> a
+              -> m StatusCode
+putAttachment = (((((liftIO .) .) .) .) .) . putAttachment' . stoRepository