Merge remote-tracking branch 'origin/dev-v7' into dev-v7.6

This commit is contained in:
Stephan
2016-11-28 13:08:22 +01:00
3 changed files with 46 additions and 43 deletions

View File

@@ -50,7 +50,7 @@ namespace umbraco
var profingLogger = new ProfilingLogger(
logger,
ProfilerResolver.HasCurrent ? ProfilerResolver.Current.Profiler : new LogProfiler(logger));
// prepare the persister task
// there's always be one task keeping a ref to the runner
// so it's safe to just create it as a local var here
@@ -71,7 +71,7 @@ namespace umbraco
// once released, the cache still works but does not write to file anymore,
// which is OK with database server messenger but will cause data loss with
// another messenger...
runner.Shutdown(false, true); // wait until flushed
_released = true;
});
@@ -145,7 +145,7 @@ namespace umbraco
}
//NOTE: We CANNOT use this for a double check lock because it is a property, not a field and to do double
// check locking in c# you MUST have a volatile field. Even thoug this wraps a volatile field it will still
// check locking in c# you MUST have a volatile field. Even thoug this wraps a volatile field it will still
// not work as expected for a double check lock because properties are treated differently in the clr.
public virtual bool isInitializing
{
@@ -327,11 +327,17 @@ namespace umbraco
// this updates the published cache to take care of the situation
// without ContentService having to ... what exactly?
// no need to do it if the content is published without unpublished changes,
// though, because in that case the XML will get re-generated with the
// correct sort order.
if (c.Published)
return;
// no need to do it if
// - the content is published without unpublished changes (XML will be re-gen anyways)
// - the content has no published version (not in XML)
// - the sort order has not changed
// note that
// - if it is a new entity is has not published version
// - if Published is dirty and false it's getting unpublished and has no published version
//
if (c.Published) return;
if (c.HasPublishedVersion == false) return;
if (c.WasPropertyDirty("SortOrder") == false) return;
using (var safeXml = GetSafeXmlWriter(false))
{
@@ -419,7 +425,7 @@ namespace umbraco
{
XmlNode x;
// remove from xml db cache
// remove from xml db cache
doc.XmlRemoveFromDB();
// clear xml cache
@@ -435,7 +441,7 @@ namespace umbraco
{
var prov = (UmbracoSiteMapProvider)SiteMap.Provider;
prov.RemoveNode(doc.Id);
}
}
}
}
@@ -486,7 +492,7 @@ namespace umbraco
if (UmbracoContext.Current != null && UmbracoContext.Current.HttpContext != null && UmbracoContext.Current.HttpContext.Items.Contains(XmlContextContentItemKey))
UmbracoContext.Current.HttpContext.Items.Remove(XmlContextContentItemKey);
}
/// <summary>
/// Load content from database
/// </summary>
@@ -517,7 +523,7 @@ namespace umbraco
public void PersistXmlToFile()
{
}
internal DateTime GetCacheFileUpdateTime()
{
//TODO: Should there be a try/catch here in case the file is being written to while this is trying to be executed?
@@ -566,7 +572,7 @@ namespace umbraco
private static bool UseLegacySchema
{
get { return UmbracoConfig.For.UmbracoSettings().Content.UseLegacyXmlSchema; }
}
}
#endregion
@@ -770,9 +776,9 @@ namespace umbraco
_releaser.Dispose();
_releaser = null;
}
}
private static string ChildNodesXPath
{
get
@@ -866,9 +872,9 @@ namespace umbraco
// and in addition, writing async is never fully async because
// althouth the writer is async, xml.WriteTo() will not async
// that one almost works but... "The elements are indented as long as the element
// that one almost works but... "The elements are indented as long as the element
// does not contain mixed content. Once the WriteString or WriteWhitespace method
// is called to write out a mixed element content, the XmlWriter stops indenting.
// is called to write out a mixed element content, the XmlWriter stops indenting.
// The indenting resumes once the mixed content element is closed." - says MSDN
// about XmlWriterSettings.Indent
@@ -1073,7 +1079,7 @@ namespace umbraco
//TODO: This could be faster, might as well just iterate all children and filter
// instead of selecting matching children (i.e. iterating all) and then iterating the
// filtered items to remove, this also allocates more memory to store the list of children.
// Below we also then do another filtering of child nodes, if we just iterate all children we
// Below we also then do another filtering of child nodes, if we just iterate all children we
// can perform both functions more efficiently
var dataNodes = publishedNode.SelectNodes(DataNodesXPath);
if (dataNodes == null) throw new Exception("oops");

View File

@@ -1142,25 +1142,24 @@ order by level,sortOrder";
protected virtual XmlNode GetPreviewXml(XmlDocument xd, Guid version)
{
var xmlDoc = new XmlDocument();
XmlDocument xmlDoc = new XmlDocument();
using (var sqlHelper = Application.SqlHelper)
using (XmlReader xmlRdr = sqlHelper.ExecuteXmlReader(
"select xml from cmsPreviewXml where nodeID = @nodeId and versionId = @versionId",
sqlHelper.CreateParameter("@nodeId", Id),
sqlHelper.CreateParameter("@versionId", version)))
{
xmlDoc.Load(xmlRdr);
}
var xmlStr = ApplicationContext.Current.DatabaseContext.Database.ExecuteScalar<string>(
"select xml from cmsPreviewXml where nodeID = @nodeId and versionId = @versionId",
new { nodeId = Id, versionId = version });
if (xmlStr.IsNullOrWhiteSpace()) return null;
xmlDoc.LoadXml(xmlStr);
return xd.ImportNode(xmlDoc.FirstChild, true);
}
protected internal virtual bool PreviewExists(Guid versionId)
{
using (var sqlHelper = Application.SqlHelper)
return sqlHelper.ExecuteScalar<int>("SELECT COUNT(nodeId) FROM cmsPreviewXml WHERE nodeId=@nodeId and versionId = @versionId",
sqlHelper.CreateParameter("@nodeId", Id), sqlHelper.CreateParameter("@versionId", versionId)) != 0;
return ApplicationContext.Current.DatabaseContext.Database.ExecuteScalar<int>(
"SELECT COUNT(nodeId) FROM cmsPreviewXml WHERE nodeId=@nodeId and versionId = @versionId",
new {nodeId = Id, versionId = versionId}) != 0;
}
@@ -1172,15 +1171,12 @@ order by level,sortOrder";
[MethodImpl(MethodImplOptions.Synchronized)]
protected void SavePreviewXml(XmlNode x, Guid versionId)
{
var sql = PreviewExists(versionId) ? "UPDATE cmsPreviewXml SET xml = @xml, timestamp = @timestamp WHERE nodeId=@nodeId AND versionId = @versionId"
string sql = PreviewExists(versionId) ? "UPDATE cmsPreviewXml SET xml = @xml, timestamp = @timestamp WHERE nodeId=@nodeId AND versionId = @versionId"
: "INSERT INTO cmsPreviewXml(nodeId, versionId, timestamp, xml) VALUES (@nodeId, @versionId, @timestamp, @xml)";
using (var sqlHelper = Application.SqlHelper)
sqlHelper.ExecuteNonQuery(sql,
sqlHelper.CreateParameter("@nodeId", Id),
sqlHelper.CreateParameter("@versionId", versionId),
sqlHelper.CreateParameter("@timestamp", DateTime.Now),
sqlHelper.CreateParameter("@xml", x.OuterXml));
ApplicationContext.Current.DatabaseContext.Database.Execute(
sql, new {nodeId = Id, versionId = versionId, timestamp = DateTime.Now, xml = x.OuterXml});
}
protected void PopulateCMSNodeFromReader(IRecordsReader dr)

View File

@@ -1560,12 +1560,13 @@ namespace umbraco.cms.businesslogic.web
private XmlNode importXml()
{
XmlDocument xmlDoc = new XmlDocument();
using (var sqlHelper = Application.SqlHelper)
{
using(var xmlRdr = sqlHelper.ExecuteXmlReader(string.Format(
"select xml from cmsContentXml where nodeID = {0}", Id)))
xmlDoc.Load(xmlRdr);
}
var xmlStr = ApplicationContext.Current.DatabaseContext.Database.ExecuteScalar<string>(
"select xml from cmsContentXml where nodeID = @nodeId", new {nodeId = Id});
if (xmlStr.IsNullOrWhiteSpace()) return null;
xmlDoc.LoadXml(xmlStr);
return xmlDoc.FirstChild;
}