X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.db%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fdb%2FSCLFunctions.java;h=f3d4c34306d71a7bce5c9779ddee01added2ec60;hb=811023407c78ae7f28c706b58b235283c1dd61ac;hp=aae7a89a26da69df9dc3e40360729ec673b754ed;hpb=ab9d7c411f5de4e4453e9bfb893c5a7559202fdb;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java index aae7a89a2..f3d4c3430 100644 --- a/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java +++ b/bundles/org.simantics.scl.db/src/org/simantics/scl/db/SCLFunctions.java @@ -21,6 +21,7 @@ import org.simantics.db.layer0.util.Layer0Utils; import org.simantics.db.layer0.variable.Variables; import org.simantics.db.request.Read; import org.simantics.db.service.ClusterControl; +import org.simantics.db.service.QueryControl; import org.simantics.db.service.SerialisationSupport; import org.simantics.db.service.VirtualGraphSupport; import org.simantics.layer0.utils.triggers.IActivationManager; @@ -35,20 +36,25 @@ import org.simantics.scl.osgi.SCLOsgi; import org.simantics.scl.runtime.SCLContext; import org.simantics.scl.runtime.function.Function; import org.simantics.scl.runtime.function.Function1; +import org.simantics.scl.runtime.reporting.SCLReportingHandler; import org.simantics.scl.runtime.tuple.Tuple; import org.simantics.scl.runtime.tuple.Tuple0; import org.simantics.utils.DataContainer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @SuppressWarnings({"rawtypes", "unchecked"}) public class SCLFunctions { + private static final Logger LOGGER = LoggerFactory.getLogger(SCLFunctions.class); + public static final String GRAPH = "graph"; public static T safeExec(final Function f) { try { return (T)f.apply(Tuple0.INSTANCE); } catch (Throwable t) { - t.printStackTrace(); + LOGGER.error("safeExec caught exception", t); return null; } } @@ -93,18 +99,22 @@ public class SCLFunctions { public static void asyncWrite(final Function f) throws DatabaseException { SCLContext context = SCLContext.createDerivedContext(); - Simantics.getSession().asyncRequest(new WriteRequest() { - @Override - public void perform(WriteGraph graph) throws DatabaseException { - SCLContext.push(context); - context.put(GRAPH, graph); - try { - f.apply(Tuple0.INSTANCE); - } finally { - SCLContext.pop(); + if (Simantics.peekSession() != null) { + Simantics.getSession().asyncRequest(new WriteRequest() { + @Override + public void perform(WriteGraph graph) throws DatabaseException { + SCLContext.push(context); + context.put(GRAPH, graph); + try { + f.apply(Tuple0.INSTANCE); + } finally { + SCLContext.pop(); + } } - } - }); + }); + } else { + LOGGER.warn("No session available for asynchronous write requests"); + } } public static T syncWrite(final Function f) throws DatabaseException { @@ -113,15 +123,18 @@ public class SCLFunctions { if (graph != null) { return (T)f.apply(Tuple0.INSTANCE); } else { + final SCLReportingHandler printer = (SCLReportingHandler)SCLContext.getCurrent().get(SCLReportingHandler.REPORTING_HANDLER); return Simantics.getSession().syncRequest(new WriteResultRequest() { @Override public T perform(WriteGraph graph) throws DatabaseException { SCLContext.push(context); + SCLReportingHandler oldPrinter = (SCLReportingHandler)context.put(SCLReportingHandler.REPORTING_HANDLER, printer); ReadGraph oldGraph = (ReadGraph)context.put(GRAPH, graph); try { return (T)f.apply(Tuple0.INSTANCE); } finally { context.put(GRAPH, oldGraph); + context.put(SCLReportingHandler.REPORTING_HANDLER, oldPrinter); SCLContext.pop(); } } @@ -286,7 +299,7 @@ public class SCLFunctions { } public static void subqueryL(ReadGraph graph, Function query, Function executeCallback, Function1 exceptionCallback, Function1 isDisposedCallback) throws DatabaseException { - graph.asyncRequest(new Subquery(query), new SyncListenerAdapter() { + graph.syncRequest(new Subquery(query), new SyncListenerAdapter() { @Override public void execute(ReadGraph graph, Object result) throws DatabaseException { Simantics.applySCLRead(graph, executeCallback, result); @@ -327,4 +340,25 @@ public class SCLFunctions { return value; } + public static void restrictQueries(ReadGraph graph, int amount, int step, int maxTimeInMs) { + + QueryControl qc = graph.getService(QueryControl.class); + long start = System.currentTimeMillis(); + while(true) { + int current = qc.count(); + if(current < amount) return; + qc.gc(graph, step); + long duration = System.currentTimeMillis() - start; + if(duration > maxTimeInMs) return; + } + + } + + public static int countQueries(ReadGraph graph) { + + QueryControl qc = graph.getService(QueryControl.class); + return qc.count(); + + } + }