\begin{code} module Main (main) where import Distributed import System.IO data Msg = Alloc String Pid | Value String Pid | Lookup String Pid | Down Pid | Allocated | Free | IsValue (Maybe String) | Connect Pid | Shutdown deriving (Show, Read) instance Serialize Msg destNode = "DB-Server" main = start (do me <- self destHost <- proc $ myGetVarDefault "DBSERVER" "localhost" remoteSend (Hostname destHost) (Nodename destNode) "dataBase" (Connect me) -- (PidName (Hostname destHost, Nodename destNode,"dataBase")) (Connect me) receive (\v -> case v of Connect db -> do nolink <- proc $ myGetVar "DBNOLINK" case nolink of Just _ -> return () Nothing -> linkMeWith db client db) ) "" client :: Pid -> DIO Msg () client pid = do str <- proc $ do putStr "(i)nsert / (l)ookup > " hFlush stdout getLine me <- self case str of "i" -> do proc $ putStr "Key > " proc $ hFlush stdout key <- proc(getLine) pid (Alloc key me) receive (\v -> case v of Free -> do proc $ putStr "Value > " proc $ hFlush stdout v <- proc$ getLine pid (Value v me) client pid Allocated -> do proc $ putStrLn "Key is allocated > " client pid Down _ -> do proc $ putStrLn "Server went down" halt) "l" -> do proc $ putStr "Key > " proc $ hFlush stdout key <- proc $ getLine pid (Lookup key me) receive (\v -> case v of IsValue mStr -> do proc $ putStr "Value > " proc $ putStrLn (show mStr) client pid Down _ -> do proc $ putStrLn "Server went down" halt) "q" -> halt "Q" -> do pid Shutdown halt _ -> client pid \end{code}