X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.impl%2Fsrc%2Forg%2Fsimantics%2Fdb%2Fimpl%2Fgraph%2FReadGraphImpl.java;h=299396ed715a6fb514b2474fd4b29933ab982b12;hb=de8b6e194da6d56c410101d9c72763078b0e8717;hp=3337e55b8455d88dd760efbfc19fe0df08e31a50;hpb=1cb58fb59cd64891c682a7e7b04e00af9e3be575;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java index 3337e55b8..299396ed7 100644 --- a/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java +++ b/bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java @@ -26,6 +26,7 @@ import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.Map; import java.util.Set; import java.util.function.Consumer; @@ -45,6 +46,7 @@ import org.simantics.databoard.util.binary.BinaryFile; import org.simantics.databoard.util.binary.RandomAccessBinary; import org.simantics.db.AsyncReadGraph; import org.simantics.db.DevelopmentKeys; +import org.simantics.db.ExternalValue; import org.simantics.db.ExternalValueSupport; import org.simantics.db.ReadGraph; import org.simantics.db.RelationContext; @@ -87,6 +89,7 @@ import org.simantics.db.common.primitiverequest.UniqueAdapter; import org.simantics.db.common.primitiverequest.Value; import org.simantics.db.common.primitiverequest.ValueImplied; import org.simantics.db.common.primitiverequest.VariantValueImplied; +import org.simantics.db.common.procedure.BlockingAsyncProcedure; import org.simantics.db.common.procedure.adapter.AsyncMultiProcedureAdapter; import org.simantics.db.common.procedure.adapter.ProcedureAdapter; import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener; @@ -111,6 +114,7 @@ import org.simantics.db.common.procedure.wrapper.SyncToAsyncProcedure; import org.simantics.db.common.procedure.wrapper.SyncToAsyncSetProcedure; import org.simantics.db.common.request.AdaptValue; import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.common.utils.Functions; import org.simantics.db.common.utils.Logger; import org.simantics.db.common.utils.NameUtils; import org.simantics.db.common.validation.L0Validations; @@ -134,12 +138,16 @@ import org.simantics.db.impl.ResourceImpl; import org.simantics.db.impl.internal.RandomAccessValueSupport; import org.simantics.db.impl.internal.ResourceData; import org.simantics.db.impl.procedure.CallWrappedSingleQueryProcedure4; +import org.simantics.db.impl.procedure.InternalProcedure; import org.simantics.db.impl.procedure.ResultCallWrappedQueryProcedure4; import org.simantics.db.impl.procedure.ResultCallWrappedSingleQueryProcedure4; import org.simantics.db.impl.query.CacheEntry; +import org.simantics.db.impl.query.QueryCache; +import org.simantics.db.impl.query.QueryCacheBase; import org.simantics.db.impl.query.QueryProcessor; import org.simantics.db.impl.query.QuerySupport; import org.simantics.db.impl.query.TripleIntProcedure; +import org.simantics.db.impl.query.QueryProcessor.SessionTask; import org.simantics.db.impl.support.ResourceSupport; import org.simantics.db.procedure.AsyncListener; import org.simantics.db.procedure.AsyncMultiListener; @@ -177,6 +185,7 @@ import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.exceptions.SCLTypeParseException; import org.simantics.scl.reflection.ReflectionUtils; import org.simantics.scl.reflection.ValueNotFoundException; +import org.simantics.scl.runtime.function.Function1; import org.simantics.scl.runtime.function.Function3; import org.simantics.utils.DataContainer; import org.simantics.utils.Development; @@ -278,8 +287,17 @@ public class ReadGraphImpl implements ReadGraph { try { - return syncRequest(new org.simantics.db.common.primitiverequest.Resource( - id)); +// assert (id != null); +// assert (procedure != null); +// +// processor.forResource(this, id, procedure); +// +//// return syncRequest(new org.simantics.db.common.primitiverequest.Resource( +//// id)); + + Integer rid = QueryCache.resultURIToResource(this, id, parent, null); + if(rid == 0) throw new ResourceNotFoundException(id); + return processor.querySupport.getResource(rid); } catch (ResourceNotFoundException e) { @@ -309,8 +327,10 @@ public class ReadGraphImpl implements ReadGraph { try { - return syncRequest(new org.simantics.db.common.primitiverequest.Resource( - id)); + return getResource(id); + +// return syncRequest(new org.simantics.db.common.primitiverequest.Resource( +// id)); } catch (ResourceNotFoundException e) { @@ -331,6 +351,32 @@ public class ReadGraphImpl implements ReadGraph { } } + + @Override + public Map getChildren(Resource resource) throws ValidationException, ServiceException { + + assert (resource != null); + + try { + + int rId = processor.querySupport.getId(resource); + return QueryCache.resultChildMap(this, rId, parent, null); + + } catch (ValidationException e) { + + throw new ValidationException(e); + + } catch (ServiceException e) { + + throw new ServiceException(e); + + } catch (DatabaseException e) { + + throw new ServiceException(INTERNAL_ERROR_STRING, e); + + } + + } final public Resource getRootLibrary() { return processor.getRootLibraryResource(); @@ -1896,7 +1942,9 @@ public class ReadGraphImpl implements ReadGraph { assert (request != null); - return processor.query(this, request, parent, null, null); + return QueryCache.resultReadEntry(this, request, parent, null, null); + + //return processor.query(this, request, parent, null, null); // if (parent != null) { // @@ -1948,7 +1996,9 @@ public class ReadGraphImpl implements ReadGraph { ListenerBase listener = procedure != null ? getListenerBase(procedure) : null; - return processor.query(this, request, parent, procedure, listener); + return QueryCache.resultReadEntry(this, request, parent, listener, procedure); + +// return processor.query(this, request, parent, procedure, listener); // if (parent != null || listener != null) { @@ -2025,7 +2075,7 @@ public class ReadGraphImpl implements ReadGraph { throw (DatabaseException) exception; else throw new DatabaseException( - "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)", + "Unexpected exception in ReadGraph.syncRequest(AsyncRead)", exception); } } @@ -2041,10 +2091,12 @@ public class ReadGraphImpl implements ReadGraph { throws DatabaseException { assert (request != null); - AsyncReadProcedure procedure = new AsyncReadProcedure(); - syncRequest(request, procedure); - procedure.checkAndThrow(); - return procedure.result; +// AsyncReadProcedure procedure = new AsyncReadProcedure(); + BlockingAsyncProcedure ap = new BlockingAsyncProcedure<>(this, null, request); + syncRequest(request, ap); + return ap.get(); +// procedure.checkAndThrow(); +// return procedure.result; // return syncRequest(request, new AsyncProcedureAdapter()); @@ -2076,12 +2128,18 @@ public class ReadGraphImpl implements ReadGraph { ListenerBase listener = getListenerBase(procedure); - final ResultCallWrappedSingleQueryProcedure4 wrapper = new ResultCallWrappedSingleQueryProcedure4( - procedure, request); + BlockingAsyncProcedure ap = new BlockingAsyncProcedure<>(this, procedure, request); + +// final ResultCallWrappedSingleQueryProcedure4 wrapper = new ResultCallWrappedSingleQueryProcedure4( +// procedure, request); + + QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true); + + //processor.query(this, request, parent, wrapper, listener); - processor.query(this, request, parent, wrapper, listener); + return ap.get(); - return wrapper.getResult(); +// return wrapper.getResult(); // if (parent != null || listener != null || ((request.getFlags() & RequestFlags.SCHEDULE) > 0)) { // @@ -2147,35 +2205,16 @@ public class ReadGraphImpl implements ReadGraph { assert (request != null); ListenerBase listener = getListenerBase(procedure); + assert(listener == null); - final ResultCallWrappedSingleQueryProcedure4 wrapper = new ResultCallWrappedSingleQueryProcedure4( - procedure, request); - - processor.query(this, request, parent, wrapper, listener); + BlockingAsyncProcedure ap = new BlockingAsyncProcedure<>(this, procedure, request); + +// final ResultCallWrappedSingleQueryProcedure4 wrapper = new ResultCallWrappedSingleQueryProcedure4( +// procedure, request); -// if (parent != null || listener != null || ((request.getFlags() & RequestFlags.SCHEDULE) > 0)) { -// -// -// } else { -// -// try { -// -//// final ReadGraphImpl newGraph = newSync(); -// processor.tryQuery(this, request, procedure); -//// newGraph.waitAsync(null); -// waitAsyncProcedure(procedure); -// -// } catch (Throwable t) { -// if(Development.DEVELOPMENT) { -// if(Development.getProperty(DevelopmentKeys.WRITEGRAPH_EXCEPTION_STACKTRACES, Bindings.BOOLEAN)) { -// t.printStackTrace(); -// } -// } -// procedure.exception(this, t); -// waitAsyncProcedure(procedure); -// } -// -// } + QueryCache.runnerAsyncReadEntry(this, request, parent, listener, ap, true); + + ap.get(); } @@ -2541,28 +2580,38 @@ public class ReadGraphImpl implements ReadGraph { final public T syncRequest(final ExternalRead request, final Procedure procedure) throws DatabaseException { - assert (request != null); - - ListenerBase listener = getListenerBase(procedure); - - final DataContainer exception = new DataContainer(); - final DataContainer result = new DataContainer(); + assert (request != null); - processor.query(this, request, parent, new Procedure() { + ListenerBase listener = procedure != null ? getListenerBase(procedure) : null; + return QueryCache.resultExternalReadEntry(this, request, parent, listener, procedure); - @Override - public void exception(Throwable throwable) { - exception.set(throwable); - procedure.exception(throwable); - } - - @Override - public void execute(T t) { - result.set(t); - procedure.execute(t); - } - - }, listener); +// +// ListenerBase listener = getListenerBase(procedure); +// +// return QueryCache.resultExternalReadEntry(this, request, parent, listener, procedure); + +// assert (request != null); +// +// ListenerBase listener = getListenerBase(procedure); +// +// final DataContainer exception = new DataContainer(); +// final DataContainer result = new DataContainer(); +// +// processor.query(this, request, parent, new Procedure() { +// +// @Override +// public void exception(Throwable throwable) { +// exception.set(throwable); +// procedure.exception(throwable); +// } +// +// @Override +// public void execute(T t) { +// result.set(t); +// procedure.execute(t); +// } +// +// }, listener); @@ -2596,18 +2645,18 @@ public class ReadGraphImpl implements ReadGraph { // } // // } - - Throwable t = exception.get(); - if (t != null) { - if (t instanceof DatabaseException) - throw (DatabaseException) t; - else - throw new DatabaseException( - "Unexpected exception in ReadGraph.syncRequest(Read)", - t); - } - - return result.get(); +// +// Throwable t = exception.get(); +// if (t != null) { +// if (t instanceof DatabaseException) +// throw (DatabaseException) t; +// else +// throw new DatabaseException( +// "Unexpected exception in ReadGraph.syncRequest(Read)", +// t); +// } +// +// return result.get(); } @@ -5353,11 +5402,6 @@ public class ReadGraphImpl implements ReadGraph { return processor.getSession(); } -// @Override -// final public Builtins getBuiltins() { -// return processor.getSession().getBuiltins(); -// } - @Override public void asyncRequest(final Read request) { @@ -5402,46 +5446,20 @@ public class ReadGraphImpl implements ReadGraph { assert (request != null); assert (procedure != null); + + processor.schedule(new SessionTask(false) { - final ListenerBase listener = getListenerBase(procedure); - - if (parent != null || listener != null) { - - try { - processor.query(this, request, parent, procedure,listener); - } catch (DatabaseException e) { - Logger.defaultLogError(e); - // This throwable has already been transferred to procedure at this point - do nothing about it - // - } - - } else { - -// final ReadGraphImpl newGraph = newSync(); - - try { - - T result = request.perform(this); - + @Override + public void run(int thread) { try { - procedure.execute(this, result); - } catch (Throwable t) { - Logger.defaultLogError(t); + final ListenerBase listener = getListenerBase(procedure); + QueryCache.runnerReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false); + } catch (DatabaseException e) { + Logger.defaultLogError(e); } - - } catch (Throwable t) { - - try { - procedure.exception(this, t); - } catch (Throwable t2) { - Logger.defaultLogError(t2); - } - - } finally { - } - - } + + }); } @@ -5449,10 +5467,6 @@ public class ReadGraphImpl implements ReadGraph { return new ReadGraphImpl(null, support); } - public static ReadGraphImpl forRecompute(CacheEntry entry, QueryProcessor support) { - return new ReadGraphImpl(entry, support); - } - @Override public void asyncRequest(Read request, SyncProcedure procedure) { asyncRequest(request, new SyncToAsyncProcedure(procedure)); @@ -5513,37 +5527,19 @@ public class ReadGraphImpl implements ReadGraph { assert (request != null); assert (procedure != null); - final ListenerBase listener = getListenerBase(procedure); - - if (parent != null || listener != null) { - - try { - processor.query(this, request, parent, procedure, listener); - } catch (DatabaseException e) { - Logger.defaultLogError(e); - } - - } else { - - try { - - request.perform(this, new CallWrappedSingleQueryProcedure4(procedure, request)); - - } catch (Throwable t) { - - if (t instanceof DatabaseException) - procedure.exception(this, t); - else - procedure - .exception( - this, - new DatabaseException( - "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)", - t)); + processor.schedule(new SessionTask(false) { + @Override + public void run(int thread) { + try { + final ListenerBase listener = getListenerBase(procedure); + QueryCache.runnerAsyncReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false); + } catch (DatabaseException e) { + Logger.defaultLogError(e); + } } - - } + + }); } @@ -5774,56 +5770,125 @@ public class ReadGraphImpl implements ReadGraph { final public void asyncRequest(final ExternalRead request, final Procedure procedure) { - assert (request != null); - assert (procedure != null); - - ListenerBase listener = getListenerBase(procedure); - - if (parent != null || listener != null) { - - processor.query(this, request, parent, procedure, listener); - - } else { - - try { + + assert (request != null); + assert (procedure != null); - request.register(this, new Listener() { + final ListenerBase listener = getListenerBase(procedure); - @Override - public void execute(T result) { - procedure.execute(result); - } + if (parent != null || listener != null) { - @Override - public void exception(Throwable t) { - procedure.exception(t); - } + try { + QueryCacheBase.resultExternalReadEntry(this, request, parent, listener, procedure); + //processor.query(this, request, parent, procedure,listener); + } catch (DatabaseException e) { + Logger.defaultLogError(e); + // This throwable has already been transferred to procedure at this point - do nothing about it + // + } + + } else { - @Override - public String toString() { - return "asyncRequest(PrimitiveRead) -> " + request; - } + request.register(this, new Listener() { + // + @Override + public void execute(T result) { + procedure.execute(result); + } - @Override - public boolean isDisposed() { - return true; - } + @Override + public void exception(Throwable t) { + procedure.exception(t); + } - }); + @Override + public String toString() { + return "asyncRequest(PrimitiveRead) -> " + request; + } - } catch (Throwable t) { + @Override + public boolean isDisposed() { + return true; + } - if (t instanceof DatabaseException) - procedure.exception(t); - else - procedure - .exception(new DatabaseException( - "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)", - t)); + }); + +// final ReadGraphImpl newGraph = newSync(); - } +// try { +// +// T result = request.perform(this); +// +// try { +// procedure.execute(this, result); +// } catch (Throwable t) { +// Logger.defaultLogError(t); +// } +// +// } catch (Throwable t) { +// +// try { +// procedure.exception(this, t); +// } catch (Throwable t2) { +// Logger.defaultLogError(t2); +// } +// +// } finally { +// +// } - } + } + +// assert (request != null); +// assert (procedure != null); +// +// ListenerBase listener = getListenerBase(procedure); +// +// if (parent != null || listener != null) { +// +// processor.query(this, request, parent, procedure, listener); +// +// } else { +// +// try { +// +// request.register(this, new Listener() { +// +// @Override +// public void execute(T result) { +// procedure.execute(result); +// } +// +// @Override +// public void exception(Throwable t) { +// procedure.exception(t); +// } +// +// @Override +// public String toString() { +// return "asyncRequest(PrimitiveRead) -> " + request; +// } +// +// @Override +// public boolean isDisposed() { +// return true; +// } +// +// }); +// +// } catch (Throwable t) { +// +// if (t instanceof DatabaseException) +// procedure.exception(t); +// else +// procedure +// .exception(new DatabaseException( +// "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)", +// t)); +// +// } +// +// } } @@ -5942,53 +6007,17 @@ public class ReadGraphImpl implements ReadGraph { return thread == Integer.MIN_VALUE; } -// final private boolean isSync(int thread) { -// return thread < -1 && thread > Integer.MIN_VALUE; -// } - ReadGraphImpl(ReadGraphImpl graph) { this(graph.parent, graph.processor); } ReadGraphImpl(CacheEntry parent, QueryProcessor support) { -// this.state = new ReadGraphState(barrier, support); this.parent = parent; this.processor = support; } - ReadGraphImpl(final QueryProcessor support) { - -// this.state = state; - this.processor = support; - this.parent = null; - - } - -// public static ReadGraphImpl createSync(int syncThread, Object syncParent, -// ReadGraphSupportImpl support) { -// return new ReadGraphImpl(syncThread, syncThread, syncParent, null, -// support, new AsyncBarrierImpl(null)); -// } - public static ReadGraphImpl create(QueryProcessor support) { - return new ReadGraphImpl(support); - } - -// public ReadGraphImpl newAsync() { -// return this; -//// if(!state.synchronizedExecution) { -//// return this; -//// } else { -//// return new ReadGraphImpl(false, parent, state.support, state.barrier); -//// } -// } - -// public ReadGraphImpl newSync() { -// return new ReadGraphImpl(parent, processor); -// } - - public ReadGraphImpl newSync(CacheEntry parentEntry) { - return new ReadGraphImpl(parentEntry, processor); + return new ReadGraphImpl(null, support); } public ReadGraphImpl newRestart(ReadGraphImpl impl) { @@ -5996,41 +6025,10 @@ public class ReadGraphImpl implements ReadGraph { WriteGraphImpl write = processor.getSession().getService( WriteGraphImpl.class); -// if (write.callerThread != impl.callerThread) -// return new WriteGraphImpl(impl.callerThread, parent, state.support, write.writeSupport, write.provider, write.state.barrier); return write; } -// public ReadGraphImpl newSync(Object parentRequest) { -// return new ReadGraphImpl(callerThread, state.parent, state.support, new AsyncBarrierImpl(state.barrier)); -// } - -// public ReadGraphImpl newSync(final int callerThread, Object parentRequest) { -// assert (state.syncThread == callerThread || (state.syncThread == Integer.MIN_VALUE && callerThread != Integer.MIN_VALUE)); -// return new ReadGraphImpl(callerThread, callerThread, parentRequest, -// state.parent, state.support, new AsyncBarrierImpl(state.barrier)); -// } -// -// public ReadGraphImpl newSyncAsync(Object parentRequest) { -//// assert (callerThread < 0); -// return new ReadGraphImpl(callerThread, state.syncThread, parentRequest, -// state.parent, state.support, new AsyncBarrierImpl(state.barrier)); -// } -// -// public ReadGraphImpl newSyncAsync(final int callerThread, -// Object parentRequest) { -//// assert (callerThread < 0); -// // assert(state.syncThread == callerThread || (state.syncThread == Integer.MIN_VALUE -// // && callerThread != Integer.MIN_VALUE) ); -// return new ReadGraphImpl(callerThread, callerThread, parentRequest, -// state.parent, state.support, new AsyncBarrierImpl(state.barrier)); -// } - - public ReadGraphImpl withAsyncParent(CacheEntry parent) { - return new ReadGraphImpl(parent, processor); - } - public ReadGraphImpl withParent(CacheEntry parent) { if(parent == this.parent) return this; else return new ReadGraphImpl(parent, processor); @@ -6047,56 +6045,13 @@ public class ReadGraphImpl implements ReadGraph { assert(procedure.done()); -// while (!procedure.done()) { -// -// boolean executed = processor.resumeTasks(callerThread, null, null); -// if (!executed) { -// try { -// Thread.sleep(1); -// // sema.tryAcquire(1, TimeUnit.MILLISECONDS); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } -// -// } - } public void waitAsyncProcedure(AsyncReadProcedure procedure) { assert(procedure.done()); -// while (!procedure.done()) { -// -// boolean executed = processor.processor.resume(this); -// if (!executed) { -// try { -// Thread.sleep(1); -// // sema.tryAcquire(1, TimeUnit.MILLISECONDS); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } -// -// } - } - -// public void waitAsync(Object request) { -// try { -// state.barrier.waitBarrier(request, this); -// } catch (Throwable t) { -// t.printStackTrace(); -// processor.scanPending(); -// processor.querySupport.checkTasks(); -// throw new RuntimeDatabaseException(t); -// } -// } - -// public void restart() { -// state.barrier.restart(); -// } public boolean resumeTasks() { return processor.resumeTasks(this); @@ -6384,6 +6339,9 @@ public class ReadGraphImpl implements ReadGraph { return getValue(r); } } + else if(types.contains(L0.Function)) { + return Functions.exec(this, r, this, r, context); + } else if(types.contains(L0.ExternalValue)) { return (T)syncRequest(new AdaptValue(r), TransientCacheListener.instance()); } @@ -6414,6 +6372,14 @@ public class ReadGraphImpl implements ReadGraph { return getVariantValue(r); } } + else if(types.contains(L0.Function)) { + Object value = Functions.exec(this, r, this, r, context); + try { + return new Variant(Bindings.OBJECT.getContentBinding(value), value); + } catch ( org.simantics.databoard.binding.error.BindingException e ) { + throw new BindingException( "No binding found for class " + value.getClass().getName(), e ); + } + } else if(types.contains(L0.ExternalValue)) { Object value = syncRequest(new AdaptValue(r), TransientCacheListener.instance()); try { @@ -6467,7 +6433,8 @@ public class ReadGraphImpl implements ReadGraph { for(Resource converter : graph.getObjects(resource, L0.ConvertsToValueWith)) { try { if(L0.Functions_functionApplication.equals(converter)) { - return (Function3)graph.syncRequest(new AdaptValue(resource)); + return AdaptValue.functionApplication; + //return (Function3)graph.syncRequest(new AdaptValue(resource)); } else { return graph.getValue2(converter, resource); } @@ -6523,11 +6490,28 @@ public class ReadGraphImpl implements ReadGraph { } else { return getValue(r, binding); } + } else if(types.contains(L0.Function)) { + Object value = Functions.exec(this, r, this, r, context); + if(binding.isInstance(value)) return (T)value; + try { + Binding srcBinding = Bindings.OBJECT.getContentBinding(value); + return (T)Bindings.adapt(value, srcBinding, binding); + } catch(RuntimeException e) { + DatabaseException dte = findPossibleRootException(e); + if(dte != null) throw dte; + else throw new DatabaseException(e); + } catch (AdaptException e) { + throw new DatabaseException(e); + } catch (org.simantics.databoard.binding.error.BindingException e) { + throw new DatabaseException(e); + } } else if(types.contains(L0.ExternalValue)) { try { - return (T)ReflectionUtils.getValue(getURI(r)).getValue(); - } catch(ValueNotFoundException e) { - throw new DatabaseException(e); + ExternalValue ev = adapt(r, ExternalValue.class); + return ev.getValue(this, r); + //return (T)ReflectionUtils.getValue(getURI(r)).getValue(); +// } catch(ValueNotFoundException e) { +// throw new DatabaseException(e); } catch(ClassCastException e) { throw new DatabaseException(e); } @@ -6672,16 +6656,22 @@ public class ReadGraphImpl implements ReadGraph { } } + private static ThreadLocal syncGraph = new ThreadLocal() { + protected Boolean initialValue() { + return true; + } + }; + @Override public boolean setSynchronous(boolean value) { - boolean old = processor.synch; - processor.synch = value; + boolean old = getSynchronous(); + syncGraph.set(value); return old; } @Override public boolean getSynchronous() { - return processor.synch; + return syncGraph.get(); } public void ensureLoaded(int resource) { @@ -6712,5 +6702,10 @@ public class ReadGraphImpl implements ReadGraph { public Object getModificationCounter() { return processor.getSession().getModificationCounter(); } + + @Override + public boolean performPending() { + return processor.performPending(processor.thread.get()); + } }