import "R/R" as R import "Simantics/DB" import "http://www.simantics.org/R-1.0" as ROntology import "http://www.simantics.org/Layer0-1.1" as L0 """Creates a new session configuration to graph as a part of the parent resource. This function does not link it to any other resources.""" createSessionConfiguration :: Resource -> R.SessionConfiguration -> Resource createSessionConfiguration parent (R.SessionConfiguration host port username password) = do r = newResource () claim r L0.InstanceOf ROntology.SessionConfiguration claim r L0.PartOf parent sessionName = host + "-" + show port claimRelatedValue r L0.HasName sessionName claimRelatedValue r ROntology.SessionConfiguration.host host claimRelatedValue r ROntology.SessionConfiguration.port port claimRelatedValue r ROntology.SessionConfiguration.username username claimRelatedValue r ROntology.SessionConfiguration.password password r """Add an R script into the session configuration resource. The script is executed when a new session is opened with the createSession function.""" addScript :: Resource -> String -> Resource addScript sessionConfiguration scriptText = do r = newResource () claim r L0.InstanceOf ROntology.Script claim sessionConfiguration ROntology.SessionConfiguration.hasScript r claimRelatedValue r ROntology.Script.text scriptText r """Read session configuration from the database.""" readSessionConfiguration :: Resource -> R.SessionConfiguration readSessionConfiguration r = R.SessionConfiguration (relatedValue r ROntology.SessionConfiguration.host) (relatedValue r ROntology.SessionConfiguration.port) (relatedValue r ROntology.SessionConfiguration.username) (relatedValue r ROntology.SessionConfiguration.password) """Write an R session into the database.""" writeSession :: R.Session -> Resource writeSession session = do r = newResource () claim r L0.InstanceOf ROntology.Session claimRelatedValue r L0.HasName $ R.sessionIdOf session r """Execute the scripts defined for a session configuration using the given session.""" executeScripts :: Resource -> R.Session -> () executeScripts configurationResource session = for (configurationResource # ROntology.SessionConfiguration.hasScript) $ \s -> do scriptText = relatedValue s ROntology.Script.text R.asyncExec session (R.evalR_ scriptText) """Read an R session from the database. If the session has been closed, a new session is opened with the same configuration.""" readSession :: Resource -> R.Session readSession r = let sessionId = relatedValue r L0.HasName in match R.sessionById sessionId with Just session -> session Nothing -> do configurationResource = singleObject r L0.PartOf session = R.getOrCreateSession (readSessionConfiguration $ configurationResource) sessionId executeScripts configurationResource session session """Create a session based on a given session configuration resource.""" createSession :: Resource -> Resource createSession configurationResource = do session = R.createSession $ readSessionConfiguration configurationResource executeScripts configurationResource session sessionResource = writeSession session claim configurationResource L0.ConsistsOf sessionResource sessionResource """Delete a session resource and close the session that it represents.""" deleteSession :: Resource -> () deleteSession r = do session = readSession r R.closeSession session denyAllStatements r