mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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">
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
{
|
{
|
||||||
|
@@ -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()
|
||||||
{
|
{
|
||||||
|
@@ -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());
|
||||||
|
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user