packages feed

HongoDB-0.0.1: Test.hs

{-# Language OverloadedStrings #-}

import Database.HongoDB

import Control.Monad as M
import Control.Monad.Trans
import qualified Data.ByteString.Char8 as C
import Data.Enumerator as E
import Data.Enumerator.List as EL
import System.Directory
import System.Random

main :: IO ()
main = do
  testHashMem
  testHashFile
  benchHashFile

testHashMem :: IO ()
testHashMem = do
  runHashMem $ do
    set "a" "b"
    set "c" "d"
    v <- get "a"
    liftIO $ print v
    
    e <- enum
    let f = do
          mkv <- EL.head
          case mkv of
            Just (k, v) -> liftIO (print (k, v)) >> f
            Nothing -> return ()
    run_ $ e $$ f
  
  return ()

fname = "tmp.hgdb"

testHashFile :: IO ()
testHashFile = do
  e <- doesFileExist fname
  when e $ removeFile fname
  f <- openHashFile fname
  
  runHashFile f $ do
    set "a" "hogehogehogehogehogehogehogeho"
    remove "a"
    liftIO . print =<< get "a"
    set "a" "mogemoge"
    liftIO . print =<< get "a"
    remove "a"
  
  runHashFile f $ do
    liftIO . print =<< count
    set "a" "b"
    liftIO . print =<< count
    set "c" "d"
    liftIO . print =<< count
    liftIO . print =<< get "a"
    liftIO . print =<< get "b"
    liftIO . print =<< get "c"
    set "a" "x"
    liftIO . print =<< count
    liftIO . print =<< get "a"
    set "a" "xyz"
    liftIO . print =<< count
    liftIO . print =<< get "a"
    liftIO . print =<< get "b"
    liftIO . print =<< get "c"
    remove "a"
    liftIO . print =<< count
    liftIO . print =<< get "a"
    remove "c"
    liftIO . print =<< count
  
  runHashFile f $ do
    set "a" "a"
    set "b" "b"
    set "c" "c"
  
  runHashFile f $ do
    e <- enum
    let f = do
          mkv <- EL.head
          case mkv of
            Just kv -> liftIO (print ("enum", kv)) >> f
            Nothing -> return ()
    run_ $ e $$ f

  runHashFile f $ do
    liftIO . print =<< count
    liftIO . print =<< get "c"
    clear
    liftIO . print =<< count
    liftIO . print =<< get "c"

  closeHashFile f
  
  return ()

benchHashFile :: IO ()
benchHashFile = do
  let iter = 100000
  e <- doesFileExist fname
  when e $ removeFile fname
  f <- openHashFile' (iter*2) fname
  
  {-
  runHashFile f $ do
    forM_ [1..iter] $ \i -> do
      key <- liftIO $ M.replicateM 10 (randomRIO ('a', 'z'))
      val <- liftIO $ M.replicateM 10 (randomRIO ('a', 'z'))
      -- liftIO $ print (i, key, val)
      when (i `mod` 10000 == 0) $ liftIO $ print i
      set (C.pack key) (C.pack val)
      -}

  runHashFile f $ do
    forM_ [1..iter] $ \i -> do
      kl <- liftIO $ randomRIO (1, 3)
      vl <- liftIO $ randomRIO (0, 32)
      b <- liftIO $ randomRIO (False, True)
      key <- liftIO $ M.replicateM kl (randomRIO ('a', 'z'))
      val <- liftIO $ M.replicateM vl (randomRIO ('a', 'z'))
      -- liftIO $ print (i, key, val)
      when (i `mod` 10000 == 0) $ liftIO $ print i
      
      if b
        then set (C.pack key) (C.pack val)
        else remove (C.pack key) >> return ()
  closeHashFile f