merkle-patricia-db-0.1.0: src/Blockchain/Database/MerklePatricia/MPDB.hs
{-# LANGUAGE OverloadedStrings #-}
module Blockchain.Database.MerklePatricia.MPDB (
MPDB(..),
openMPDB
) where
import Control.Monad.Trans.Resource
import Data.Binary
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as BL
import Data.Default
import qualified Database.LevelDB as DB
import Blockchain.Database.MerklePatricia.StateRoot
-- | This is the database reference type, contianing both the handle to the underlying database, as well
-- as the stateRoot to the current tree holding the data.
--
-- The MPDB acts a bit like a traditional database handle, although because it contains the stateRoot,
-- many functions act by updating its value. Because of this, it is recommended that this item be
-- stored and modified within the state monad.
data MPDB = MPDB {
ldb :: DB.DB,
stateRoot :: StateRoot
}
-- | This function is used to create an MPDB object corresponding to the blank database.
-- After creation, the stateRoot can be changed to a previously saved version.
openMPDB::String -- ^ The filepath with the location of the underlying database.
->ResourceT IO MPDB
openMPDB path = do
ldb' <- DB.open path def{DB.createIfMissing=True}
DB.put ldb' def (BL.toStrict $ encode emptyTriePtr) B.empty
return MPDB{ ldb=ldb', stateRoot=emptyTriePtr }