{-# LANGUAGE OverloadedStrings #-} -- | -- Comprehensive walkthough of the functionality provided by this library. -- module Main where import Control.Monad import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Resource (release) import Data.ByteString.Char8 hiding (take) import Data.Default import Data.Monoid import Database.LevelDB import qualified Database.LevelDB.Streaming as S import Prelude hiding (putStrLn) main :: IO () main = runResourceT $ do printVersion db <- open "/tmp/leveltest" defaultOptions{ createIfMissing = True , cacheSize= 2048 } putStrLn' "Put value" put db def "foo" "bar" get db def "foo" >>= liftIO . print putStrLn' "" putStrLn' "Delete value" delete db def "foo" get db def "foo" >>= liftIO . print putStrLn' "" (releaseSnap, snap) <- createSnapshot' db putStrLn' "Write batch" write db def{sync = True} [ Put "a" "one" , Put "b" "two" , Put "c" "three" ] putStrLn' "Dump entries with old snapshot" withIterator db def{useSnapshot = Just snap} $ \iter -> dumpEntries iter -- early release snapshot release releaseSnap -- here, we keep the iterator around for later reuse. -- Note that we don't explicitly release it (and thus don't keep the release -- key). The iterator will be released when runResourceT terminates. iter <- iterOpen db def putStrLn' "Dump entries with fresh iterator" dumpEntries iter putStrLn' "" printDbSize db putStrLn' "Trigger compaction" compactRange db ("a", "z") printDbSize db putStrLn' "" putStrLn' " BEGIN dump properties" getProperty db SSTables >>= printProperty "SSTables:" getProperty db Stats >>= printProperty "Stats:" getProperty db (NumFilesAtLevel 1) >>= printProperty "Num files at level 1:" putStrLn' " END dump properties" putStrLn' "" putStrLn' "Delete batch" write db def [ Del "a" , Del "b" , Del "c" ] putStrLn' "Dump entries" dumpEntries iter return () where dumpEntries iter = liftIO $ S.toList (S.entrySlice iter S.AllKeys S.Asc) >>= print printProperty l p = do putStrLn' l maybe (putStrLn' "n/a") putStrLn' p printVersion = do v <- versionBS putStrLn' $ "LevelDB Version: " <> v printDbSize db = do s <- approximateSize db ("a", "z") putStrLn' $ "Approximate DB size: " <> pack (show s) versionBS = do (major, minor) <- version return $ intToBs major <> "." <> intToBs minor intToBs :: Int -> ByteString intToBs = pack . show putStrLn' = liftIO . putStrLn