@@ -3,176 +3,142 @@ module ProjectM36.Server.EntryPoints where
3import ProjectM36.Base hiding (inclusionDependencies)
3import ProjectM36.Base hiding (inclusionDependencies)
4import ProjectM36.IsomorphicSchema
4import ProjectM36.IsomorphicSchema
5import ProjectM36.Client as C
5import ProjectM36.Client as C
6−import ProjectM36.Error
7−import Control.Distributed.Process (Process, ProcessId)
8−import Control.Distributed.Process.ManagedProcess (ProcessReply)
9−import Control.Distributed.Process.ManagedProcess.Server (reply)
10−import Control.Distributed.Process.Async (async, task, waitCancelTimeout, AsyncResult(..))
11−import Control.Monad.IO.Class (liftIO)
12import Data.Map
6import Data.Map
13import Control.Concurrent (threadDelay)
7import Control.Concurrent (threadDelay)
14−import Data.Typeable
8+import Network.RPC.Curryer.Server
15−import Data.Binary
9+import System.Timeout
11+import Control.Exception
17−timeoutOrDie :: (Binary a, Typeable a) => Timeout -> IO a -> Process (Either ServerError a)
13+timeoutOrDie :: Maybe Timeout -> IO a -> IO (Maybe a)
18−timeoutOrDie micros act =
14+timeoutOrDie mMicros act =
20− liftIO act >>= \x -> pure (Right x)
22− asyncUnit <- async (task (liftIO act))
23− asyncRes <- waitCancelTimeout micros asyncUnit
24− case asyncRes of
15+ case mMicros of
25− AsyncDone x -> pure (Right x)
16+ Nothing -> do
26− AsyncCancelled -> pure (Left RequestTimeoutError)
17+ ret <- act
27− AsyncFailed reason -> pure (Left (ProcessDiedError (show reason)))
18+ pure (Just ret)
28− AsyncLinkFailed reason -> pure (Left (ProcessDiedError (show reason)))
19+ Just micros -> do
29− AsyncPending -> pure (Left (ProcessDiedError "process pending"))
20+ timeout (fromIntegral micros) act
33−type Reply a = Process (ProcessReply (Either ServerError a) Connection)
35−handleExecuteRelationalExpr :: Timeout -> SessionId -> Connection -> RelationalExpr -> Reply (Either RelationalError Relation)
36−handleExecuteRelationalExpr ti sessionId conn expr = do
37− ret <- timeoutOrDie ti (executeRelationalExpr sessionId conn expr)
40−handleExecuteDataFrameExpr :: Timeout -> SessionId -> Connection -> DataFrameExpr -> Reply (Either RelationalError DataFrame)
22+timeoutRelErr :: Maybe Timeout -> IO (Either RelationalError a) -> IO (Either RelationalError a)
41−handleExecuteDataFrameExpr ti sessionId conn expr = do
23+timeoutRelErr mMicros act = do
42− ret <- timeoutOrDie ti (executeDataFrameExpr sessionId conn expr)
24+ ret <- timeoutOrDie mMicros act
45−handleExecuteDatabaseContextExpr :: Timeout -> SessionId -> Connection -> DatabaseContextExpr -> Reply (Either RelationalError ())
46−handleExecuteDatabaseContextExpr ti sessionId conn dbexpr = do
47− ret <- timeoutOrDie ti (executeDatabaseContextExpr sessionId conn dbexpr)
50−handleExecuteDatabaseContextIOExpr :: Timeout -> SessionId -> Connection -> DatabaseContextIOExpr -> Reply (Either RelationalError ())
51−handleExecuteDatabaseContextIOExpr ti sessionId conn dbexpr = do
52− ret <- timeoutOrDie ti (executeDatabaseContextIOExpr sessionId conn dbexpr)
55−handleExecuteHeadName :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError HeadName)
56−handleExecuteHeadName ti sessionId conn = do
57− ret <- timeoutOrDie ti (headName sessionId conn)
60−handleLogin :: Timeout -> Connection -> ProcessId -> Reply Bool
61−handleLogin ti conn newClientProcessId = do
62− ret <- timeoutOrDie ti (addClientNode conn newClientProcessId)
63 case ret of
25 case ret of
64− Right () -> reply (Right True) conn
26+ Nothing -> throw TimeoutException
65− Left err -> reply (Left err) conn
27+ Just v -> pure v
30+handleExecuteRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> RelationalExpr -> IO (Either RelationalError Relation)
31+handleExecuteRelationalExpr ti sessionId conn expr =
32+ timeoutRelErr ti (executeRelationalExpr sessionId conn expr)
34+handleExecuteDataFrameExpr :: Maybe Timeout -> SessionId -> Connection -> DataFrameExpr -> IO (Either RelationalError DataFrame)
35+handleExecuteDataFrameExpr ti sessionId conn expr =
36+ timeoutRelErr ti (executeDataFrameExpr sessionId conn expr)
38+handleExecuteDatabaseContextExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextExpr -> IO (Either RelationalError ())
39+handleExecuteDatabaseContextExpr ti sessionId conn dbexpr =
40+ timeoutRelErr ti (executeDatabaseContextExpr sessionId conn dbexpr)
42+handleExecuteDatabaseContextIOExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextIOExpr -> IO (Either RelationalError ())
43+handleExecuteDatabaseContextIOExpr ti sessionId conn dbexpr =
44+ timeoutRelErr ti (executeDatabaseContextIOExpr sessionId conn dbexpr)
46+handleExecuteHeadName :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError HeadName)
47+handleExecuteHeadName ti sessionId conn =
48+ timeoutRelErr ti (headName sessionId conn)
50+handleLogin :: DatabaseName -> Connection -> Locking Socket -> IO Bool
51+handleLogin dbName conn lockSock = do
52+ addClientNode dbName conn lockSock
67−handleExecuteGraphExpr :: Timeout -> SessionId -> Connection -> TransactionGraphOperator -> Reply (Either RelationalError ())
55+handleExecuteGraphExpr :: Maybe Timeout -> SessionId -> Connection -> TransactionGraphOperator -> IO (Either RelationalError ())
68handleExecuteGraphExpr ti sessionId conn graphExpr = do
56handleExecuteGraphExpr ti sessionId conn graphExpr = do
69− ret <- timeoutOrDie ti (executeGraphExpr sessionId conn graphExpr)
57+ timeoutRelErr ti (executeGraphExpr sessionId conn graphExpr)
72−handleExecuteTransGraphRelationalExpr :: Timeout -> SessionId -> Connection -> TransGraphRelationalExpr -> Reply (Either RelationalError Relation)
59+handleExecuteTransGraphRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> TransGraphRelationalExpr -> IO (Either RelationalError Relation)
73−handleExecuteTransGraphRelationalExpr ti sessionId conn graphExpr = do
60+handleExecuteTransGraphRelationalExpr ti sessionId conn graphExpr =
74− ret <- timeoutOrDie ti (executeTransGraphRelationalExpr sessionId conn graphExpr)
61+ timeoutRelErr ti (executeTransGraphRelationalExpr sessionId conn graphExpr)
77−handleExecuteTypeForRelationalExpr :: Timeout -> SessionId -> Connection -> RelationalExpr -> Reply (Either RelationalError Relation)
63+handleExecuteTypeForRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> RelationalExpr -> IO (Either RelationalError Relation)
78−handleExecuteTypeForRelationalExpr ti sessionId conn relExpr = do
64+handleExecuteTypeForRelationalExpr ti sessionId conn relExpr =
79− ret <- timeoutOrDie ti (typeForRelationalExpr sessionId conn relExpr)
65+ timeoutRelErr ti (typeForRelationalExpr sessionId conn relExpr)
82−handleRetrieveInclusionDependencies :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError (Map IncDepName InclusionDependency))
67+handleRetrieveInclusionDependencies :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError (Map IncDepName InclusionDependency))
83handleRetrieveInclusionDependencies ti sessionId conn = do
68handleRetrieveInclusionDependencies ti sessionId conn = do
84− ret <- timeoutOrDie ti (inclusionDependencies sessionId conn)
69+ timeoutRelErr ti (inclusionDependencies sessionId conn)
87−handleRetrievePlanForDatabaseContextExpr :: Timeout -> SessionId -> Connection -> DatabaseContextExpr -> Reply (Either RelationalError GraphRefDatabaseContextExpr)
71+handleRetrievePlanForDatabaseContextExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextExpr -> IO (Either RelationalError GraphRefDatabaseContextExpr)
88handleRetrievePlanForDatabaseContextExpr ti sessionId conn dbExpr = do
72handleRetrievePlanForDatabaseContextExpr ti sessionId conn dbExpr = do
89− ret <- timeoutOrDie ti (planForDatabaseContextExpr sessionId conn dbExpr)
73+ timeoutRelErr ti (planForDatabaseContextExpr sessionId conn dbExpr)
92−handleRetrieveTransactionGraph :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
75+handleRetrieveTransactionGraph :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
93−handleRetrieveTransactionGraph ti sessionId conn = do
76+handleRetrieveTransactionGraph ti sessionId conn =
94− ret <- timeoutOrDie ti (transactionGraphAsRelation sessionId conn)
77+ timeoutRelErr ti (transactionGraphAsRelation sessionId conn)
97−handleRetrieveHeadTransactionId :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError TransactionId)
79+handleRetrieveHeadTransactionId :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError TransactionId)
98−handleRetrieveHeadTransactionId ti sessionId conn = do
80+handleRetrieveHeadTransactionId ti sessionId conn =
99− ret <- timeoutOrDie ti (headTransactionId sessionId conn)
81+ timeoutRelErr ti (headTransactionId sessionId conn)
102−handleCreateSessionAtCommit :: Timeout -> Connection -> TransactionId -> Reply (Either RelationalError SessionId)
83+handleCreateSessionAtCommit :: Maybe Timeout -> Connection -> TransactionId -> IO (Either RelationalError SessionId)
103−handleCreateSessionAtCommit ti conn commitId = do
84+handleCreateSessionAtCommit ti conn commitId =
104− ret <- timeoutOrDie ti (createSessionAtCommit conn commitId)
85+ timeoutRelErr ti (createSessionAtCommit conn commitId)
107−handleCreateSessionAtHead :: Timeout -> Connection -> HeadName -> Reply (Either RelationalError SessionId)
87+handleCreateSessionAtHead :: Maybe Timeout -> Connection -> HeadName -> IO (Either RelationalError SessionId)
108−handleCreateSessionAtHead ti conn headn = do
88+handleCreateSessionAtHead ti conn headn =
109− ret <- timeoutOrDie ti (createSessionAtHead conn headn)
89+ timeoutRelErr ti (createSessionAtHead conn headn)
112−handleCloseSession :: Timeout -> SessionId -> Connection -> Reply ()
91+handleCloseSession :: SessionId -> Connection -> IO ()
113−handleCloseSession ti sessionId conn = do
92+handleCloseSession sessionId conn =
114− ret <- timeoutOrDie ti (closeSession sessionId conn)
93+ closeSession sessionId conn
116− Right () -> reply (Right ()) conn
117− Left err -> reply (Left err) conn
119−handleRetrieveAtomTypesAsRelation :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
95+handleRetrieveAtomTypesAsRelation :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
120handleRetrieveAtomTypesAsRelation ti sessionId conn = do
96handleRetrieveAtomTypesAsRelation ti sessionId conn = do
121− ret <- timeoutOrDie ti (atomTypesAsRelation sessionId conn)
97+ timeoutRelErr ti (atomTypesAsRelation sessionId conn)
124-- | Returns a relation which lists the names of relvars in the current session as well as its types.
99-- | Returns a relation which lists the names of relvars in the current session as well as its types.
125−handleRetrieveRelationVariableSummary :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
100+handleRetrieveRelationVariableSummary :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
126handleRetrieveRelationVariableSummary ti sessionId conn = do
101handleRetrieveRelationVariableSummary ti sessionId conn = do
127− ret <- timeoutOrDie ti (relationVariablesAsRelation sessionId conn)
102+ timeoutRelErr ti (relationVariablesAsRelation sessionId conn)
130−handleRetrieveAtomFunctionSummary :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
104+handleRetrieveAtomFunctionSummary :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
131−handleRetrieveAtomFunctionSummary ti sessionId conn = do
105+handleRetrieveAtomFunctionSummary ti sessionId conn =
132− ret <- timeoutOrDie ti (atomFunctionsAsRelation sessionId conn)
106+ timeoutRelErr ti (atomFunctionsAsRelation sessionId conn)
135−handleRetrieveDatabaseContextFunctionSummary :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
108+handleRetrieveDatabaseContextFunctionSummary :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
136−handleRetrieveDatabaseContextFunctionSummary ti sessionId conn = do
109+handleRetrieveDatabaseContextFunctionSummary ti sessionId conn =
137− ret <- timeoutOrDie ti (databaseContextFunctionsAsRelation sessionId conn)
110+ timeoutRelErr ti (databaseContextFunctionsAsRelation sessionId conn)
140−handleRetrieveCurrentSchemaName :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError SchemaName)
112+handleRetrieveCurrentSchemaName :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError SchemaName)
141handleRetrieveCurrentSchemaName ti sessionId conn = do
113handleRetrieveCurrentSchemaName ti sessionId conn = do
142− ret <- timeoutOrDie ti (currentSchemaName sessionId conn)
114+ timeoutRelErr ti (currentSchemaName sessionId conn)
145−handleExecuteSchemaExpr :: Timeout -> SessionId -> Connection -> SchemaExpr -> Reply (Either RelationalError ())
116+handleExecuteSchemaExpr :: Maybe Timeout -> SessionId -> Connection -> SchemaExpr -> IO (Either RelationalError ())
146handleExecuteSchemaExpr ti sessionId conn schemaExpr = do
117handleExecuteSchemaExpr ti sessionId conn schemaExpr = do
147− ret <- timeoutOrDie ti (executeSchemaExpr sessionId conn schemaExpr)
118+ timeoutRelErr ti (executeSchemaExpr sessionId conn schemaExpr)
150−handleLogout :: Timeout -> Connection -> Reply Bool
120+handleLogout :: Maybe Timeout -> Connection -> IO Bool
151−handleLogout _ =
121+handleLogout _ _ =
152 --liftIO $ closeRemote_ conn
122 --liftIO $ closeRemote_ conn
153− reply (pure True)
123+ pure True
155−handleTestTimeout :: Timeout -> SessionId -> Connection -> Reply Bool
125+handleTestTimeout :: Maybe Timeout -> SessionId -> Connection -> IO Bool
156−handleTestTimeout ti _ conn = do
126+handleTestTimeout ti _ _ = do
157− ret <- timeoutOrDie ti (threadDelay 100000 >> pure True)
127+ _ <- timeoutOrDie ti (threadDelay 100000 >> pure True)
158− reply ret conn
128+ pure True
160−handleRetrieveSessionIsDirty :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Bool)
130+handleRetrieveSessionIsDirty :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Bool)
161handleRetrieveSessionIsDirty ti sessionId conn = do
131handleRetrieveSessionIsDirty ti sessionId conn = do
162− ret <- timeoutOrDie ti (disconnectedTransactionIsDirty sessionId conn)
132+ timeoutRelErr ti (disconnectedTransactionIsDirty sessionId conn)
165−handleExecuteAutoMergeToHead :: Timeout -> SessionId -> Connection -> MergeStrategy -> HeadName -> Reply (Either RelationalError ())
134+handleExecuteAutoMergeToHead :: Maybe Timeout -> SessionId -> Connection -> MergeStrategy -> HeadName -> IO (Either RelationalError ())
166handleExecuteAutoMergeToHead ti sessionId conn strat headName' = do
135handleExecuteAutoMergeToHead ti sessionId conn strat headName' = do
167− ret <- timeoutOrDie ti (autoMergeToHead sessionId conn strat headName')
136+ timeoutRelErr ti (autoMergeToHead sessionId conn strat headName')
170−handleRetrieveTypeConstructorMapping :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError TypeConstructorMapping)
138+handleRetrieveTypeConstructorMapping :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError TypeConstructorMapping)
171handleRetrieveTypeConstructorMapping ti sessionId conn = do
139handleRetrieveTypeConstructorMapping ti sessionId conn = do
172− ret <- timeoutOrDie ti (C.typeConstructorMapping sessionId conn)
140+ timeoutRelErr ti (C.typeConstructorMapping sessionId conn)
175−handleValidateMerkleHashes :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError ())
142+handleValidateMerkleHashes :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError ())
176handleValidateMerkleHashes ti sessionId conn = do
143handleValidateMerkleHashes ti sessionId conn = do
177− ret <- timeoutOrDie ti (C.validateMerkleHashes sessionId conn)
144+ timeoutRelErr ti (C.validateMerkleHashes sessionId conn)