From 70ebd7e12914d68bf06a3686b5583464213feb69 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Thu, 3 Jan 2013 15:20:13 -0100 Subject: [PATCH 1/8] U4-335 Fixed out of memory exception in cropper (checks in CropImage method) --- .../imagecropper/ImageManipulation.cs | 134 +++--------------- 1 file changed, 18 insertions(+), 116 deletions(-) diff --git a/src/umbraco.editorControls/imagecropper/ImageManipulation.cs b/src/umbraco.editorControls/imagecropper/ImageManipulation.cs index 3536b3a037..b74f88c755 100644 --- a/src/umbraco.editorControls/imagecropper/ImageManipulation.cs +++ b/src/umbraco.editorControls/imagecropper/ImageManipulation.cs @@ -31,62 +31,25 @@ namespace umbraco.editorControls.imagecropper DirectoryInfo di = new DirectoryInfo(path); if (!di.Exists) di.Create(); - using(Image croppedImage = cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight))) + using(Image croppedImage = CropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight))) { - using(Image resizedImage = resizeImage(croppedImage, new Size(sizeWidth, sizeHeight))) + using(Image resizedImage = ResizeImage(croppedImage, new Size(sizeWidth, sizeHeight))) { using (Bitmap b = new Bitmap(resizedImage)) { - saveJpeg(String.Format("{0}/{1}.jpg", path, name), b, quality); + SaveJpeg(String.Format("{0}/{1}.jpg", path, name), b, quality); } } } - - - //saveJpeg( - // String.Format("{0}/{1}.jpg", path, name), - // new Bitmap( - // resizeImage(cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)), new Size(sizeWidth, sizeHeight))), - // quality - // ); - - //using (FileStream stm = new FileStream(sourceFile, FileMode.Open, FileAccess.Read)) - //{ - //using (Image image = Image.FromStream(stm)) - //{ - - //} - //stm.Close(); - //} - - - //using (Image image = Image.FromFile(sourceFile)) - //{ - // //image = cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)); - // //cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)); - // //image = resizeImage(image, new Size(sizeWidth, sizeHeight)); - // //resizeImage(image, new Size(sizeWidth, sizeHeight)); - // string path = sourceFile.Substring(0, sourceFile.LastIndexOf('\\') + 1) + "Crops"; - // DirectoryInfo di = new DirectoryInfo(path); - // if (!di.Exists) di.Create(); - // saveJpeg( - // String.Format("{0}/{1}.jpg", path, name), - // new Bitmap( - // resizeImage(cropImage(image, new Rectangle(cropX, cropY, cropWidth, cropHeight)), new Size(sizeWidth, sizeHeight))), - // quality - // ); - - // image.Dispose(); - //} } - private static void saveJpeg(string path, Bitmap img, long quality) + private static void SaveJpeg(string path, Bitmap img, long quality) { // Encoder parameter for image quality EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, quality); // Jpeg image codec - ImageCodecInfo jpegCodec = getEncoderInfo("image/jpeg"); + ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg"); if (jpegCodec == null) return; @@ -97,7 +60,7 @@ namespace umbraco.editorControls.imagecropper img.Save(path, jpegCodec, encoderParams); } - private static ImageCodecInfo getEncoderInfo(string mimeType) + private static ImageCodecInfo GetEncoderInfo(string mimeType) { // Get image codecs for all image formats ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); @@ -109,39 +72,22 @@ namespace umbraco.editorControls.imagecropper return null; } - private static Image cropImage(Image img, Rectangle cropArea) + private static Image CropImage(Image img, Rectangle cropArea) { - Bitmap bmpImage = new Bitmap(img); - Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); - return (Image)(bmpCrop); + var bmpImage = new Bitmap(img); + + if (cropArea.Right > img.Width) + cropArea.Width -= (cropArea.Right - img.Width); + + if (cropArea.Bottom > img.Height) + cropArea.Height -= (cropArea.Bottom - img.Height); + + var bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); + return bmpCrop; } - private static Image resizeImage(Image imgToResize, Size size) + private static Image ResizeImage(Image imgToResize, Size size) { - //int sourceWidth = imgToResize.Width; - //int sourceHeight = imgToResize.Height; - - //float nPercent = 0; - //float nPercentW = 0; - //float nPercentH = 0; - - //nPercentW = ((float)size.Width / (float)sourceWidth); - //nPercentH = ((float)size.Height / (float)sourceHeight); - - //if (nPercentH < nPercentW) - // nPercent = nPercentH; - //else - // nPercent = nPercentW; - - //int destWidth = (int)(sourceWidth * nPercent); - //int destHeight = (int)(sourceHeight * nPercent); - - - - - - - int destWidth = size.Width; int destHeight = size.Height; @@ -163,50 +109,6 @@ namespace umbraco.editorControls.imagecropper g.Dispose(); return b; - - - - - -#if false - - int destWidth = size.Width; - int destHeight = size.Height; - - using (Bitmap b = new Bitmap(destWidth, destHeight)) - { - using (Graphics g = Graphics.FromImage(b)) - { - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - using (ImageAttributes ia = new ImageAttributes()) - { - ia.SetWrapMode(WrapMode.TileFlipXY); - g.Clear(Color.White); - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.CompositingQuality = CompositingQuality.HighQuality; - g.SmoothingMode = SmoothingMode.HighQuality; - g.DrawImage(imgToResize, new Rectangle(0, 0, destWidth, destHeight), 0, 0, imgToResize.Width, - imgToResize.Height, GraphicsUnit.Pixel, ia); - } - } - return b; - } - -#endif - -#if false - int destWidth = size.Width; - int destHeight = size.Height; - - Bitmap b = new Bitmap(destWidth, destHeight); - Graphics g = Graphics.FromImage((Image)b); - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - - g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); - g.Dispose(); - - return (Image)b; -#endif } } } \ No newline at end of file From 73530b10aef162b36cc49711905306dd31be7c30 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 4 Jan 2013 09:23:20 -0100 Subject: [PATCH 2/8] Refactoring ContentRepository to use strongly typed query for generating sql. --- .../Repositories/ContentRepository.cs | 29 ++++++++++--------- .../ContentRepositorySqlClausesTest.cs | 26 +++++++++++++++++ 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index a650f7485a..46802d6a9a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -91,7 +91,6 @@ namespace Umbraco.Core.Persistence.Repositories var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); - //sql.OrderBy("[cmsContentVersion].[VersionDate] DESC"); //NOTE: This doesn't allow properties to be part of the query var dtos = Database.Fetch(sql); @@ -112,11 +111,14 @@ namespace Umbraco.Core.Persistence.Repositories { var sql = new Sql(); sql.Select(isCount ? "COUNT(*)" : "*") - .From("cmsDocument") - .InnerJoin("cmsContentVersion").On("cmsDocument.versionId = cmsContentVersion.VersionId") - .InnerJoin("cmsContent").On("cmsContentVersion.ContentId = cmsContent.nodeId") - .InnerJoin("umbracoNode").On("cmsContent.nodeId = umbracoNode.id") - .Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + .From() + .InnerJoin() + .On(left => left.VersionId, right => right.VersionId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId ); return sql; } @@ -423,14 +425,15 @@ namespace Umbraco.Core.Persistence.Repositories private PropertyCollection GetPropertyCollection(int id, Guid versionId, IContentType contentType) { - var propertySql = new Sql(); - propertySql.Select("*"); - propertySql.From("cmsPropertyData"); - propertySql.InnerJoin("cmsPropertyType ON (cmsPropertyData.propertytypeid = cmsPropertyType.id)"); - propertySql.Where("cmsPropertyData.contentNodeId = @Id", new { Id = id }); - propertySql.Where("cmsPropertyData.versionId = @VersionId", new { VersionId = versionId }); + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.PropertyTypeId, right => right.Id) + .Where(x => x.NodeId == id) + .Where(x => x.VersionId == versionId); - var propertyDataDtos = Database.Fetch(propertySql); + var propertyDataDtos = Database.Fetch(sql); var propertyFactory = new PropertyFactory(contentType, versionId, id); var properties = propertyFactory.BuildEntity(propertyDataDtos); return new PropertyCollection(properties); diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/ContentRepositorySqlClausesTest.cs index 47efccb785..7e85f7cd9d 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentRepositorySqlClausesTest.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentRepositorySqlClausesTest.cs @@ -104,5 +104,31 @@ namespace Umbraco.Tests.Persistence.Querying Console.WriteLine(sql.SQL); } + + [Test] + public void Can_Verify_Property_Collection_Query() + { + var versionId = new Guid("2b543516-a944-4ee6-88c6-8813da7aaa07"); + var id = 1050; + + var expected = new Sql(); + expected.Select("*"); + expected.From("[cmsPropertyData]"); + expected.InnerJoin("[cmsPropertyType]").On("[cmsPropertyData].[propertytypeid] = [cmsPropertyType].[id]"); + expected.Where("[cmsPropertyData].[contentNodeId] = 1050"); + expected.Where("[cmsPropertyData].[versionId] = '2b543516-a944-4ee6-88c6-8813da7aaa07'"); + + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.PropertyTypeId, right => right.Id) + .Where(x => x.NodeId == id) + .Where(x => x.VersionId == versionId); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } } } \ No newline at end of file From 46fb8fca816d3989d9f7dd44dd3d358e864c5569 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 4 Jan 2013 10:42:29 -0100 Subject: [PATCH 3/8] Refactoring ContentTypeRepository, MediaRepository and DataTypeDefinitionRepository to use strongly typed queries for generating sql. Adding a few unit tests to ensure the correctness of the generated sql. --- .../Repositories/ContentRepository.cs | 2 +- .../Repositories/ContentTypeBaseRepository.cs | 36 ++++++----- .../Repositories/ContentTypeRepository.cs | 41 ++++++------ .../DataTypeDefinitionRepository.cs | 9 +-- .../Repositories/MediaRepository.cs | 27 ++++---- .../ContentTypeRepositorySqlClausesTest.cs | 64 +++++++++++++++++++ ...aTypeDefinitionRepositorySqlClausesTest.cs | 35 ++++++++++ .../Querying/MediaRepositorySqlClausesTest.cs | 38 +++++++++++ .../MediaTypeRepositorySqlClausesTest.cs | 16 +++++ src/Umbraco.Tests/Umbraco.Tests.csproj | 3 + 10 files changed, 219 insertions(+), 52 deletions(-) create mode 100644 src/Umbraco.Tests/Persistence/Querying/DataTypeDefinitionRepositorySqlClausesTest.cs create mode 100644 src/Umbraco.Tests/Persistence/Querying/MediaRepositorySqlClausesTest.cs create mode 100644 src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index 46802d6a9a..c560a68c02 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -410,7 +410,7 @@ namespace Umbraco.Core.Persistence.Repositories { var sql = GetBaseQuery(false); sql.Where(GetBaseWhereClause(), new { Id = id }); - sql.Where("cmsContentVersion.LanguageLocale = @Language", new { Language = language }); + sql.Where(x => x.Language == language); sql.OrderByDescending(x => x.VersionDate); var dto = Database.Query(sql).FirstOrDefault(); diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs index 04abea1820..99acdf91d3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeBaseRepository.cs @@ -35,10 +35,12 @@ namespace Umbraco.Core.Persistence.Repositories protected IEnumerable PerformGetByQuery(IQuery query) { var sqlClause = new Sql(); - sqlClause.Select("*"); - sqlClause.From("cmsPropertyTypeGroup"); - sqlClause.RightJoin("cmsPropertyType ON cmsPropertyTypeGroup.id = cmsPropertyType.propertyTypeGroupId"); - sqlClause.InnerJoin("cmsDataType ON cmsPropertyType.dataTypeId = cmsDataType.nodeId"); + sqlClause.Select("*") + .From() + .RightJoin() + .On(left => left.Id, right => right.PropertyTypeGroupId) + .InnerJoin() + .On(left => left.DataTypeId, right => right.DataTypeId); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); @@ -210,25 +212,27 @@ namespace Umbraco.Core.Persistence.Repositories protected IEnumerable GetAllowedContentTypeIds(int id) { - var allowedContentTypesSql = new Sql(); - allowedContentTypesSql.Select("*"); - allowedContentTypesSql.From("cmsContentTypeAllowedContentType"); - allowedContentTypesSql.Where("cmsContentTypeAllowedContentType.Id = @Id", new { Id = id }); + var sql = new Sql(); + sql.Select("*") + .From() + .Where(x => x.Id == id); - var allowedContentTypeDtos = Database.Fetch(allowedContentTypesSql); + var allowedContentTypeDtos = Database.Fetch(sql); return allowedContentTypeDtos.Select(x => new ContentTypeSort { Id = new Lazy(() => x.AllowedId), SortOrder = x.SortOrder }).ToList(); } protected PropertyGroupCollection GetPropertyGroupCollection(int id) { - var propertySql = new Sql(); - propertySql.Select("*"); - propertySql.From("cmsPropertyTypeGroup"); - propertySql.RightJoin("cmsPropertyType ON cmsPropertyTypeGroup.id = cmsPropertyType.propertyTypeGroupId"); - propertySql.InnerJoin("cmsDataType ON cmsPropertyType.dataTypeId = cmsDataType.nodeId"); - propertySql.Where("cmsPropertyType.contentTypeId = @Id", new { Id = id }); + var sql = new Sql(); + sql.Select("*") + .From() + .RightJoin() + .On(left => left.Id, right => right.PropertyTypeGroupId) + .InnerJoin() + .On(left => left.DataTypeId, right => right.DataTypeId) + .Where(x => x.ContentTypeId == id); - var dtos = Database.Fetch(new GroupPropertyTypeRelator().Map, propertySql); + var dtos = Database.Fetch(new GroupPropertyTypeRelator().Map, sql); var propertyFactory = new PropertyGroupFactory(id); var propertyGroups = propertyFactory.BuildEntity(dtos); diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index 299b2e2e0a..d48ee621a3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -114,14 +114,17 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { - var sql = new Sql(); //TODO Investigate the proper usage of IsDefault on cmsDocumentType - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("cmsDocumentType"); - sql.RightJoin("cmsContentType ON (cmsContentType.nodeId = cmsDocumentType.contentTypeNodeId)"); - sql.InnerJoin("umbracoNode ON (cmsContentType.nodeId = umbracoNode.id)"); - sql.Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); - sql.Where("cmsDocumentType.IsDefault = @IsDefault", new { IsDefault = true }); + var sql = new Sql(); + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .RightJoin() + .On(left => left.NodeId, right => right.ContentTypeNodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId) + .Where(x => x.IsDefault == true); + return sql; } @@ -134,18 +137,18 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id"), - string.Format("DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id"), - string.Format("DELETE FROM cmsTagRelationship WHERE nodeId = @Id"), - string.Format("DELETE FROM cmsContentTypeAllowedContentType WHERE Id = @Id"), - string.Format("DELETE FROM cmsContentTypeAllowedContentType WHERE AllowedId = @Id"), - string.Format("DELETE FROM cmsContentType2ContentType WHERE parentContentTypeId = @Id"), - string.Format("DELETE FROM cmsContentType2ContentType WHERE childContentTypeId = @Id"), - string.Format("DELETE FROM cmsPropertyType WHERE contentTypeId = @Id"), - string.Format("DELETE FROM cmsPropertyTypeGroup WHERE contenttypeNodeId = @Id"), - string.Format("DELETE FROM cmsDocumentType WHERE contentTypeNodeId = @Id"), - string.Format("DELETE FROM cmsContentType WHERE NodeId = @Id"), - string.Format("DELETE FROM umbracoNode WHERE id = @Id") + "DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id", + "DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id", + "DELETE FROM cmsTagRelationship WHERE nodeId = @Id", + "DELETE FROM cmsContentTypeAllowedContentType WHERE Id = @Id", + "DELETE FROM cmsContentTypeAllowedContentType WHERE AllowedId = @Id", + "DELETE FROM cmsContentType2ContentType WHERE parentContentTypeId = @Id", + "DELETE FROM cmsContentType2ContentType WHERE childContentTypeId = @Id", + "DELETE FROM cmsPropertyType WHERE contentTypeId = @Id", + "DELETE FROM cmsPropertyTypeGroup WHERE contenttypeNodeId = @Id", + "DELETE FROM cmsDocumentType WHERE contentTypeNodeId = @Id", + "DELETE FROM cmsContentType WHERE NodeId = @Id", + "DELETE FROM umbracoNode WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs index 83e57db965..fb5342731e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DataTypeDefinitionRepository.cs @@ -85,10 +85,11 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("cmsDataType"); - sql.InnerJoin("umbracoNode ON (cmsDataType.nodeId = umbracoNode.id)"); - sql.Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .InnerJoin() + .On(left => left.DataTypeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index 755a58d2bb..56f19595a8 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -97,11 +97,13 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("cmsContentVersion"); - sql.InnerJoin("cmsContent ON (cmsContentVersion.ContentId = cmsContent.nodeId)"); - sql.InnerJoin("umbracoNode ON (cmsContent.nodeId = umbracoNode.id)"); - sql.Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } @@ -332,14 +334,15 @@ namespace Umbraco.Core.Persistence.Repositories private PropertyCollection GetPropertyCollection(int id, Guid versionId, IMediaType contentType) { - var propertySql = new Sql(); - propertySql.Select("*"); - propertySql.From("cmsPropertyData"); - propertySql.InnerJoin("cmsPropertyType ON (cmsPropertyData.propertytypeid = cmsPropertyType.id)"); - propertySql.Where("cmsPropertyData.contentNodeId = @Id", new { Id = id }); - propertySql.Where("cmsPropertyData.versionId = @VersionId", new { VersionId = versionId }); + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.PropertyTypeId, right => right.Id) + .Where(x => x.NodeId == id) + .Where(x => x.VersionId == versionId); - var propertyDataDtos = Database.Fetch(propertySql); + var propertyDataDtos = Database.Fetch(sql); var propertyFactory = new PropertyFactory(contentType, versionId, id); var properties = propertyFactory.BuildMediaEntity(propertyDataDtos); return new PropertyCollection(properties); diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentTypeRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/ContentTypeRepositorySqlClausesTest.cs index eb01d61e9f..cff1983b07 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentTypeRepositorySqlClausesTest.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentTypeRepositorySqlClausesTest.cs @@ -70,5 +70,69 @@ namespace Umbraco.Tests.Persistence.Querying Console.WriteLine(sql.SQL); } + + [Test] + public void Can_Verify_PerformQuery_Clause() + { + var expected = new Sql(); + expected.Select("*") + .From("[cmsPropertyTypeGroup]") + .RightJoin("[cmsPropertyType]").On("[cmsPropertyTypeGroup].[id] = [cmsPropertyType].[propertyTypeGroupId]") + .InnerJoin("[cmsDataType]").On("[cmsPropertyType].[dataTypeId] = [cmsDataType].[nodeId]"); + + var sql = new Sql(); + sql.Select("*") + .From() + .RightJoin() + .On(left => left.Id, right => right.PropertyTypeGroupId) + .InnerJoin() + .On(left => left.DataTypeId, right => right.DataTypeId); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } + + [Test] + public void Can_Verify_AllowedContentTypeIds_Clause() + { + var expected = new Sql(); + expected.Select("*") + .From("[cmsContentTypeAllowedContentType]") + .Where("[cmsContentTypeAllowedContentType].[Id] = 1050"); + + var sql = new Sql(); + sql.Select("*") + .From() + .Where(x => x.Id == 1050); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } + + [Test] + public void Can_Verify_PropertyGroupCollection_Clause() + { + var expected = new Sql(); + expected.Select("*") + .From("[cmsPropertyTypeGroup]") + .RightJoin("[cmsPropertyType]").On("[cmsPropertyTypeGroup].[id] = [cmsPropertyType].[propertyTypeGroupId]") + .InnerJoin("[cmsDataType]").On("[cmsPropertyType].[dataTypeId] = [cmsDataType].[nodeId]") + .Where("[cmsPropertyType].[contentTypeId] = 1050"); + + var sql = new Sql(); + sql.Select("*") + .From() + .RightJoin() + .On(left => left.Id, right => right.PropertyTypeGroupId) + .InnerJoin() + .On(left => left.DataTypeId, right => right.DataTypeId) + .Where(x => x.ContentTypeId == 1050); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Querying/DataTypeDefinitionRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/DataTypeDefinitionRepositorySqlClausesTest.cs new file mode 100644 index 0000000000..efb392813e --- /dev/null +++ b/src/Umbraco.Tests/Persistence/Querying/DataTypeDefinitionRepositorySqlClausesTest.cs @@ -0,0 +1,35 @@ +using System; +using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Persistence.Querying +{ + [TestFixture] + public class DataTypeDefinitionRepositorySqlClausesTest : BaseUsingSqlCeSyntax + { + [Test] + public void Can_Verify_Base_Clause() + { + var NodeObjectTypeId = new Guid("30a2a501-1978-4ddb-a57b-f7efed43ba3c"); + + var expected = new Sql(); + expected.Select("*") + .From("[cmsDataType]") + .InnerJoin("[umbracoNode]").On("[cmsDataType].[nodeId] = [umbracoNode].[id]") + .Where("[umbracoNode].[nodeObjectType] = '30a2a501-1978-4ddb-a57b-f7efed43ba3c'"); + + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.DataTypeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Querying/MediaRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/MediaRepositorySqlClausesTest.cs new file mode 100644 index 0000000000..8d6c880d23 --- /dev/null +++ b/src/Umbraco.Tests/Persistence/Querying/MediaRepositorySqlClausesTest.cs @@ -0,0 +1,38 @@ +using System; +using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Persistence.Querying +{ + [TestFixture] + public class MediaRepositorySqlClausesTest : BaseUsingSqlCeSyntax + { + [Test] + public void Can_Verify_Base_Clause() + { + var NodeObjectTypeId = new Guid("b796f64c-1f99-4ffb-b886-4bf4bc011a9c"); + + var expected = new Sql(); + expected.Select("*") + .From("[cmsContentVersion]") + .InnerJoin("[cmsContent]").On("[cmsContentVersion].[ContentId] = [cmsContent].[nodeId]") + .InnerJoin("[umbracoNode]").On("[cmsContent].[nodeId] = [umbracoNode].[id]") + .Where("[umbracoNode].[nodeObjectType] = 'b796f64c-1f99-4ffb-b886-4bf4bc011a9c'"); + + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs new file mode 100644 index 0000000000..ae418f697b --- /dev/null +++ b/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs @@ -0,0 +1,16 @@ +using System; +using NUnit.Framework; +using Umbraco.Tests.TestHelpers; + +namespace Umbraco.Tests.Persistence.Querying +{ + [TestFixture] + public class MediaTypeRepositorySqlClausesTest : BaseUsingSqlCeSyntax + { + [Test] + public void Can_Verify_Base_Clause() + { + var NodeObjectTypeId = new Guid(""); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index cec6f57632..9770fe643e 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -178,7 +178,10 @@ + + + From f534a671df04b511b5ec81ae11b6ed33a898ecf5 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 4 Jan 2013 10:48:49 -0100 Subject: [PATCH 4/8] Refactoring MediaTypeRepository to use strongly typed query for generating sql. --- .../Repositories/MediaTypeRepository.cs | 31 ++++++++++--------- .../MediaTypeRepositorySqlClausesTest.cs | 21 ++++++++++++- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs index 17035d725d..c4172665c5 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs @@ -104,10 +104,11 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("cmsContentType"); - sql.InnerJoin("umbracoNode ON (cmsContentType.nodeId = umbracoNode.id)"); - sql.Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } @@ -120,17 +121,17 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id"), - string.Format("DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id"), - string.Format("DELETE FROM cmsTagRelationship WHERE nodeId = @Id"), - string.Format("DELETE FROM cmsContentTypeAllowedContentType WHERE Id = @Id"), - string.Format("DELETE FROM cmsContentTypeAllowedContentType WHERE AllowedId = @Id"), - string.Format("DELETE FROM cmsContentType2ContentType WHERE parentContentTypeId = @Id"), - string.Format("DELETE FROM cmsContentType2ContentType WHERE childContentTypeId = @Id"), - string.Format("DELETE FROM cmsPropertyType WHERE contentTypeId = @Id"), - string.Format("DELETE FROM cmsPropertyTypeGroup WHERE contenttypeNodeId = @Id"), - string.Format("DELETE FROM cmsContentType WHERE NodeId = @Id"), - string.Format("DELETE FROM umbracoNode WHERE id = @Id") + "DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id", + "DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id", + "DELETE FROM cmsTagRelationship WHERE nodeId = @Id", + "DELETE FROM cmsContentTypeAllowedContentType WHERE Id = @Id", + "DELETE FROM cmsContentTypeAllowedContentType WHERE AllowedId = @Id", + "DELETE FROM cmsContentType2ContentType WHERE parentContentTypeId = @Id", + "DELETE FROM cmsContentType2ContentType WHERE childContentTypeId = @Id", + "DELETE FROM cmsPropertyType WHERE contentTypeId = @Id", + "DELETE FROM cmsPropertyTypeGroup WHERE contenttypeNodeId = @Id", + "DELETE FROM cmsContentType WHERE NodeId = @Id", + "DELETE FROM umbracoNode WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs b/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs index ae418f697b..e143d89534 100644 --- a/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs +++ b/src/Umbraco.Tests/Persistence/Querying/MediaTypeRepositorySqlClausesTest.cs @@ -1,5 +1,7 @@ using System; using NUnit.Framework; +using Umbraco.Core.Models.Rdbms; +using Umbraco.Core.Persistence; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Persistence.Querying @@ -10,7 +12,24 @@ namespace Umbraco.Tests.Persistence.Querying [Test] public void Can_Verify_Base_Clause() { - var NodeObjectTypeId = new Guid(""); + var NodeObjectTypeId = new Guid("4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e"); + + var expected = new Sql(); + expected.Select("*") + .From("[cmsContentType]") + .InnerJoin("[umbracoNode]").On("[cmsContentType].[nodeId] = [umbracoNode].[id]") + .Where("[umbracoNode].[nodeObjectType] = '4ea4382b-2f5a-4c2b-9587-ae9b3cf3602e'"); + + var sql = new Sql(); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); + + Assert.That(sql.SQL, Is.EqualTo(expected.SQL)); + + Console.WriteLine(sql.SQL); } } } \ No newline at end of file From ad36595b9642473101855ea00a284fb883ef0464 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 4 Jan 2013 11:01:20 -0100 Subject: [PATCH 5/8] Refactoring remaining repositories using the standard sql builder to use stronly typed queries for generating sql. This completes U4-1224 --- .../Repositories/DictionaryRepository.cs | 11 ++++++----- .../Repositories/LanguageRepository.cs | 6 +++--- .../Repositories/RelationRepository.cs | 7 +++---- .../Repositories/RelationTypeRepository.cs | 8 ++++---- .../Repositories/TemplateRepository.cs | 19 ++++++++++--------- .../Repositories/UserRepository.cs | 6 +++--- .../Repositories/UserTypeRepository.cs | 8 ++++---- 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs index 499b79c918..a69fe73149 100644 --- a/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/DictionaryRepository.cs @@ -101,14 +101,15 @@ namespace Umbraco.Core.Persistence.Repositories var sql = new Sql(); if(isCount) { - sql.Select("COUNT(*)"); - sql.From("cmsDictionary"); + sql.Select("COUNT(*)") + .From(); } else { - sql.Select("*"); - sql.From("cmsDictionary"); - sql.InnerJoin("cmsLanguageText ON (cmsDictionary.id = cmsLanguageText.UniqueId)"); + sql.Select("*") + .From() + .InnerJoin() + .On(left => left.UniqueId, right => right.UniqueId); } return sql; } diff --git a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs index 77448817be..1617cffc39 100644 --- a/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/LanguageRepository.cs @@ -85,8 +85,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("umbracoLanguage"); + sql.Select(isCount ? "COUNT(*)" : "*") + .From(); return sql; } @@ -100,7 +100,7 @@ namespace Umbraco.Core.Persistence.Repositories //NOTE: There is no constraint between the Language and cmsDictionary/cmsLanguageText tables (?) var list = new List { - string.Format("DELETE FROM umbracoLanguage WHERE id = @Id") + "DELETE FROM umbracoLanguage WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs index 3b2d8e753f..02839e78e4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RelationRepository.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Caching; using Umbraco.Core.Persistence.Factories; @@ -93,8 +92,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("umbracoRelation"); + sql.Select(isCount ? "COUNT(*)" : "*") + .From(); return sql; } @@ -107,7 +106,7 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoRelation WHERE id = @Id") + "DELETE FROM umbracoRelation WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs index bebfb7311b..be5a4ade57 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RelationTypeRepository.cs @@ -84,8 +84,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("umbracoRelationType"); + sql.Select(isCount ? "COUNT(*)" : "*") + .From(); return sql; } @@ -98,8 +98,8 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoRelation WHERE relType = @Id"), - string.Format("DELETE FROM umbracoRelationType WHERE id = @Id") + "DELETE FROM umbracoRelation WHERE relType = @Id", + "DELETE FROM umbracoRelationType WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs index 88565f29e9..0433418435 100644 --- a/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/TemplateRepository.cs @@ -130,10 +130,11 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("cmsTemplate"); - sql.InnerJoin("umbracoNode").On("cmsTemplate.nodeId = umbracoNode.id"); - sql.Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId }); + sql.Select(isCount ? "COUNT(*)" : "*") + .From() + .InnerJoin() + .On(left => left.NodeId, right => right.NodeId) + .Where(x => x.NodeObjectType == NodeObjectTypeId); return sql; } @@ -147,11 +148,11 @@ namespace Umbraco.Core.Persistence.Repositories //TODO check for references in DocumentDto and remove value (nullable) var list = new List { - string.Format("DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id"), - string.Format("DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id"), - string.Format("DELETE FROM cmsDocumentType WHERE templateNodeId = @Id"), - string.Format("DELETE FROM cmsTemplate WHERE nodeId = @Id"), - string.Format("DELETE FROM umbracoNode WHERE id = @Id") + "DELETE FROM umbracoUser2NodeNotify WHERE nodeId = @Id", + "DELETE FROM umbracoUser2NodePermission WHERE nodeId = @Id", + "DELETE FROM cmsDocumentType WHERE templateNodeId = @Id", + "DELETE FROM cmsTemplate WHERE nodeId = @Id", + "DELETE FROM umbracoNode WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index 383394ae60..a42c626027 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -88,8 +88,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("umbracoUser"); + sql.Select(isCount ? "COUNT(*)" : "*") + .From(); return sql; } @@ -102,7 +102,7 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoUser WHERE id = @Id") + "DELETE FROM umbracoUser WHERE id = @Id" }; return list; } diff --git a/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs index 98e3fc4e7e..7d459eb2b2 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserTypeRepository.cs @@ -83,8 +83,8 @@ namespace Umbraco.Core.Persistence.Repositories protected override Sql GetBaseQuery(bool isCount) { var sql = new Sql(); - sql.Select(isCount ? "COUNT(*)" : "*"); - sql.From("umbracoUserType"); + sql.Select(isCount ? "COUNT(*)" : "*") + .From(); return sql; } @@ -97,8 +97,8 @@ namespace Umbraco.Core.Persistence.Repositories { var list = new List { - string.Format("DELETE FROM umbracoUser WHERE userType = @Id"), - string.Format("DELETE FROM umbracoUserType WHERE id = @Id") + "DELETE FROM umbracoUser WHERE userType = @Id", + "DELETE FROM umbracoUserType WHERE id = @Id" }; return list; } From d5554308d3d4dd78a05623a6ef833237dc122979 Mon Sep 17 00:00:00 2001 From: Morten Christensen Date: Fri, 4 Jan 2013 11:03:54 -0100 Subject: [PATCH 6/8] Adding UrlHelper to UmbracoUserControl --- src/Umbraco.Web/UmbracoUserControl.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Umbraco.Web/UmbracoUserControl.cs b/src/Umbraco.Web/UmbracoUserControl.cs index e9f3444483..ac0a0dd60f 100644 --- a/src/Umbraco.Web/UmbracoUserControl.cs +++ b/src/Umbraco.Web/UmbracoUserControl.cs @@ -1,4 +1,7 @@ using System; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; using System.Web.UI; using Umbraco.Core; using Umbraco.Core.Services; @@ -68,5 +71,17 @@ namespace Umbraco.Web { get { return ApplicationContext.DatabaseContext; } } + + private UrlHelper _url; + /// + /// Returns a UrlHelper + /// + /// + /// This URL helper is created without any route data and an empty request context + /// + public UrlHelper Url + { + get { return _url ?? (_url = new UrlHelper(new RequestContext(new HttpContextWrapper(Context), new RouteData()))); } + } } } \ No newline at end of file From e3a8a08e2fc7a1305af06927cffde07a9b62f483 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Sat, 5 Jan 2013 14:54:30 -0100 Subject: [PATCH 7/8] Add some logging to SQLHelper setup for debugging purposes --- src/umbraco.businesslogic/Application.cs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/umbraco.businesslogic/Application.cs b/src/umbraco.businesslogic/Application.cs index 9b1a6b5bab..be8d17dcc6 100644 --- a/src/umbraco.businesslogic/Application.cs +++ b/src/umbraco.businesslogic/Application.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Web; using System.Xml.Linq; using Umbraco.Core; +using Umbraco.Core.Logging; using umbraco.DataLayer; using umbraco.IO; using System.Runtime.CompilerServices; @@ -78,24 +79,29 @@ namespace umbraco.BusinessLogic { if (_sqlHelper == null) { + var connectionString = string.Empty; + try { const string umbracoDsn = Umbraco.Core.Configuration.GlobalSettings.UmbracoConnectionName; - - var connectionString = string.Empty; - + var databaseSettings = ConfigurationManager.ConnectionStrings[umbracoDsn]; - if(databaseSettings != null) + if (databaseSettings != null) connectionString = databaseSettings.ConnectionString; - + // During upgrades we might still have the old appSettings connectionstring, and not the new one, so get that one instead - if (string.IsNullOrWhiteSpace(connectionString) && ConfigurationManager.AppSettings.ContainsKey(umbracoDsn)) + if (string.IsNullOrWhiteSpace(connectionString) && + ConfigurationManager.AppSettings.ContainsKey(umbracoDsn)) connectionString = ConfigurationManager.AppSettings[umbracoDsn]; _sqlHelper = DataLayerHelper.CreateSqlHelper(connectionString); } - catch { } + catch(Exception ex) + { + LogHelper.Error(string.Format("Can't instantiate SQLHelper with connectionstring \"{0}\"", connectionString), ex); + } } + return _sqlHelper; } } From 162fbcd4a472144c793490510bae75760e6b66ed Mon Sep 17 00:00:00 2001 From: leekelleher Date: Sun, 6 Jan 2013 22:22:14 +0000 Subject: [PATCH 8/8] Changed the PropertyEditorValueConverterTests to use TestCase attributes instead of an array. (Finally followed this up since chatting with Shannon) --- .../PropertyEditorValueConverterTests.cs | 70 +++++++------------ 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs index c8616bb7c7..4e5cfe56dd 100644 --- a/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs +++ b/src/Umbraco.Tests/PropertyEditors/PropertyEditorValueConverterTests.cs @@ -10,58 +10,42 @@ namespace Umbraco.Tests.PropertyEditors [TestFixture] public class PropertyEditorValueConverterTests { - [Test] - public void CanConvertDatePickerPropertyEditor() + [TestCase("2012-11-10", true)] + [TestCase("2012/11/10", true)] + [TestCase("10/11/2012", true)] + [TestCase("11/10/2012", false)] + [TestCase("Sat 10, Nov 2012", true)] + [TestCase("Saturday 10, Nov 2012", true)] + [TestCase("Sat 10, November 2012", true)] + [TestCase("Saturday 10, November 2012", true)] + [TestCase("2012-11-10 13:14:15", true)] + [TestCase("", false)] + public void CanConvertDatePickerPropertyEditor(string date, bool expected) { var converter = new DatePickerPropertyEditorValueConverter(); var dateTime = new DateTime(2012, 11, 10, 13, 14, 15); - var testCases = new Dictionary - { - {"2012-11-10", true}, - {"2012/11/10", true}, - {"10/11/2012", true}, - {"11/10/2012", false}, - {"Sat 10, Nov 2012", true}, - {"Saturday 10, Nov 2012", true}, - {"Sat 10, November 2012", true}, - {"Saturday 10, November 2012", true}, - {"2012-11-10 13:14:15", true}, - {"", false} - }; + var result = converter.ConvertPropertyValue(date); - foreach (var testCase in testCases) - { - var result = converter.ConvertPropertyValue(testCase.Key); - - Assert.IsTrue(result.Success); - Assert.AreEqual(DateTime.Equals(dateTime.Date, ((DateTime)result.Result).Date), testCase.Value); - } + Assert.IsTrue(result.Success); + Assert.AreEqual(DateTime.Equals(dateTime.Date, ((DateTime) result.Result).Date), expected); } - [Test] - public void CanConvertYesNoPropertyEditor() + [TestCase("TRUE", true)] + [TestCase("True", true)] + [TestCase("true", true)] + [TestCase("1", true)] + [TestCase("FALSE", false)] + [TestCase("False", false)] + [TestCase("false", false)] + [TestCase("0", false)] + [TestCase("", false)] + public void CanConvertYesNoPropertyEditor(string value, bool expected) { var converter = new YesNoPropertyEditorValueConverter(); - var testCases = new Dictionary - { - {"TRUE", true}, - {"True", true}, - {"true", true}, - {"1", true}, - {"FALSE", false}, - {"False", false}, - {"false", false}, - {"0", false}, - {"", false} - }; + var result = converter.ConvertPropertyValue(value); - foreach (var testCase in testCases) - { - var result = converter.ConvertPropertyValue(testCase.Key); - - Assert.IsTrue(result.Success); - Assert.AreEqual(testCase.Value, result.Result); - } + Assert.IsTrue(result.Success); + Assert.AreEqual(expected, result.Result); } } }