AVM DAO - add rollover for avm_store/avm_node "vers" col

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@16992 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2009-10-16 16:26:54 +00:00
parent 0e9e98d6cd
commit 3731cb9b42
8 changed files with 299 additions and 233 deletions

View File

@@ -312,10 +312,12 @@
name = #name#, name = #name#,
current_root_id = #rootNodeId#, current_root_id = #rootNodeId#,
acl_id = #aclId#, acl_id = #aclId#,
vers = (#vers# + 1)
where
id = #id# and
vers = #vers# vers = #vers#
where
id = #id#
<isGreaterThan property="vers" compareValue="1">
and vers = (#vers#-1)
</isGreaterThan>
</update> </update>
<!-- Delete AVMStore --> <!-- Delete AVMStore -->
@@ -525,10 +527,12 @@
encoding = #encoding#, encoding = #encoding#,
length = #length#, length = #length#,
guid = #guid#, guid = #guid#,
vers = (#vers# + 1)
where
id = #id# and
vers = #vers# vers = #vers#
where
id = #id#
<isGreaterThan property="vers" compareValue="1">
and vers = (#vers#-1)
</isGreaterThan>
</update> </update>
<update id="update_AVMNode_modTimeAndGuid" parameterClass="AVMNode"> <update id="update_AVMNode_modTimeAndGuid" parameterClass="AVMNode">
@@ -537,10 +541,12 @@
set set
modDate = #modifiedDate#, modDate = #modifiedDate#,
guid = #guid#, guid = #guid#,
vers = (#vers# + 1)
where
id = #id# and
vers = #vers# vers = #vers#
where
id = #id#
<isGreaterThan property="vers" compareValue="1">
and vers = (#vers#-1)
</isGreaterThan>
</update> </update>
<update id="update_AVMNode_modTimeAndContentData" parameterClass="AVMNode"> <update id="update_AVMNode_modTimeAndContentData" parameterClass="AVMNode">
@@ -552,10 +558,12 @@
mime_type = #mimetype#, mime_type = #mimetype#,
encoding = #encoding#, encoding = #encoding#,
length = #length#, length = #length#,
vers = (#vers# + 1)
where
id = #id# and
vers = #vers# vers = #vers#
where
id = #id#
<isGreaterThan property="vers" compareValue="1">
and vers = (#vers#-1)
</isGreaterThan>
</update> </update>
<delete id="delete_AVMNode" parameterMap="parameter_IdMap"> <delete id="delete_AVMNode" parameterMap="parameter_IdMap">

View File

@@ -75,7 +75,7 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class AVMStoreImpl implements AVMStore public class AVMStoreImpl implements AVMStore
{ {
private static Log fgLogger = LogFactory.getLog(AVMStoreImpl.class); private static Log logger = LogFactory.getLog(AVMStoreImpl.class);
/** /**
* The primary key. * The primary key.
*/ */
@@ -198,6 +198,8 @@ public class AVMStoreImpl implements AVMStore
*/ */
public Map<String, Integer> createSnapshot(String tag, String description, Map<String, Integer> snapShotMap) public Map<String, Integer> createSnapshot(String tag, String description, Map<String, Integer> snapShotMap)
{ {
long start = System.currentTimeMillis();
long rootID = getRoot().getId(); long rootID = getRoot().getId();
AVMStoreImpl me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(getId()); AVMStoreImpl me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(getId());
VersionRoot lastVersion = AVMDAOs.Instance().fVersionRootDAO.getMaxVersion(me); VersionRoot lastVersion = AVMDAOs.Instance().fVersionRootDAO.getMaxVersion(me);
@@ -207,6 +209,11 @@ public class AVMStoreImpl implements AVMStore
DirectoryNode root = (DirectoryNode)AVMDAOs.Instance().fAVMNodeDAO.getByID(rootID); DirectoryNode root = (DirectoryNode)AVMDAOs.Instance().fAVMNodeDAO.getByID(rootID);
if (!root.getIsNew() && layeredEntries.size() == 0) if (!root.getIsNew() && layeredEntries.size() == 0)
{ {
if (logger.isTraceEnabled())
{
logger.trace("createSnapshot: no snapshot required: "+me.getName()+" ["+me.getId()+"] - lastVersion = "+lastVersion.getVersionID() + "("+tag+", "+description+")");
}
// So, we set the tag and description fields of the latest version. // So, we set the tag and description fields of the latest version.
if (tag != null || description != null) if (tag != null || description != null)
{ {
@@ -218,6 +225,12 @@ public class AVMStoreImpl implements AVMStore
snapShotMap.put(getName(), lastVersion.getVersionID()); snapShotMap.put(getName(), lastVersion.getVersionID());
return snapShotMap; return snapShotMap;
} }
if (logger.isTraceEnabled())
{
logger.trace("createSnapshot: snapshot: "+me.getName()+" ["+me.getId()+"] - lastVersion="+lastVersion.getVersionID()+", layeredEntries="+layeredEntries.size());
}
snapShotMap.put(getName(), me.getNextVersionID()); snapShotMap.put(getName(), me.getNextVersionID());
// Force copies on all the layered nodes from last snapshot. // Force copies on all the layered nodes from last snapshot.
for (VersionLayeredNodeEntry entry : layeredEntries) for (VersionLayeredNodeEntry entry : layeredEntries)
@@ -241,13 +254,14 @@ public class AVMStoreImpl implements AVMStore
if (lookup.getCurrentNode().getType() == AVMNodeType.LAYERED_DIRECTORY) if (lookup.getCurrentNode().getType() == AVMNodeType.LAYERED_DIRECTORY)
{ {
fAVMRepository.forceCopy(entry.getPath()); fAVMRepository.forceCopy(entry.getPath());
me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(getId());
} }
else if (lookup.getCurrentNode().getType() == AVMNodeType.LAYERED_FILE) else if (lookup.getCurrentNode().getType() == AVMNodeType.LAYERED_FILE)
{ {
String parentName[] = AVMUtil.splitBase(entry.getPath()); String parentName[] = AVMUtil.splitBase(entry.getPath());
parentName[0] = parentName[0].substring(parentName[0].indexOf(':') + 1); parentName[0] = parentName[0].substring(parentName[0].indexOf(':') + 1);
lookup = lookupDirectory(-1, parentName[0], true); lookup = me.lookupDirectory(-1, parentName[0], true);
DirectoryNode parent = (DirectoryNode)lookup.getCurrentNode(); DirectoryNode parent = (DirectoryNode)lookup.getCurrentNode();
Pair<AVMNode, Boolean> temp = parent.lookupChild(lookup, parentName[1], false); Pair<AVMNode, Boolean> temp = parent.lookupChild(lookup, parentName[1], false);
@@ -337,6 +351,7 @@ public class AVMStoreImpl implements AVMStore
{ {
user = RawServices.Instance().getAuthenticationContext().getSystemUserName(); user = RawServices.Instance().getAuthenticationContext().getSystemUserName();
} }
me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(getId()); me = (AVMStoreImpl)AVMDAOs.Instance().fAVMStoreDAO.getByID(getId());
VersionRoot versionRoot = new VersionRootImpl(me, VersionRoot versionRoot = new VersionRootImpl(me,
me.getRoot(), me.getRoot(),
@@ -350,6 +365,8 @@ public class AVMStoreImpl implements AVMStore
AVMDAOs.Instance().fAVMStoreDAO.update(me); AVMDAOs.Instance().fAVMStoreDAO.update(me);
int vlneCnt = 0;
AVMDAOs.Instance().fVersionRootDAO.save(versionRoot); AVMDAOs.Instance().fVersionRootDAO.save(versionRoot);
for (Long nodeID : layeredNodeIDs) for (Long nodeID : layeredNodeIDs)
{ {
@@ -361,7 +378,20 @@ public class AVMStoreImpl implements AVMStore
new VersionLayeredNodeEntryImpl(versionRoot, path); new VersionLayeredNodeEntryImpl(versionRoot, path);
AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.save(entry); AVMDAOs.Instance().fVersionLayeredNodeEntryDAO.save(entry);
} }
vlneCnt = vlneCnt+paths.size();
} }
if (logger.isTraceEnabled())
{
logger.trace("createSnapshot: snapshot: "+me.getName()+" ["+me.getId()+"] - created new version root ["+versionRoot.getId()+"] - layeredNodeIDs="+layeredNodeIDs.size()+", versionLayeredNodeEntries="+vlneCnt);
}
if (logger.isDebugEnabled())
{
logger.debug("createSnapshot: snapshot: "+me.getName()+" ["+me.getId()+"] in "+(System.currentTimeMillis()-start)+" msecs");
}
return snapShotMap; return snapShotMap;
} }
@@ -610,14 +640,14 @@ public class AVMStoreImpl implements AVMStore
AVMNode srcNode = null; AVMNode srcNode = null;
if (lPathSrc == null) if (lPathSrc == null)
{ {
fgLogger.warn("CreateLayeredFile: srcPath not found: "+srcPath); logger.warn("CreateLayeredFile: srcPath not found: "+srcPath);
} }
else else
{ {
srcNode = (AVMNode)lPathSrc.getCurrentNode(); srcNode = (AVMNode)lPathSrc.getCurrentNode();
if (! (srcNode instanceof FileNode)) if (! (srcNode instanceof FileNode))
{ {
fgLogger.warn("CreateLayeredFile: srcPath is not a file: "+srcPath); logger.warn("CreateLayeredFile: srcPath is not a file: "+srcPath);
} }
} }

View File

@@ -373,6 +373,18 @@ public class AVMNodeEntity
this.vers = vers; this.vers = vers;
} }
public void incrementVers()
{
if (this.vers >= Long.MAX_VALUE)
{
this.vers = 0L;
}
else
{
this.vers++;
}
}
@Override @Override
public int hashCode() public int hashCode()
{ {

View File

@@ -103,6 +103,18 @@ public class AVMStoreEntity
this.vers = vers; this.vers = vers;
} }
public void incrementVers()
{
if (this.vers >= Long.MAX_VALUE)
{
this.vers = 0L;
}
else
{
this.vers++;
}
}
@Override @Override
public int hashCode() public int hashCode()
{ {

View File

@@ -189,7 +189,6 @@ public abstract class AbstractAVMNodeDAOImpl implements AVMNodeDAO
{ {
throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently"); throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently");
} }
nodeEntity.setVers(nodeEntity.getVers()+1);
} }
/** /**
@@ -209,7 +208,6 @@ public abstract class AbstractAVMNodeDAOImpl implements AVMNodeDAO
{ {
throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently"); throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently");
} }
nodeEntity.setVers(nodeEntity.getVers()+1);
// update cache // update cache
avmNodeCache.removeByKey(nodeEntity.getId()); avmNodeCache.removeByKey(nodeEntity.getId());
@@ -232,7 +230,6 @@ public abstract class AbstractAVMNodeDAOImpl implements AVMNodeDAO
{ {
throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently"); throw new ConcurrencyFailureException("AVMNode with ID (" + nodeEntity.getId() + ") no longer exists or has been updated concurrently");
} }
nodeEntity.setVers(nodeEntity.getVers()+1);
// update cache // update cache
avmNodeCache.removeByKey(nodeEntity.getId()); avmNodeCache.removeByKey(nodeEntity.getId());

View File

@@ -202,7 +202,6 @@ public abstract class AbstractAVMStoreDAOImpl implements AVMStoreDAO
{ {
throw new ConcurrencyFailureException("AVMStore with ID (" + storeEntity.getId() + ") no longer exists or has been updated concurrently"); throw new ConcurrencyFailureException("AVMStore with ID (" + storeEntity.getId() + ") no longer exists or has been updated concurrently");
} }
storeEntity.setVers(storeEntity.getVers()+1);
} }
/** /**

View File

@@ -104,12 +104,16 @@ public class AVMNodeDAOImpl extends AbstractAVMNodeDAOImpl
@Override @Override
protected int updateNodeEntity(AVMNodeEntity updateNodeEntity) protected int updateNodeEntity(AVMNodeEntity updateNodeEntity)
{ {
updateNodeEntity.incrementVers();
return template.update(UPDATE_AVM_NODE, updateNodeEntity); return template.update(UPDATE_AVM_NODE, updateNodeEntity);
} }
@Override @Override
protected int updateNodeEntityModTimeAndGuid(AVMNodeEntity updateNodeEntity) protected int updateNodeEntityModTimeAndGuid(AVMNodeEntity updateNodeEntity)
{ {
updateNodeEntity.incrementVers();
// partial update // partial update
return template.update(UPDATE_AVM_NODE_MODTIME_AND_GUID, updateNodeEntity); return template.update(UPDATE_AVM_NODE_MODTIME_AND_GUID, updateNodeEntity);
} }
@@ -117,6 +121,8 @@ public class AVMNodeDAOImpl extends AbstractAVMNodeDAOImpl
@Override @Override
protected int updateNodeEntityModTimeAndContentData(AVMNodeEntity updateNodeEntity) protected int updateNodeEntityModTimeAndContentData(AVMNodeEntity updateNodeEntity)
{ {
updateNodeEntity.incrementVers();
// partial update // partial update
return template.update(UPDATE_AVM_NODE_MODTIME_AND_CDATA, updateNodeEntity); return template.update(UPDATE_AVM_NODE_MODTIME_AND_CDATA, updateNodeEntity);
} }

View File

@@ -109,6 +109,8 @@ public class AVMStoreDAOImpl extends AbstractAVMStoreDAOImpl
@Override @Override
protected int updateStoreEntity(AVMStoreEntity updateStoreEntity) protected int updateStoreEntity(AVMStoreEntity updateStoreEntity)
{ {
updateStoreEntity.incrementVers();
return template.update(UPDATE_AVM_STORE, updateStoreEntity); return template.update(UPDATE_AVM_STORE, updateStoreEntity);
} }