Comprehensive walkthough of the functionality provided by this library.
> {-# LANGUAGE OverloadedStrings #-}
> module Main where
>
> import Control.Monad
> import Data.ByteString.Char8 hiding (take)
> import Prelude hiding (putStrLn)
> import System.FilePath
>
> import Database.LevelDB
>
> import Debug.Trace
>
>
> main :: IO ()
> main =
Almost all operations on a leveldb database occur within the @withLevelDB@
bracket, to ensure proper resource de-/allocation.
> withLevelDB dbdir [ CreateIfMissing, CacheSize 2048 ] $ \db -> do
The basic operations are @put@, @get@ and @delete@, straightforwardly:
> put db [] "foo" "bar"
> get db [ FillCache ] "foo" >>= print
> delete db [] "foo"
> get db [ FillCache ] "foo" >>= print
Additionally, we can write several key/value pairs in a batch, which is
guaranteed to be atomic. Note the use of the @Sync@ option here: it tells
leveldb to flush the data to disk before returning. While syncing may have a
considerable performance impact, it is most useful with batch operations.
Also note that we're taking a snapshot of the database before issueing the
write.
> withSnapshot db $ \snap -> do
> write db [ Sync ] [ Put "a" "one"
> , Put "b" "two"
> , Put "c" "three" ]
Now, we can perform a snapshot read. As expected, this will output nothing,
since we took the snapshot before writing.
> dumpEntries db [ UseSnapshot snap, FillCache ]
Conversely, we should see the values just written in a "dirty" read:
> dumpEntries db [ FillCache ]
Let's inspect the state of our database, just for the fun of it.
> approximateSize db ("a", "z") >>= print
> getProperty db SSTables >>= printProperty "sstables"
> getProperty db Stats >>= printProperty "stats"
> getProperty db (NumFilesAtLevel 1) >>= printProperty "num files at level"
Similar to the batch write above, we can also use @write@ to delete key/value
pairs:
> write db [ Sync ] [ Del "a", Del "b", Del "c" ]
> dumpEntries db [ FillCache ]
>
> where
> dbdir = "/" </> "tmp" </> "leveltest"
>
> dumpEntries db opts =
> withIterator db opts $ \iter -> do
> iterFirst iter
> iterEntries iter print
>
> iterEntries iter f = do
> valid <- iterValid iter
> when valid $ do
> key <- iterKey iter
> val <- iterValue iter
> _ <- f (key, val)
> _ <- iterNext iter
> iterEntries iter f
>
> printProperty l p = do
> putStrLn l
> maybe (putStrLn "n/a") putStrLn $ p