X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Rakka%2FStorage%2FImpl.hs;h=44df20de578b6c5741da70f2faa47b495a017f68;hb=9ff4eb243ae1545c62a5ab2eaf8dcb2f7c40b20d;hp=dd8b7c4c504f8ad40195334b8dbd3caa7eec86bb;hpb=126e9f3faff19add1fb3dea792ec10dc57c30f03;p=Rakka.git diff --git a/Rakka/Storage/Impl.hs b/Rakka/Storage/Impl.hs index dd8b7c4..44df20d 100644 --- a/Rakka/Storage/Impl.hs +++ b/Rakka/Storage/Impl.hs @@ -14,8 +14,11 @@ import qualified Data.Set as S import Network.URI import Rakka.Page import Rakka.Storage.DefaultPage +import Rakka.Storage.Repos import Rakka.Storage.Types import Subversion.Types +import Subversion.FileSystem +import Subversion.Repository import System.Directory import System.FilePath import System.IO @@ -23,16 +26,19 @@ import System.Log.Logger import System.Posix.Files import System.Posix.Types import System.Posix.IO -import Subversion.FileSystem -import Subversion.Repository import Text.HyperEstraier hiding (WriteLock) + +logger :: String logger = "Rakka.Storage" getPage' :: Repository -> PageName -> Maybe RevNum -> IO (Maybe Page) getPage' repos name rev - = loadDefaultPage name -- FIXME + = do page <- loadPageInRepository repos name rev + case page of + Nothing -> loadDefaultPage name + p -> return p findAllPages :: Repository -> RevNum -> IO (Set PageName) @@ -44,7 +50,7 @@ findAllPages repos rev findChangedPages :: Repository -> RevNum -> RevNum -> IO (Set PageName) findChangedPages repos 0 newRev = findAllPages repos newRev findChangedPages repos oldRev newRev - = fail "FIXME: not impl" + = findAllPages repos newRev -- FIXME getCurrentRevNum :: Repository -> IO RevNum @@ -66,12 +72,22 @@ startIndexManager lsdir repos mkDraft loop chan index = do req <- atomically $ readTChan chan case req of + RebuildIndex + -> do noticeM logger "Rebuilding the H.E. index..." + closeDatabase index + removeDirectoryRecursive indexDir + index' <- openIndex indexDir revFile + syncIndex' index' revFile repos mkDraft + loop chan index' + SyncIndex - -> syncIndex' index revFile repos mkDraft + -> do syncIndex' index revFile repos mkDraft + loop chan index + SearchIndex cond var -> do result <- searchIndex index cond atomically $ putTMVar var result - loop chan index + loop chan index -- casket を R/W モードで開く。成功したらそのまま返し、失敗したら @@ -85,8 +101,8 @@ openIndex indexDir revFile return index Left err - -> do warningM logger ("Failed to open an H.E. index on " - ++ indexDir ++ ": " ++ show err) + -> do noticeM logger ("Failed to open an H.E. index on " + ++ indexDir ++ ": " ++ show err) indexExists <- doesDirectoryExist indexDir when indexExists @@ -112,7 +128,8 @@ syncIndex' index revFile repos mkDraft newRev <- getCurrentRevNum repos debugM logger ("The repository revision is currently " ++ show newRev) - when (newRev /= oldRev) (syncIndex'' oldRev newRev) + when (oldRev == 0 || newRev /= oldRev) + $ syncIndex'' oldRev newRev return newRev where syncIndex'' :: RevNum -> RevNum -> IO ()