module DumpLevelDB ( showKeyVal, typeToDB ) where import Control.Monad.IO.Class import Control.Monad.Trans.Resource import qualified Data.ByteString as B import qualified Data.ByteString.Base16 as B16 import qualified Data.ByteString.Char8 as BC import Data.Default import qualified Database.LevelDB as DB import System.Directory import System.Environment import System.FilePath import Text.PrettyPrint.ANSI.Leijen hiding ((<$>), ()) import Blockchain.Data.RLP --import Debug.Trace instance Pretty B.ByteString where pretty = blue . text . BC.unpack . B16.encode showAllKeyVal::DB.DB->(B.ByteString->String)->ResourceT IO () showAllKeyVal db f = do i <- DB.iterOpen db def DB.iterFirst i valid <- DB.iterValid i if valid then showAllKeyVal' db i else liftIO $ putStrLn "no keys" where showAllKeyVal'::DB.DB->DB.Iterator->ResourceT IO () showAllKeyVal' db' i = do Just key <- DB.iterKey i Just val <- DB.iterValue i if B.null val then liftIO $ putStrLn $ "----------\n" ++ show (pretty key) ++ ": " else liftIO $ putStrLn $ "----------\n" ++ show (pretty key) ++ ": " ++ f val DB.iterNext i v <- DB.iterValid i if v then showAllKeyVal' db' i else return () showKeyVal::(B.ByteString->String)->String->String->Maybe String->IO () showKeyVal f dbType dbName maybeKey = do let options = DB.defaultOptions { DB.createIfMissing=True, DB.cacheSize=1024} dbDir <- typeToDB dbType runResourceT $ do db <- DB.open (dbDir dbName) def case maybeKey of Nothing -> showAllKeyVal db f Just key -> do maybeVal <- DB.get db def $ fst $ B16.decode $ BC.pack key case maybeVal of Nothing -> error $ "Missing value in database: " ++ show key Just val -> liftIO $ putStrLn $ f val typeToDB::String->IO String typeToDB "h" = do homeDir <- getHomeDirectory return $ homeDir ".ethereumH" typeToDB "c" = do homeDir <- getHomeDirectory return $ homeDir "Library" "Application Support" "Ethereum"