Fixed a couple threading issues. Improved the performance of the nodeSorter but this should be better improved in 6.x

This commit is contained in:
Shannon Deminick
2013-04-18 20:52:49 +06:00
parent 3891e46549
commit a159b50c05
2 changed files with 41 additions and 28 deletions

View File

@@ -350,14 +350,15 @@ namespace umbraco
/// </summary>
/// <param name="d"></param>
/// <param name="xmlContentCopy"></param>
/// <param name="updateSitemapProvider"></param>
public static XmlDocument PublishNodeDo(Document d, XmlDocument xmlContentCopy, bool updateSitemapProvider)
{
// check if document *is* published, it could be unpublished by an event
if (d.Published)
{
int parentId = d.Level == 1 ? -1 : d.Parent.Id;
xmlContentCopy = AppendDocumentXml(d.Id, d.Level, parentId, GetPreviewOrPublishedNode(d, xmlContentCopy, false),
xmlContentCopy);
var parentId = d.Level == 1 ? -1 : d.Parent.Id;
xmlContentCopy = AppendDocumentXml(d.Id, d.Level, parentId,
GetPreviewOrPublishedNode(d, xmlContentCopy, false), xmlContentCopy);
// update sitemapprovider
if (updateSitemapProvider && SiteMap.Provider is UmbracoSiteMapProvider)
@@ -365,9 +366,11 @@ namespace umbraco
try
{
var prov = (UmbracoSiteMapProvider)SiteMap.Provider;
Node n = new Node(d.Id, true);
if (!String.IsNullOrEmpty(n.Url) && n.Url != "/#")
var n = new Node(d.Id, true);
if (string.IsNullOrEmpty(n.Url) == false && n.Url != "/#")
{
prov.UpdateNode(n);
}
else
{
Log.Add(LogTypes.Error, d.Id, "Can't update Sitemap Provider due to empty Url in node");
@@ -1354,12 +1357,10 @@ order by umbracoNode.level, umbracoNode.sortOrder";
/// <returns></returns>
private static XmlDocument CloneXmlDoc(XmlDocument xmlDoc)
{
if (xmlDoc == null) return null;
Log.Add(LogTypes.Debug, -1, "Cloning...");
if (xmlDoc == null) return null;
// Save copy of content
var xmlCopy = (XmlDocument)xmlDoc.CloneNode(true);
Log.Add(LogTypes.Debug, -1, "Cloning ended...");
var xmlCopy = (XmlDocument)xmlDoc.CloneNode(true);
return xmlCopy;
}

View File

@@ -80,37 +80,50 @@ namespace umbraco.presentation.webservices
try
{
if (!AuthorizeRequest()) return;
if (AuthorizeRequest() == false) return;
if (SortOrder.Trim().Length <= 0) return;
var tmp = SortOrder.Split(',');
var ids = SortOrder.Split(',');
var isContent = helper.Request("app") == "content" | helper.Request("app") == "";
var isMedia = helper.Request("app") == "media";
//ensure user is authorized for the app requested
if (isContent && !AuthorizeRequest(DefaultApps.content.ToString())) return;
if (isMedia && !AuthorizeRequest(DefaultApps.media.ToString())) return;
if (isContent && AuthorizeRequest(DefaultApps.content.ToString()) == false) return;
if (isMedia && AuthorizeRequest(DefaultApps.media.ToString()) == false) return;
for (var i = 0; i < tmp.Length; i++)
for (var i = 0; i < ids.Length; i++)
{
if (tmp[i] == "" || tmp[i].Trim() == "") continue;
new cms.businesslogic.CMSNode(int.Parse(tmp[i])).sortOrder = i;
if (ids[i] == "" || ids[i].Trim() == "") continue;
if (isContent)
{
var d = new Document(int.Parse(tmp[i]));
// refresh the xml for the sorting to work
if (d.Published)
var document = new Document(int.Parse(ids[i]))
{
sortOrder = i
};
//TODO: Theoretically we should be calling this too but it will show up as an unpublished
// revision which is not what we want, otherwise we should call Publish() on each node but this
// will be even worse performance! We'll wait till version 6 to fix up.
//document.Save();
if (document.Published)
{
d.refreshXmlSortOrder();
library.UpdateDocumentCache(int.Parse(tmp[i]));
// update the sort order of the xml in the database
document.refreshXmlSortOrder();
//TODO: WE don't want to have to republish the entire document !!!!
library.UpdateDocumentCache(document);
}
}
else if (isMedia)
{
new cms.businesslogic.media.Media(int.Parse(tmp[i])).Save();
var media = new cms.businesslogic.media.Media(int.Parse(ids[i]))
{
sortOrder = i
};
media.Save();
}
}
@@ -128,11 +141,10 @@ namespace umbraco.presentation.webservices
// Load balancing - then refresh entire cache
if (UmbracoSettings.UseDistributedCalls)
library.RefreshContent();
}
// fire actionhandler, check for content
if ((helper.Request("app") == "content" | helper.Request("app") == "") && ParentId > 0)
// fire actionhandler, check for content
BusinessLogic.Actions.Action.RunActionHandlers(new Document(ParentId), ActionSort.Instance);
}
}
catch (Exception ex)
{