-searchIndex :: Database -> Condition -> IO [(PageName, RevNum)]
-searchIndex index cond
- = searchDatabase index cond >>= mapM fromId
- where
- fromId :: DocumentID -> IO (PageName, RevNum)
- fromId docId
- = do uri <- getDocURI index docId
- rev <- getDocAttr index docId "rakka:revision"
- >>= return . read . fromJust
- return (decodePageName $ uriPath uri, rev)
-
-
-updateIndex :: Database
- -> Repository
- -> (Page -> IO Document)
- -> RevNum
- -> PageName
- -> IO ()
-updateIndex index repos mkDraft rev name
- = do pageM <- getPage' repos name (Just rev)
- case pageM of
- -- ページが削除された
- Nothing
- -> do docIdM <- getDocIdByURI index (mkRakkaURI name)
- case docIdM of
- Nothing -> return ()
- Just docId -> do removeDocument index docId [CleaningRemove]
- infoM logger ("Removed page " ++ name ++ " from the index")
- Just page
- -> do draft <- mkDraft page
- putDocument index draft [CleaningPut]
- infoM logger ("Indexed page " ++ name ++ " of revision " ++ show (pageRevision page))
-
-
-updateIndexRev :: FilePath -> (RevNum -> IO RevNum) -> IO ()
-updateIndexRev revFile f = bracket acquireLock releaseLock 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")
\ No newline at end of file