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 sessionName = host + "-" + show port
\r
15 claimRelatedValue r L0.HasName sessionName
\r
16 claimRelatedValue r ROntology.SessionConfiguration.host host
\r
17 claimRelatedValue r ROntology.SessionConfiguration.port port
\r
18 claimRelatedValue r ROntology.SessionConfiguration.username username
\r
19 claimRelatedValue r ROntology.SessionConfiguration.password password
\r
22 """Add an R script into the session configuration resource. The script is executed when a new session is opened with the createSession function."""
\r
23 addScript :: Resource -> String -> <WriteGraph> Resource
\r
24 addScript sessionConfiguration scriptText = do
\r
26 claim r L0.InstanceOf ROntology.Script
\r
27 claim sessionConfiguration ROntology.SessionConfiguration.hasScript r
\r
28 claimRelatedValue r ROntology.Script.text scriptText
\r
31 """Read session configuration from the database."""
\r
32 readSessionConfiguration :: Resource -> <ReadGraph> R.SessionConfiguration
\r
33 readSessionConfiguration r = R.SessionConfiguration
\r
34 (relatedValue r ROntology.SessionConfiguration.host)
\r
35 (relatedValue r ROntology.SessionConfiguration.port)
\r
36 (relatedValue r ROntology.SessionConfiguration.username)
\r
37 (relatedValue r ROntology.SessionConfiguration.password)
\r
39 """Write an R session into the database."""
\r
40 writeSession :: R.Session -> <WriteGraph> Resource
\r
41 writeSession session = do
\r
43 claim r L0.InstanceOf ROntology.Session
\r
44 claimRelatedValue r L0.HasName $ R.sessionIdOf session
\r
47 """Execute the scripts defined for a session configuration using the given session."""
\r
48 executeScripts :: Resource -> R.Session -> <ReadGraph,Proc> ()
\r
49 executeScripts configurationResource session = for (configurationResource # ROntology.SessionConfiguration.hasScript) $ \s -> do
\r
50 scriptText = relatedValue s ROntology.Script.text
\r
51 R.asyncExec session (R.evalR_ scriptText)
\r
53 """Read an R session from the database. If the session has been closed, a new session is opened with the
\r
54 same configuration."""
\r
55 readSession :: Resource -> <ReadGraph,Proc> R.Session
\r
57 sessionId = relatedValue r L0.HasName
\r
58 in match R.sessionById sessionId with
\r
59 Just session -> session
\r
61 configurationResource = singleObject r L0.PartOf
\r
62 session = R.getOrCreateSession (readSessionConfiguration $ configurationResource) sessionId
\r
63 executeScripts configurationResource session
\r
66 """Create a session based on a given session configuration resource."""
\r
67 createSession :: Resource -> <WriteGraph,Proc> Resource
\r
68 createSession configurationResource = do
\r
69 session = R.createSession $ readSessionConfiguration configurationResource
\r
70 executeScripts configurationResource session
\r
71 sessionResource = writeSession session
\r
72 claim configurationResource L0.ConsistsOf sessionResource
\r
75 """Delete a session resource and close the session that it represents."""
\r
76 deleteSession :: Resource -> <WriteGraph,Proc> ()
\r
77 deleteSession r = do
\r
78 session = readSession r
\r
79 R.closeSession session
\r