X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FStorage%2FImpl.hs;h=3b48f0c10150c50c5550664cd5d9c47df81669ed;hb=23977989ef4be7316b1c2c3f709ca1e8e6bb7f84;hp=2c36f516c2a012dfe64189ca3adaca0fa5da924c;hpb=044a917ed3908780479b759ac772e1545616c7fc;p=Rakka.git diff --git a/Rakka/Storage/Impl.hs b/Rakka/Storage/Impl.hs index 2c36f51..3b48f0c 100644 --- a/Rakka/Storage/Impl.hs +++ b/Rakka/Storage/Impl.hs @@ -2,13 +2,13 @@ module Rakka.Storage.Impl ( getPage' , putPage' , deletePage' + , getDirContents' , startIndexManager ) where import Control.Concurrent import Control.Concurrent.STM -import Control.Exception import Control.Monad import Data.Maybe import Data.Set (Set) @@ -26,9 +26,6 @@ import System.Directory import System.FilePath import System.IO import System.Log.Logger -import System.Posix.Files -import System.Posix.Types -import System.Posix.IO import Text.HyperEstraier hiding (WriteLock) @@ -44,11 +41,11 @@ getPage' repos name rev p -> return p -putPage' :: Repository -> Page -> IO StatusCode +putPage' :: Repository -> Maybe String -> Page -> IO StatusCode putPage' = putPageIntoRepository -deletePage' :: Repository -> PageName -> IO StatusCode +deletePage' :: Repository -> Maybe String -> PageName -> IO StatusCode deletePage' = deletePageFromRepository @@ -67,6 +64,13 @@ findChangedPages repos oldRev newRev return . S.unions +getDirContents' :: Repository -> PageName -> Maybe RevNum -> IO [PageName] +getDirContents' repos name rev + = do reposPages <- getDirContentsInRevision repos name rev + defaultPages <- getDefaultDirContents name + return $ S.toList (reposPages `S.union` defaultPages) + + getCurrentRevNum :: Repository -> IO RevNum getCurrentRevNum repos = getRepositoryFS repos >>= getYoungestRev @@ -127,6 +131,7 @@ openIndex indexDir revFile $ removeFile revFile Right index <- openDatabase indexDir (Writer [Create []]) + addAttrIndex index "@type" StrIndex addAttrIndex index "@uri" SeqIndex addAttrIndex index "rakka:revision" SeqIndex noticeM logger ("Created an H.E. index on " ++ indexDir) @@ -187,37 +192,15 @@ updateIndex index repos mkDraft rev name updateIndexRev :: FilePath -> (RevNum -> IO RevNum) -> IO () -updateIndexRev revFile f = bracket acquireLock releaseLock update +updateIndexRev revFile f = withFile revFile ReadWriteMode update where - acquireLock :: IO Fd - acquireLock - = do fd <- openFd revFile ReadWrite (Just stdFileMode) defaultFileFlags - waitToSetLock fd (WriteLock, AbsoluteSeek, 0, 0) - return fd - - releaseLock :: Fd -> IO () - releaseLock fd - = setLock fd (Unlock, AbsoluteSeek, 0, 0) - - update :: Fd -> IO () - update fd - = do fdSeek fd AbsoluteSeek 0 - size <- return . fromIntegral . fileSize =<< getFdStatus fd - (revStr, gotSize) <- fdRead fd size - when (size /= gotSize) $ fail ("read " ++ show gotSize ++ - " bytes but expected " ++ show size ++ " bytes") - - let rev = case revStr of - "" -> 0 - _ -> read revStr - - rev' <- f rev - - let revStr' = show rev' ++ "\n" - size' = fromIntegral $ length revStr' - - fdSeek fd AbsoluteSeek 0 - setFdSize fd 0 - wroteSize <- fdWrite fd revStr' - when (size' /= wroteSize) $ fail ("wrote " ++ show wroteSize ++ - " bytes but expected " ++ show size' ++ " bytes") + update :: Handle -> IO () + update h = do eof <- hIsEOF h + rev <- if eof then + return 0 + else + hGetLine h >>= return . read + rev' <- f rev + hSeek h AbsoluteSeek 0 + hSetFileSize h 0 + hPutStrLn h (show rev')