3 import "Simantics/DB"
\r
4 import "http://www.simantics.org/R-1.0" as ROntology
\r
5 import "http://www.simantics.org/Layer0-1.1" as L0
\r
7 """Creates a new session configuration to graph as a part of the parent resource. This function does
\r
8 not link it to any other resources."""
\r
9 createSessionConfiguration :: Resource -> R.SessionConfiguration -> <WriteGraph> Resource
\r
10 createSessionConfiguration parent (R.SessionConfiguration host port username password) = do
\r
12 claim r L0.InstanceOf ROntology.SessionConfiguration
\r
13 claim r L0.PartOf parent
\r
14 claimRelatedValue r L0.HasName host
\r
15 claimRelatedValue r ROntology.SessionConfiguration.host host
\r
16 claimRelatedValue r ROntology.SessionConfiguration.port port
\r
17 claimRelatedValue r ROntology.SessionConfiguration.username username
\r
18 claimRelatedValue r ROntology.SessionConfiguration.password password
\r
21 """Add an R script into the session configuration resource. The script is executed when a new session is opened with the createSession function."""
\r
22 addScript :: Resource -> String -> <WriteGraph> Resource
\r
23 addScript sessionConfiguration scriptText = do
\r
25 claim r L0.InstanceOf ROntology.Script
\r
26 claim sessionConfiguration ROntology.SessionConfiguration.hasScript r
\r
27 claimRelatedValue r ROntology.Script.text scriptText
\r
30 """Read session configuration from the database."""
\r
31 readSessionConfiguration :: Resource -> <ReadGraph> R.SessionConfiguration
\r
32 readSessionConfiguration r = R.SessionConfiguration
\r
33 (relatedValue r ROntology.SessionConfiguration.host)
\r
34 (relatedValue r ROntology.SessionConfiguration.port)
\r
35 (relatedValue r ROntology.SessionConfiguration.username)
\r
36 (relatedValue r ROntology.SessionConfiguration.password)
\r
38 """Write an R session into the database."""
\r
39 writeSession :: R.Session -> <WriteGraph> Resource
\r
40 writeSession session = do
\r
42 claim r L0.InstanceOf ROntology.Session
\r
43 claimRelatedValue r L0.HasName $ R.sessionIdOf session
\r
46 """Execute the scripts defined for a session configuration using the given session."""
\r
47 executeScripts :: Resource -> R.Session -> <ReadGraph,Proc> ()
\r
48 executeScripts configurationResource session = for (configurationResource # ROntology.SessionConfiguration.hasScript) $ \s -> do
\r
49 scriptText = relatedValue s ROntology.Script.text
\r
50 R.asyncExec session (R.evalR_ scriptText)
\r
52 """Read an R session from the database. If the session has been closed, a new session is opened with the
\r
53 same configuration."""
\r
54 readSession :: Resource -> <ReadGraph,Proc> R.Session
\r
56 sessionId = relatedValue r L0.HasName
\r
57 in match R.sessionById sessionId with
\r
58 Just session -> session
\r
60 configurationResource = singleObject r L0.PartOf
\r
61 session = R.getOrCreateSession (readSessionConfiguration $ configurationResource) sessionId
\r
62 executeScripts configurationResource session
\r
65 """Create a session based on a given session configuration resource."""
\r
66 createSession :: Resource -> <WriteGraph,Proc> Resource
\r
67 createSession configurationResource = do
\r
68 session = R.createSession $ readSessionConfiguration configurationResource
\r
69 executeScripts configurationResource session
\r
70 sessionResource = writeSession session
\r
71 claim configurationResource L0.ConsistsOf sessionResource
\r
74 """Delete a session resource and close the session that it represents."""
\r
75 deleteSession :: Resource -> <WriteGraph,Proc> ()
\r
76 deleteSession r = do
\r
77 session = readSession r
\r
78 R.closeSession session
\r