]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/query/ExternalReadEntry.java
Still working for multiple readers
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / query / ExternalReadEntry.java
index 7fb8598b7c36087f074ea71425b8c4c2434fc0d1..bd99e1bc4a174368a46a5fa0f8f7db289e8ef6df 100644 (file)
@@ -15,6 +15,7 @@ import java.util.ArrayList;
 import java.util.LinkedList;
 
 import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.impl.DebugPolicy;
 import org.simantics.db.impl.graph.ReadGraphImpl;
 import org.simantics.db.procedure.AsyncProcedure;
 import org.simantics.db.procedure.Procedure;
@@ -47,6 +48,15 @@ final public class ExternalReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>
         request = null;
         super.discard();
     }
+
+    @Override
+    public void setPending() {
+        if(result != NO_RESULT) {
+            //new Exception("result = " + result).printStackTrace();
+        }
+        statusOrException = PENDING;
+        result = REQUIRES_COMPUTATION;
+    }
     
     public ExternalReadEntry(ExternalRead<T> request) {
         assert request != null;
@@ -89,6 +99,25 @@ final public class ExternalReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>
         
     }
     
+    @Override
+    public void except(Throwable t) {
+        if(DebugPolicy.QUERY_STATE) System.out.println("[QUERY STATE]: excepted " + this);
+        if(statusOrException != DISCARDED) {
+            statusOrException = EXCEPTED;
+            result = t;
+        } else {
+            result = t;
+        }
+        assert(isExcepted());
+    }
+    
+    @Override
+    public void setResult(Object result) {
+        super.setResult(result);
+        assert(!(result instanceof Throwable));
+        assert(!isExcepted());
+    }
+
     @Override
     final public Query getQuery() {
        
@@ -102,6 +131,7 @@ final public class ExternalReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>
 
                                        // Update
                                        if(!items.isEmpty()) {
+                                           setReady();
                                                setResult(items.removeFirst());
                                        }
                                        // Reschedule
@@ -163,7 +193,7 @@ final public class ExternalReadEntry<T> extends CacheEntryBase<AsyncProcedure<T>
        // Do nothing - the state is already set and cannot be recomputed on demand
     }
 
-       @Override
+       //@Override
        public Object compute(ReadGraphImpl graph, AsyncProcedure<T> procedure) throws DatabaseException {
        return graph.processor.cache.performQuery(graph, request, this, procedure);
        }