content: {-# 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
  