From 0c0583653716c46bc2b8b70d5f46fe2997ff2fda Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Thu, 5 Sep 2013 10:44:28 +0200 Subject: [PATCH] Fixes U4-2791 Error creating node containing @ v6.1.4. Adding unit test which covers both U4-2791 and U4-2607 --- .../Querying/BaseExpressionHelper.cs | 7 +++-- .../Querying/ModelToSqlExpressionHelper.cs | 4 +-- .../Querying/PocoToSqlExpressionHelper.cs | 4 +-- .../Repositories/ContentRepositoryTest.cs | 31 +++++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs index 70d89d7940..ac84b5cee3 100644 --- a/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/BaseExpressionHelper.cs @@ -64,8 +64,11 @@ namespace Umbraco.Core.Persistence.Querying public virtual string EscapeAtArgument(string exp) { - if (exp.StartsWith("@")) - return string.Concat("@", exp); + /*if (exp.StartsWith("@")) + return string.Concat("@", exp);*/ + + if (exp.Contains("@")) + return exp.Replace("@", "@@"); return exp; } diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs index 76ca62139f..738cc8a23c 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionHelper.cs @@ -248,9 +248,9 @@ namespace Umbraco.Core.Persistence.Querying case "StartsWith": return string.Format("upper({0}) like '{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString().ToUpper()))); case "EndsWith": - return string.Format("upper({0}) like '%{1}'", r, RemoveQuote(args[0].ToString()).ToUpper()); + return string.Format("upper({0}) like '%{1}'", r, EscapeAtArgument(RemoveQuote(args[0].ToString()).ToUpper())); case "Contains": - return string.Format("{0} like '%{1}%'", r, RemoveQuote(args[0].ToString()).ToUpper()); + return string.Format("{0} like '%{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString()).ToUpper())); case "Substring": var startIndex = Int32.Parse(args[0].ToString()) + 1; if (args.Count == 2) diff --git a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs index 41057ed6c5..555b87f6e4 100644 --- a/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs +++ b/src/Umbraco.Core/Persistence/Querying/PocoToSqlExpressionHelper.cs @@ -252,9 +252,9 @@ namespace Umbraco.Core.Persistence.Querying case "StartsWith": return string.Format("upper({0}) like '{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString().ToUpper()))); case "EndsWith": - return string.Format("upper({0}) like '%{1}'", r, RemoveQuote(args[0].ToString()).ToUpper()); + return string.Format("upper({0}) like '%{1}'", r, EscapeAtArgument(RemoveQuote(args[0].ToString()).ToUpper())); case "Contains": - return string.Format("upper({0}) like '%{1}%'", r, RemoveQuote(args[0].ToString()).ToUpper()); + return string.Format("upper({0}) like '%{1}%'", r, EscapeAtArgument(RemoveQuote(args[0].ToString()).ToUpper())); case "Substring": var startIndex = Int32.Parse(args[0].ToString()) + 1; if (args.Count == 2) diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 973000b9ca..fec3d9ca62 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -106,6 +106,37 @@ namespace Umbraco.Tests.Persistence.Repositories Assert.That(textpage.HasIdentity, Is.True); } + //Covers issue U4-2791 and U4-2607 + [Test] + public void Can_Save_Content_With_AtSign_In_Name_On_ContentRepository() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var contentTypeRepository = RepositoryResolver.Current.ResolveByType(unitOfWork); + var repository = RepositoryResolver.Current.ResolveByType(unitOfWork); + + ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); + Content textpage = MockedContent.CreateSimpleContent(contentType, "test@umbraco.org", -1); + Content anotherTextpage = MockedContent.CreateSimpleContent(contentType, "@lightgiants", -1); + + // Act + contentTypeRepository.AddOrUpdate(contentType); + repository.AddOrUpdate(textpage); + repository.AddOrUpdate(anotherTextpage); + unitOfWork.Commit(); + + // Assert + Assert.That(contentType.HasIdentity, Is.True); + Assert.That(textpage.HasIdentity, Is.True); + + var content = repository.Get(textpage.Id); + Assert.That(content.Name, Is.EqualTo(textpage.Name)); + + var content2 = repository.Get(anotherTextpage.Id); + Assert.That(content2.Name, Is.EqualTo(anotherTextpage.Name)); + } + [Test] public void Can_Perform_Multiple_Adds_On_ContentRepository() {