@@ -3,176 +3,142 @@ module ProjectM36.Server.EntryPoints where
33import ProjectM36.Base hiding (inclusionDependencies)
44import ProjectM36.IsomorphicSchema
55import 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)
126import Data.Map
137import Control.Concurrent (threadDelay)
14−import Data.Typeable
15−import Data.Binary
8+import Network.RPC.Curryer.Server
9+import System.Timeout
10+import Network.Socket
11+import Control.Exception
1612
17−timeoutOrDie :: (Binary a, Typeable a) => Timeout -> IO a -> Process (Either ServerError a)
18−timeoutOrDie micros act =
19− if micros == 0 then
20− liftIO act >>= \x -> pure (Right x)
21− else do
22− asyncUnit <- async (task (liftIO act))
23− asyncRes <- waitCancelTimeout micros asyncUnit
24− case asyncRes of
25− AsyncDone x -> pure (Right x)
26− AsyncCancelled -> pure (Left RequestTimeoutError)
27− AsyncFailed reason -> pure (Left (ProcessDiedError (show reason)))
28− AsyncLinkFailed reason -> pure (Left (ProcessDiedError (show reason)))
29− AsyncPending -> pure (Left (ProcessDiedError "process pending"))
30−
31−type Timeout = Int
32−
33−type Reply a = Process (ProcessReply (Either ServerError a) Connection)
34−
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)
38− reply ret conn
13+timeoutOrDie :: Maybe Timeout -> IO a -> IO (Maybe a)
14+timeoutOrDie mMicros act =
15+ case mMicros of
16+ Nothing -> do
17+ ret <- act
18+ pure (Just ret)
19+ Just micros -> do
20+ timeout (fromIntegral micros) act
3921
40−handleExecuteDataFrameExpr :: Timeout -> SessionId -> Connection -> DataFrameExpr -> Reply (Either RelationalError DataFrame)
41−handleExecuteDataFrameExpr ti sessionId conn expr = do
42− ret <- timeoutOrDie ti (executeDataFrameExpr sessionId conn expr)
43− reply ret conn
44−
45−handleExecuteDatabaseContextExpr :: Timeout -> SessionId -> Connection -> DatabaseContextExpr -> Reply (Either RelationalError ())
46−handleExecuteDatabaseContextExpr ti sessionId conn dbexpr = do
47− ret <- timeoutOrDie ti (executeDatabaseContextExpr sessionId conn dbexpr)
48− reply ret conn
49−
50−handleExecuteDatabaseContextIOExpr :: Timeout -> SessionId -> Connection -> DatabaseContextIOExpr -> Reply (Either RelationalError ())
51−handleExecuteDatabaseContextIOExpr ti sessionId conn dbexpr = do
52− ret <- timeoutOrDie ti (executeDatabaseContextIOExpr sessionId conn dbexpr)
53− reply ret conn
54−
55−handleExecuteHeadName :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError HeadName)
56−handleExecuteHeadName ti sessionId conn = do
57− ret <- timeoutOrDie ti (headName sessionId conn)
58− reply ret conn
59−
60−handleLogin :: Timeout -> Connection -> ProcessId -> Reply Bool
61−handleLogin ti conn newClientProcessId = do
62− ret <- timeoutOrDie ti (addClientNode conn newClientProcessId)
22+timeoutRelErr :: Maybe Timeout -> IO (Either RelationalError a) -> IO (Either RelationalError a)
23+timeoutRelErr mMicros act = do
24+ ret <- timeoutOrDie mMicros act
6325 case ret of
64− Right () -> reply (Right True) conn
65− Left err -> reply (Left err) conn
26+ Nothing -> throw TimeoutException
27+ Just v -> pure v
28+
29+
30+handleExecuteRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> RelationalExpr -> IO (Either RelationalError Relation)
31+handleExecuteRelationalExpr ti sessionId conn expr =
32+ timeoutRelErr ti (executeRelationalExpr sessionId conn expr)
33+
34+handleExecuteDataFrameExpr :: Maybe Timeout -> SessionId -> Connection -> DataFrameExpr -> IO (Either RelationalError DataFrame)
35+handleExecuteDataFrameExpr ti sessionId conn expr =
36+ timeoutRelErr ti (executeDataFrameExpr sessionId conn expr)
37+
38+handleExecuteDatabaseContextExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextExpr -> IO (Either RelationalError ())
39+handleExecuteDatabaseContextExpr ti sessionId conn dbexpr =
40+ timeoutRelErr ti (executeDatabaseContextExpr sessionId conn dbexpr)
41+
42+handleExecuteDatabaseContextIOExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextIOExpr -> IO (Either RelationalError ())
43+handleExecuteDatabaseContextIOExpr ti sessionId conn dbexpr =
44+ timeoutRelErr ti (executeDatabaseContextIOExpr sessionId conn dbexpr)
45+
46+handleExecuteHeadName :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError HeadName)
47+handleExecuteHeadName ti sessionId conn =
48+ timeoutRelErr ti (headName sessionId conn)
6649
67−handleExecuteGraphExpr :: Timeout -> SessionId -> Connection -> TransactionGraphOperator -> Reply (Either RelationalError ())
50+handleLogin :: DatabaseName -> Connection -> Locking Socket -> IO Bool
51+handleLogin dbName conn lockSock = do
52+ addClientNode dbName conn lockSock
53+ pure True
54+
55+handleExecuteGraphExpr :: Maybe Timeout -> SessionId -> Connection -> TransactionGraphOperator -> IO (Either RelationalError ())
6856handleExecuteGraphExpr ti sessionId conn graphExpr = do
69− ret <- timeoutOrDie ti (executeGraphExpr sessionId conn graphExpr)
70− reply ret conn
57+ timeoutRelErr ti (executeGraphExpr sessionId conn graphExpr)
7158
72−handleExecuteTransGraphRelationalExpr :: Timeout -> SessionId -> Connection -> TransGraphRelationalExpr -> Reply (Either RelationalError Relation)
73−handleExecuteTransGraphRelationalExpr ti sessionId conn graphExpr = do
74− ret <- timeoutOrDie ti (executeTransGraphRelationalExpr sessionId conn graphExpr)
75− reply ret conn
59+handleExecuteTransGraphRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> TransGraphRelationalExpr -> IO (Either RelationalError Relation)
60+handleExecuteTransGraphRelationalExpr ti sessionId conn graphExpr =
61+ timeoutRelErr ti (executeTransGraphRelationalExpr sessionId conn graphExpr)
7662
77−handleExecuteTypeForRelationalExpr :: Timeout -> SessionId -> Connection -> RelationalExpr -> Reply (Either RelationalError Relation)
78−handleExecuteTypeForRelationalExpr ti sessionId conn relExpr = do
79− ret <- timeoutOrDie ti (typeForRelationalExpr sessionId conn relExpr)
80− reply ret conn
63+handleExecuteTypeForRelationalExpr :: Maybe Timeout -> SessionId -> Connection -> RelationalExpr -> IO (Either RelationalError Relation)
64+handleExecuteTypeForRelationalExpr ti sessionId conn relExpr =
65+ timeoutRelErr ti (typeForRelationalExpr sessionId conn relExpr)
8166
82−handleRetrieveInclusionDependencies :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError (Map IncDepName InclusionDependency))
67+handleRetrieveInclusionDependencies :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError (Map IncDepName InclusionDependency))
8368handleRetrieveInclusionDependencies ti sessionId conn = do
84− ret <- timeoutOrDie ti (inclusionDependencies sessionId conn)
85− reply ret conn
69+ timeoutRelErr ti (inclusionDependencies sessionId conn)
8670
87−handleRetrievePlanForDatabaseContextExpr :: Timeout -> SessionId -> Connection -> DatabaseContextExpr -> Reply (Either RelationalError GraphRefDatabaseContextExpr)
71+handleRetrievePlanForDatabaseContextExpr :: Maybe Timeout -> SessionId -> Connection -> DatabaseContextExpr -> IO (Either RelationalError GraphRefDatabaseContextExpr)
8872handleRetrievePlanForDatabaseContextExpr ti sessionId conn dbExpr = do
89− ret <- timeoutOrDie ti (planForDatabaseContextExpr sessionId conn dbExpr)
90− reply ret conn
91−
92−handleRetrieveTransactionGraph :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
93−handleRetrieveTransactionGraph ti sessionId conn = do
94− ret <- timeoutOrDie ti (transactionGraphAsRelation sessionId conn)
95− reply ret conn
96−
97−handleRetrieveHeadTransactionId :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError TransactionId)
98−handleRetrieveHeadTransactionId ti sessionId conn = do
99− ret <- timeoutOrDie ti (headTransactionId sessionId conn)
100− reply ret conn
101−
102−handleCreateSessionAtCommit :: Timeout -> Connection -> TransactionId -> Reply (Either RelationalError SessionId)
103−handleCreateSessionAtCommit ti conn commitId = do
104− ret <- timeoutOrDie ti (createSessionAtCommit conn commitId)
105− reply ret conn
106−
107−handleCreateSessionAtHead :: Timeout -> Connection -> HeadName -> Reply (Either RelationalError SessionId)
108−handleCreateSessionAtHead ti conn headn = do
109− ret <- timeoutOrDie ti (createSessionAtHead conn headn)
110− reply ret conn
111−
112−handleCloseSession :: Timeout -> SessionId -> Connection -> Reply ()
113−handleCloseSession ti sessionId conn = do
114− ret <- timeoutOrDie ti (closeSession sessionId conn)
115− case ret of
116− Right () -> reply (Right ()) conn
117− Left err -> reply (Left err) conn
73+ timeoutRelErr ti (planForDatabaseContextExpr sessionId conn dbExpr)
74+
75+handleRetrieveTransactionGraph :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
76+handleRetrieveTransactionGraph ti sessionId conn =
77+ timeoutRelErr ti (transactionGraphAsRelation sessionId conn)
78+
79+handleRetrieveHeadTransactionId :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError TransactionId)
80+handleRetrieveHeadTransactionId ti sessionId conn =
81+ timeoutRelErr ti (headTransactionId sessionId conn)
82+
83+handleCreateSessionAtCommit :: Maybe Timeout -> Connection -> TransactionId -> IO (Either RelationalError SessionId)
84+handleCreateSessionAtCommit ti conn commitId =
85+ timeoutRelErr ti (createSessionAtCommit conn commitId)
86+
87+handleCreateSessionAtHead :: Maybe Timeout -> Connection -> HeadName -> IO (Either RelationalError SessionId)
88+handleCreateSessionAtHead ti conn headn =
89+ timeoutRelErr ti (createSessionAtHead conn headn)
90+
91+handleCloseSession :: SessionId -> Connection -> IO ()
92+handleCloseSession sessionId conn =
93+ closeSession sessionId conn
11894
119−handleRetrieveAtomTypesAsRelation :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
95+handleRetrieveAtomTypesAsRelation :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
12096handleRetrieveAtomTypesAsRelation ti sessionId conn = do
121− ret <- timeoutOrDie ti (atomTypesAsRelation sessionId conn)
122− reply ret conn
97+ timeoutRelErr ti (atomTypesAsRelation sessionId conn)
12398
12499-- | 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)
126101handleRetrieveRelationVariableSummary ti sessionId conn = do
127− ret <- timeoutOrDie ti (relationVariablesAsRelation sessionId conn)
128− reply ret conn
102+ timeoutRelErr ti (relationVariablesAsRelation sessionId conn)
129103
130−handleRetrieveAtomFunctionSummary :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
131−handleRetrieveAtomFunctionSummary ti sessionId conn = do
132− ret <- timeoutOrDie ti (atomFunctionsAsRelation sessionId conn)
133− reply ret conn
104+handleRetrieveAtomFunctionSummary :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
105+handleRetrieveAtomFunctionSummary ti sessionId conn =
106+ timeoutRelErr ti (atomFunctionsAsRelation sessionId conn)
134107
135−handleRetrieveDatabaseContextFunctionSummary :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Relation)
136−handleRetrieveDatabaseContextFunctionSummary ti sessionId conn = do
137− ret <- timeoutOrDie ti (databaseContextFunctionsAsRelation sessionId conn)
138− reply ret conn
108+handleRetrieveDatabaseContextFunctionSummary :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Relation)
109+handleRetrieveDatabaseContextFunctionSummary ti sessionId conn =
110+ timeoutRelErr ti (databaseContextFunctionsAsRelation sessionId conn)
139111
140−handleRetrieveCurrentSchemaName :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError SchemaName)
112+handleRetrieveCurrentSchemaName :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError SchemaName)
141113handleRetrieveCurrentSchemaName ti sessionId conn = do
142− ret <- timeoutOrDie ti (currentSchemaName sessionId conn)
143− reply ret conn
114+ timeoutRelErr ti (currentSchemaName sessionId conn)
144115
145−handleExecuteSchemaExpr :: Timeout -> SessionId -> Connection -> SchemaExpr -> Reply (Either RelationalError ())
116+handleExecuteSchemaExpr :: Maybe Timeout -> SessionId -> Connection -> SchemaExpr -> IO (Either RelationalError ())
146117handleExecuteSchemaExpr ti sessionId conn schemaExpr = do
147− ret <- timeoutOrDie ti (executeSchemaExpr sessionId conn schemaExpr)
148− reply ret conn
118+ timeoutRelErr ti (executeSchemaExpr sessionId conn schemaExpr)
149119
150−handleLogout :: Timeout -> Connection -> Reply Bool
151−handleLogout _ =
120+handleLogout :: Maybe Timeout -> Connection -> IO Bool
121+handleLogout _ _ =
152122 --liftIO $ closeRemote_ conn
153− reply (pure True)
123+ pure True
154124
155−handleTestTimeout :: Timeout -> SessionId -> Connection -> Reply Bool
156−handleTestTimeout ti _ conn = do
157− ret <- timeoutOrDie ti (threadDelay 100000 >> pure True)
158− reply ret conn
125+handleTestTimeout :: Maybe Timeout -> SessionId -> Connection -> IO Bool
126+handleTestTimeout ti _ _ = do
127+ _ <- timeoutOrDie ti (threadDelay 100000 >> pure True)
128+ pure True
159129
160−handleRetrieveSessionIsDirty :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError Bool)
130+handleRetrieveSessionIsDirty :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError Bool)
161131handleRetrieveSessionIsDirty ti sessionId conn = do
162− ret <- timeoutOrDie ti (disconnectedTransactionIsDirty sessionId conn)
163− reply ret conn
132+ timeoutRelErr ti (disconnectedTransactionIsDirty sessionId conn)
164133
165−handleExecuteAutoMergeToHead :: Timeout -> SessionId -> Connection -> MergeStrategy -> HeadName -> Reply (Either RelationalError ())
134+handleExecuteAutoMergeToHead :: Maybe Timeout -> SessionId -> Connection -> MergeStrategy -> HeadName -> IO (Either RelationalError ())
166135handleExecuteAutoMergeToHead ti sessionId conn strat headName' = do
167− ret <- timeoutOrDie ti (autoMergeToHead sessionId conn strat headName')
168− reply ret conn
136+ timeoutRelErr ti (autoMergeToHead sessionId conn strat headName')
169137
170−handleRetrieveTypeConstructorMapping :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError TypeConstructorMapping)
138+handleRetrieveTypeConstructorMapping :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError TypeConstructorMapping)
171139handleRetrieveTypeConstructorMapping ti sessionId conn = do
172− ret <- timeoutOrDie ti (C.typeConstructorMapping sessionId conn)
173− reply ret conn
140+ timeoutRelErr ti (C.typeConstructorMapping sessionId conn)
174141
175−handleValidateMerkleHashes :: Timeout -> SessionId -> Connection -> Reply (Either RelationalError ())
142+handleValidateMerkleHashes :: Maybe Timeout -> SessionId -> Connection -> IO (Either RelationalError ())
176143handleValidateMerkleHashes ti sessionId conn = do
177− ret <- timeoutOrDie ti (C.validateMerkleHashes sessionId conn)
178− reply ret conn
144+ timeoutRelErr ti (C.validateMerkleHashes sessionId conn)