* Make sure deleted objects aren't fetched again from database.
Fixes the other half of bug 551 <http://helma.org/bugs/show_bug.cgi?id=551> * Renamed methods in Transactor to make their purpose clearer.
This commit is contained in:
		
							parent
							
								
									9858091c20
								
							
						
					
					
						commit
						90c02cadc0
					
				
					 3 changed files with 27 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -285,7 +285,7 @@ public final class Node implements INode, Serializable {
 | 
			
		|||
                                           " from two threads at the same time.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        current.visitNode(this);
 | 
			
		||||
        current.visitDirtyNode(this);
 | 
			
		||||
        lock = current;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -311,9 +311,9 @@ public final class Node implements INode, Serializable {
 | 
			
		|||
 | 
			
		||||
            if (s == CLEAN) {
 | 
			
		||||
                clearWriteLock();
 | 
			
		||||
                tx.dropNode(this);
 | 
			
		||||
                tx.dropDirtyNode(this);
 | 
			
		||||
            } else {
 | 
			
		||||
                tx.visitNode(this);
 | 
			
		||||
                tx.visitDirtyNode(this);
 | 
			
		||||
 | 
			
		||||
                if (s == NEW) {
 | 
			
		||||
                    clearWriteLock();
 | 
			
		||||
| 
						 | 
				
			
			@ -2580,7 +2580,7 @@ public final class Node implements INode, Serializable {
 | 
			
		|||
 | 
			
		||||
        // register node with the transactor
 | 
			
		||||
        Transactor current = (Transactor) Thread.currentThread();
 | 
			
		||||
        current.visitNode(this);
 | 
			
		||||
        current.visitDirtyNode(this);
 | 
			
		||||
        current.visitCleanNode(this);
 | 
			
		||||
 | 
			
		||||
        // recursively make children persistable
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -165,7 +165,7 @@ public final class NodeManager {
 | 
			
		|||
        Transactor tx = (Transactor) Thread.currentThread();
 | 
			
		||||
 | 
			
		||||
        // See if Transactor has already come across this node
 | 
			
		||||
        Node node = tx.getVisitedNode(key);
 | 
			
		||||
        Node node = tx.getCleanNode(key);
 | 
			
		||||
 | 
			
		||||
        if ((node != null) && (node.getState() != Node.INVALID)) {
 | 
			
		||||
            return node;
 | 
			
		||||
| 
						 | 
				
			
			@ -232,7 +232,7 @@ public final class NodeManager {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        // See if Transactor has already come across this node
 | 
			
		||||
        Node node = tx.getVisitedNode(key);
 | 
			
		||||
        Node node = tx.getCleanNode(key);
 | 
			
		||||
 | 
			
		||||
        if ((node != null) && (node.getState() != Node.INVALID)) {
 | 
			
		||||
            // we used to refresh the node in the main cache here to avoid the primary key
 | 
			
		||||
| 
						 | 
				
			
			@ -277,7 +277,7 @@ public final class NodeManager {
 | 
			
		|||
            // from the database.
 | 
			
		||||
            node = getNodeByRelation(tx.txn, home, kstr, rel, otherDbm);
 | 
			
		||||
 | 
			
		||||
            if (node != null) {
 | 
			
		||||
            if (node != null && node.getState() != Node.DELETED) {
 | 
			
		||||
                Node newNode = node;
 | 
			
		||||
                if (key.equals(node.getKey())) {
 | 
			
		||||
                    node = registerNewNode(node, null);
 | 
			
		||||
| 
						 | 
				
			
			@ -1856,6 +1856,14 @@ public final class NodeManager {
 | 
			
		|||
 | 
			
		||||
        if (id == null) {
 | 
			
		||||
            return null;
 | 
			
		||||
        } else if (Thread.currentThread() instanceof Transactor) {
 | 
			
		||||
            // Check if the node is already registered with the transactor -
 | 
			
		||||
            // it may be in the process of being DELETED.
 | 
			
		||||
            DbKey key = new DbKey(dbmap, id);
 | 
			
		||||
            Node dirtyNode = ((Transactor) Thread.currentThread()).getDirtyNode(key);
 | 
			
		||||
            if (dirtyNode != null) {
 | 
			
		||||
                return dirtyNode;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Hashtable propMap = new Hashtable();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ public class Transactor extends Thread {
 | 
			
		|||
     *
 | 
			
		||||
     * @param node ...
 | 
			
		||||
     */
 | 
			
		||||
    public void visitNode(Node node) {
 | 
			
		||||
    public void visitDirtyNode(Node node) {
 | 
			
		||||
        if (node != null) {
 | 
			
		||||
            Key key = node.getKey();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ public class Transactor extends Thread {
 | 
			
		|||
     *
 | 
			
		||||
     * @param node ...
 | 
			
		||||
     */
 | 
			
		||||
    public void dropNode(Node node) {
 | 
			
		||||
    public void dropDirtyNode(Node node) {
 | 
			
		||||
        if (node != null) {
 | 
			
		||||
            Key key = node.getKey();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -110,6 +110,15 @@ public class Transactor extends Thread {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get a dirty Node from this transaction.
 | 
			
		||||
     * @param key the key
 | 
			
		||||
     * @return the dirty node associated with the key, or null
 | 
			
		||||
     */
 | 
			
		||||
    public Node getDirtyNode(Key key) {
 | 
			
		||||
        return (Node) dirtyNodes.get(key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Keep a reference to an unmodified Node local to this transaction
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +163,7 @@ public class Transactor extends Thread {
 | 
			
		|||
     *
 | 
			
		||||
     * @return ...
 | 
			
		||||
     */
 | 
			
		||||
    public Node getVisitedNode(Object key) {
 | 
			
		||||
    public Node getCleanNode(Object key) {
 | 
			
		||||
        return (key == null) ? null : (Node) cleanNodes.get(key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue