packages feed

sophia-0.1.2: Bench.hs

import Control.Exception (catch, SomeException(..))
import Control.Monad (forM_)
import Criterion.Main (bench, defaultMain)
import Data.Binary.Put (runPut, putWord32le)
import Data.Word (Word32)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Database.Sophia as S
import qualified System.Directory as Dir

bsWord :: Word32 -> BS.ByteString
bsWord = BS.concat . BSL.toChunks . runPut . putWord32le

ignoreExceptions :: IO () -> IO ()
ignoreExceptions act = act `catch` \(SomeException _) -> return ()

dbAccess :: IO ()
dbAccess = do
  ignoreExceptions $ Dir.removeDirectoryRecursive "/tmp/sophia-test-db"

  S.withEnv $ \env -> do
    S.openDir env S.ReadWrite S.AllowCreation "/tmp/sophia-test-db"
    S.withDb env $ \db -> do
      let many = forM_ [1..10000]
      many $ \i -> S.setValue db (bsWord i) (bsWord (i*2))
      many $ \i -> S.hasValue db (bsWord i)
      many $ \i -> S.getValue db (bsWord i)
      many $ \i -> S.delValue db (bsWord i)

main :: IO ()
main =
  defaultMain
  [ bench "DB access" dbAccess
  ]