Fix ALF-2591: FixNameCrcValuesPatch needs to use Savepoint (PostgreSQL)

- PostgreSQL doesn't have automatic recovery after constraint violations
 - Added in calls to new ControlDAO's createSavepoint


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@20001 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2010-04-27 09:58:28 +00:00
parent 6e0abbb516
commit c46bc9dd26
2 changed files with 19 additions and 2 deletions

View File

@@ -1978,7 +1978,6 @@
<ref bean="patch.InvalidNameEnding" /> <ref bean="patch.InvalidNameEnding" />
</list> </list>
</property> </property>
<!-- helper beans -->
<property name="sessionFactory"> <property name="sessionFactory">
<ref bean="sessionFactory" /> <ref bean="sessionFactory" />
</property> </property>
@@ -1988,6 +1987,9 @@
<property name="qnameDAO"> <property name="qnameDAO">
<ref bean="qnameDAO" /> <ref bean="qnameDAO" />
</property> </property>
<property name="controlDAO">
<ref bean="controlDAO" />
</property>
<property name="ruleService"> <property name="ruleService">
<ref bean="ruleService" /> <ref bean="ruleService" />
</property> </property>

View File

@@ -24,6 +24,7 @@ import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.sql.Savepoint;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -36,6 +37,7 @@ import org.alfresco.repo.batch.BatchProcessor;
import org.alfresco.repo.batch.BatchProcessor.BatchProcessWorker; import org.alfresco.repo.batch.BatchProcessor.BatchProcessWorker;
import org.alfresco.repo.domain.ChildAssoc; import org.alfresco.repo.domain.ChildAssoc;
import org.alfresco.repo.domain.Node; import org.alfresco.repo.domain.Node;
import org.alfresco.repo.domain.control.ControlDAO;
import org.alfresco.repo.domain.hibernate.ChildAssocImpl; import org.alfresco.repo.domain.hibernate.ChildAssocImpl;
import org.alfresco.repo.domain.qname.QNameDAO; import org.alfresco.repo.domain.qname.QNameDAO;
import org.alfresco.repo.node.db.NodeDaoService; import org.alfresco.repo.node.db.NodeDaoService;
@@ -73,6 +75,7 @@ public class FixNameCrcValuesPatch extends AbstractPatch
private SessionFactory sessionFactory; private SessionFactory sessionFactory;
private NodeDaoService nodeDaoService; private NodeDaoService nodeDaoService;
private QNameDAO qnameDAO; private QNameDAO qnameDAO;
private ControlDAO controlDAO;
private RuleService ruleService; private RuleService ruleService;
private static Log progress_logger = LogFactory.getLog(PatchExecuter.class); private static Log progress_logger = LogFactory.getLog(PatchExecuter.class);
@@ -101,7 +104,15 @@ public class FixNameCrcValuesPatch extends AbstractPatch
{ {
this.qnameDAO = qnameDAO; this.qnameDAO = qnameDAO;
} }
/**
* @param controlDAO used to create Savepoints
*/
public void setControlDAO(ControlDAO controlDAO)
{
this.controlDAO = controlDAO;
}
/** /**
* @param ruleService the rule service * @param ruleService the rule service
*/ */
@@ -236,12 +247,16 @@ public class FixNameCrcValuesPatch extends AbstractPatch
assoc.setChildNodeNameCrc(childCrc); assoc.setChildNodeNameCrc(childCrc);
assoc.setQnameCrc(qnameCrc); assoc.setQnameCrc(qnameCrc);
// Persist // Persist
Savepoint savepoint = controlDAO.createSavepoint("FixNameCrcValuesPatch");
try try
{ {
getSession().flush(); getSession().flush();
controlDAO.releaseSavepoint(savepoint);
} }
catch (Throwable e) catch (Throwable e)
{ {
controlDAO.releaseSavepoint(savepoint);
String msg = I18NUtil.getMessage(MSG_UNABLE_TO_CHANGE, childNode.getId(), childName, oldChildCrc, String msg = I18NUtil.getMessage(MSG_UNABLE_TO_CHANGE, childNode.getId(), childName, oldChildCrc,
childCrc, qname, oldQNameCrc, qnameCrc, e.getMessage()); childCrc, qname, oldQNameCrc, qnameCrc, e.getMessage());
// We just log this and add details to the message file // We just log this and add details to the message file