Update of /var/cvs/src/org/mmbase/module/core
In directory james.mmbase.org:/tmp/cvs-serv26720
Modified Files:
Tag: MMBase-1_8
TransactionManager.java
Log Message:
temporary rolled back last changed, because it gave some unexpected problems
See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/module/core
Index: TransactionManager.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/module/core/TransactionManager.java,v
retrieving revision 1.34.2.2
retrieving revision 1.34.2.3
diff -u -b -r1.34.2.2 -r1.34.2.3
--- TransactionManager.java 11 Nov 2008 09:07:07 -0000 1.34.2.2
+++ TransactionManager.java 18 Nov 2008 23:23:15 -0000 1.34.2.3
@@ -19,7 +19,7 @@
/**
* @javadoc
* @author Rico Jansen
- * @version $Id: TransactionManager.java,v 1.34.2.2 2008/11/11 09:07:07
michiel Exp $
+ * @version $Id: TransactionManager.java,v 1.34.2.3 2008/11/18 23:23:15
michiel Exp $
*/
public class TransactionManager implements TransactionManagerInterface {
@@ -222,25 +222,45 @@
private final static int NODE = 3;
private final static int RELATION = 4;
- private class NodeState {
- public int exists;
- public int state;
- public boolean changed = true;
+ boolean performCommits(Object user, Collection nodes) {
+ if (nodes == null || nodes.size() == 0) {
+ log.warn("Empty list of nodes");
+ return true;
}
- /**
- * @since MMBase-1.8.7
- */
- private void commitNode(Object user, MMObjectNode node, NodeState state) {
+ int[] nodestate = new int[nodes.size()];
+ int[] nodeexist = new int[nodes.size()];
+ String username = findUserName(user),exists;
- if (state.exists == I_EXISTS_YES ) {
- if (! state.changed) return;
- // Commit also if not changed, because the node may have been
deleted or changed by
- // someone else. It is like this in the transaction it should be
saved like this.
- // See also MMB-1680
- // TODO: what is the performance penalty here?
+ log.debug("Checking types and existance");
+ int i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
+ MMObjectNode node = (MMObjectNode)nodeIterator.next();
+ // Nodes are uncommited by default
+ nodestate[i] = UNCOMMITED;
+ exists = node.getStringValue("_exists");
+ if (exists == null) {
+ throw new IllegalStateException("The _exists field does not
exist on node "+node);
+ } else if (exists.equals(EXISTS_NO)) {
+ nodeexist[i]=I_EXISTS_NO;
+ } else if (exists.equals(EXISTS_YES)) {
+ nodeexist[i]=I_EXISTS_YES;
+ } else if (exists.equals(EXISTS_NOLONGER)) {
+ nodeexist[i]=I_EXISTS_NOLONGER;
+ } else {
+ throw new IllegalStateException("Invalid value for _exists on
node "+node);
+ }
+ }
+ log.debug("Commiting nodes");
+
+ // First commit all the NODES
+ i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
+ MMObjectNode node = (MMObjectNode)nodeIterator.next();
+ if (!(node.getBuilder() instanceof InsRel)) {
+ if (nodeexist[i] == I_EXISTS_YES ) {
// use safe commit, which locks the node cache
boolean commitOK;
if (user instanceof UserContext) {
@@ -249,141 +269,108 @@
commitOK = node.parent.safeCommit(node);
}
if (commitOK) {
- state.state = COMMITED;
+ nodestate[i] = COMMITED;
} else {
- state.state = FAILED;
+ nodestate[i] = FAILED;
}
- } else if (state.exists == I_EXISTS_NO ) {
+ } else if (nodeexist[i] == I_EXISTS_NO ) {
int insertOK;
if (user instanceof UserContext) {
insertOK = node.insert((UserContext)user);
} else {
- String username = findUserName(user);
insertOK = node.parent.safeInsert(node, username);
}
if (insertOK > 0) {
- state.state = COMMITED;
+ nodestate[i] = COMMITED;
} else {
- state.state = FAILED;
+ nodestate[i] = FAILED;
String message = "When this failed, it is possible that the
creation of an insrel went right, which leads to a database inconsistency..
stop now.. (transaction 2.0: [rollback?])";
+ log.error(message);
throw new RuntimeException(message);
}
}
}
-
- boolean performCommits(Object user, Collection nodes) {
- if (nodes == null || nodes.size() == 0) {
- log.warn("Empty list of nodes");
- return true;
}
- Map stati = new HashMap();
-
- String username = findUserName(user);
-
- log.debug("Checking types and existance");
-
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
- MMObjectNode node = (MMObjectNode)nodeIterator.next();
- NodeState state = new NodeState();
- state.state = UNCOMMITED;
- state.changed = node.isChanged() || node.isNew();
- // Nodes are uncommited by default
- String exists = node.getStringValue("_exists");
- if (exists == null) {
- throw new IllegalStateException("The _exists field does not
exist on node "+node);
- } else if (exists.equals(EXISTS_NO)) {
- state.exists = I_EXISTS_NO;
- } else if (exists.equals(EXISTS_YES)) {
- state.exists = I_EXISTS_YES;
- } else if (exists.equals(EXISTS_NOLONGER)) {
- state.exists = I_EXISTS_NOLONGER;
- } else {
- throw new IllegalStateException("Invalid value for _exists on
node "+node);
- }
- stati.put(new Integer(node.getNumber()), state);
- }
+ log.debug("Commiting relations");
- // Now set the 'chanaged' flag of all node to or frm a relation was
made.
- // Related to MMB-1680
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
+ // Then commit all the RELATIONS
+ i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
MMObjectNode node = (MMObjectNode)nodeIterator.next();
if (node.getBuilder() instanceof InsRel) {
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- if (state.changed) {
- NodeState sstate = (NodeState) stati.get(new
Integer(node.getIntValue("snumber")));
- if (sstate != null) sstate.changed = true;
- NodeState dstate = (NodeState) stati.get(new
Integer(node.getIntValue("dnumber")));
- if (dstate != null) dstate.changed = true;
+ // excactly the same code as 10 lines ago. Should be
dispatched to some method..
+ if (nodeexist[i] == I_EXISTS_YES ) {
+ boolean commitOK;
+ if (user instanceof UserContext) {
+ commitOK = node.commit((UserContext)user);
+ } else {
+ commitOK = node.parent.safeCommit(node);
}
-
+ if (commitOK) {
+ nodestate[i] = COMMITED;
+ } else {
+ nodestate[i] = FAILED;
}
+ } else if (nodeexist[i] == I_EXISTS_NO ) {
+ int insertOK;
+ if (user instanceof UserContext) {
+ insertOK = node.insert((UserContext)user);
+ } else {
+ insertOK = node.parent.safeInsert(node, username);
}
-
-
- log.debug("Commiting nodes");
-
- // First commit all the NODES
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
- MMObjectNode node = (MMObjectNode)nodeIterator.next();
- if (!(node.getBuilder() instanceof InsRel)) {
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- commitNode(user, node, state);
+ if (insertOK > 0) {
+ nodestate[i] = COMMITED;
+ } else {
+ nodestate[i] = FAILED;
+ String message = "relation failed(transaction 2.0:
[rollback?])";
+ log.error(message);
}
}
-
- log.debug("Commiting relations");
-
- // Then commit all the RELATIONS
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
- MMObjectNode node = (MMObjectNode)nodeIterator.next();
- if (node.getBuilder() instanceof InsRel) {
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- commitNode(user, node, state);
}
}
log.debug("Deleting relations");
// Then commit all the RELATIONS that must be deleted
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
+ i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
MMObjectNode node = (MMObjectNode)nodeIterator.next();
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- if (node.getBuilder() instanceof InsRel && state.exists ==
I_EXISTS_NOLONGER) {
+ if (node.getBuilder() instanceof InsRel && nodeexist[i] ==
I_EXISTS_NOLONGER) {
// no return information
if (user instanceof UserContext) {
node.remove((UserContext)user);
} else {
node.parent.removeNode(node);
}
- state.state = COMMITED;
+ nodestate[i]=COMMITED;
}
}
log.debug("Deleting nodes");
// Then commit all the NODES that must be deleted
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
+ i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
MMObjectNode node = (MMObjectNode)nodeIterator.next();
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- if (!(node.getBuilder() instanceof InsRel) && (state.exists ==
I_EXISTS_NOLONGER)) {
+ if (!(node.getBuilder() instanceof InsRel) && (nodeexist[i] ==
I_EXISTS_NOLONGER)) {
// no return information
if (user instanceof UserContext) {
node.remove((UserContext)user);
} else {
node.parent.removeNode(node);
}
- state.state = COMMITED;
+ nodestate[i]=COMMITED;
}
}
// check for failures
- boolean okay = true;
- for (Iterator nodeIterator = nodes.iterator();
nodeIterator.hasNext();) {
+ boolean okay=true;
+ i = 0;
+ for (Iterator nodeIterator = nodes.iterator(); nodeIterator.hasNext();
i++) {
MMObjectNode node = (MMObjectNode)nodeIterator.next();
- NodeState state = (NodeState) stati.get(new
Integer(node.getNumber()));
- if (state.state == FAILED) {
- okay = false;
- log.error("Failed node " + node.toString());
+ if (nodestate[i] == FAILED) {
+ okay=false;
+ log.error("Failed node "+node.toString());
}
}
return okay;
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs