From a8cc8fa68823a6e7e8b949cab3eb4caf840b06df Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 30 Apr 2014 19:58:59 +1000 Subject: [PATCH] Fixes case sensitivity with MySQL --- src/Umbraco.Core/DatabaseContext.cs | 31 ++++++++++++++++--- .../Initial/DatabaseSchemaCreation.cs | 2 ++ .../Repositories/ContentRepository.cs | 6 ++-- .../Repositories/ContentTypeRepository.cs | 2 +- .../Repositories/MediaRepository.cs | 6 ++-- .../Repositories/MediaTypeRepository.cs | 2 +- .../Repositories/MemberRepository.cs | 4 +-- .../Repositories/MemberTypeRepository.cs | 2 +- .../Repositories/RecycleBinRepository.cs | 6 ++-- .../Repositories/UserRepository.cs | 2 +- 10 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 2bc46688f2..d68c56e5db 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -456,6 +456,11 @@ namespace Umbraco.Core string message; var database = new UmbracoDatabase(_connectionString, ProviderName); + + // If MySQL, we're going to ensure that database calls are maintaining proper casing as to remove the necessity for checks + // for case insensitive queries. In an ideal situation (which is what we're striving for), all calls would be case sensitive. + + /* var supportsCaseInsensitiveQueries = SqlSyntaxContext.SqlSyntaxProvider.SupportsCaseInsensitiveQueries(database); if (supportsCaseInsensitiveQueries == false) { @@ -468,8 +473,9 @@ namespace Umbraco.Core return new Result { Message = message, Success = false, Percentage = "15" }; } + */ - message = GetResultMessageForMySql(supportsCaseInsensitiveQueries); + message = GetResultMessageForMySql(); var schemaResult = ValidateDatabaseSchema(); var installedVersion = schemaResult.DetermineInstalledVersion(); @@ -520,9 +526,9 @@ namespace Umbraco.Core LogHelper.Info("Database upgrade started"); var database = new UmbracoDatabase(_connectionString, ProviderName); - var supportsCaseInsensitiveQueries = SqlSyntaxContext.SqlSyntaxProvider.SupportsCaseInsensitiveQueries(database); + //var supportsCaseInsensitiveQueries = SqlSyntaxContext.SqlSyntaxProvider.SupportsCaseInsensitiveQueries(database); - var message = GetResultMessageForMySql(supportsCaseInsensitiveQueries); + var message = GetResultMessageForMySql(); var schemaResult = ValidateDatabaseSchema(); var installedVersion = schemaResult.DetermineInstalledVersion(); @@ -549,6 +555,23 @@ namespace Umbraco.Core } } + private string GetResultMessageForMySql() + { + if (SqlSyntaxContext.SqlSyntaxProvider.GetType() == typeof(MySqlSyntaxProvider)) + { + return "

 

Congratulations, the database step ran successfully!

" + + "

Note: You're using MySQL and the database instance you're connecting to seems to support case insensitive queries.

" + + "

However, your hosting provider may not support this option. Umbraco does not currently support MySQL installs that do not support case insensitive queries

" + + "

Make sure to check with your hosting provider if they support case insensitive queries as well.

" + + "

They can check this by looking for the following setting in the my.ini file in their MySQL installation directory:

" + + "
lower_case_table_names=1

" + + "

For more technical information on case sensitivity in MySQL, have a look at " + + "the documentation on the subject

"; + } + return string.Empty; + } + + /* private string GetResultMessageForMySql(bool? supportsCaseInsensitiveQueries) { if (supportsCaseInsensitiveQueries == null) @@ -572,7 +595,7 @@ namespace Umbraco.Core "the documentation on the subject

"; } return string.Empty; - } + }*/ private Attempt CheckReadyForInstall() { diff --git a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs index ee10f20730..14dcbb4d59 100644 --- a/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs +++ b/src/Umbraco.Core/Persistence/Migrations/Initial/DatabaseSchemaCreation.cs @@ -176,6 +176,8 @@ namespace Umbraco.Core.Persistence.Migrations.Initial .Where(x => x.IsNullOrWhiteSpace() == false).ToList(); //Add valid and invalid foreign key differences to the result object + // We'll need to do invariant contains with case insensitivity because foreign key, primary key, and even index naming w/ MySQL is not standardized + // In theory you could have: FK_ or fk_ ...or really any standard that your development department (or developer) chooses to use. foreach (var unknown in unknownConstraintsInDatabase) { if (foreignKeysInSchema.InvariantContains(unknown) || primaryKeysInSchema.InvariantContains(unknown) || indexesInSchema.InvariantContains(unknown)) diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs index dc5077293f..c4a437dbc4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentRepository.cs @@ -148,12 +148,12 @@ namespace Umbraco.Core.Persistence.Repositories "DELETE FROM umbracoRelation WHERE childId = @Id", "DELETE FROM cmsTagRelationship WHERE nodeId = @Id", "DELETE FROM umbracoDomains WHERE domainRootStructureID = @Id", - "DELETE FROM cmsDocument WHERE NodeId = @Id", + "DELETE FROM cmsDocument WHERE nodeId = @Id", "DELETE FROM cmsPropertyData WHERE contentNodeId = @Id", "DELETE FROM cmsPreviewXml WHERE nodeId = @Id", "DELETE FROM cmsContentVersion WHERE ContentId = @Id", - "DELETE FROM cmsContentXml WHERE nodeID = @Id", - "DELETE FROM cmsContent WHERE NodeId = @Id", + "DELETE FROM cmsContentXml WHERE nodeId = @Id", + "DELETE FROM cmsContent WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index 948e9d1367..1a95761f1a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -153,7 +153,7 @@ namespace Umbraco.Core.Persistence.Repositories "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 cmsContentType WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs index 525ddaf835..c18fd504c4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaRepository.cs @@ -135,12 +135,12 @@ namespace Umbraco.Core.Persistence.Repositories "DELETE FROM umbracoRelation WHERE parentId = @Id", "DELETE FROM umbracoRelation WHERE childId = @Id", "DELETE FROM cmsTagRelationship WHERE nodeId = @Id", - "DELETE FROM cmsDocument WHERE NodeId = @Id", + "DELETE FROM cmsDocument WHERE nodeId = @Id", "DELETE FROM cmsPropertyData WHERE contentNodeId = @Id", "DELETE FROM cmsPreviewXml WHERE nodeId = @Id", "DELETE FROM cmsContentVersion WHERE ContentId = @Id", - "DELETE FROM cmsContentXml WHERE nodeID = @Id", - "DELETE FROM cmsContent WHERE NodeId = @Id", + "DELETE FROM cmsContentXml WHERE nodeId = @Id", + "DELETE FROM cmsContent WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs index 18ff7e8e4c..95221f37bf 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MediaTypeRepository.cs @@ -134,7 +134,7 @@ namespace Umbraco.Core.Persistence.Repositories "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 cmsContentType WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index bcf6fd490e..28c9feadd4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -184,8 +184,8 @@ namespace Umbraco.Core.Persistence.Repositories "DELETE FROM cmsMember2MemberGroup WHERE Member = @Id", "DELETE FROM cmsMember WHERE nodeId = @Id", "DELETE FROM cmsContentVersion WHERE ContentId = @Id", - "DELETE FROM cmsContentXml WHERE nodeID = @Id", - "DELETE FROM cmsContent WHERE NodeId = @Id", + "DELETE FROM cmsContentXml WHERE nodeId = @Id", + "DELETE FROM cmsContent WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs index ea95936d32..198d5bdb57 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberTypeRepository.cs @@ -149,7 +149,7 @@ namespace Umbraco.Core.Persistence.Repositories "DELETE FROM cmsPropertyType WHERE contentTypeId = @Id", "DELETE FROM cmsPropertyTypeGroup WHERE contenttypeNodeId = @Id", "DELETE FROM cmsMemberType WHERE NodeId = @Id", - "DELETE FROM cmsContentType WHERE NodeId = @Id", + "DELETE FROM cmsContentType WHERE nodeId = @Id", "DELETE FROM umbracoNode WHERE id = @Id" }; return list; diff --git a/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs b/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs index 7397203cff..1ecfe62af7 100644 --- a/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/RecycleBinRepository.cs @@ -86,12 +86,12 @@ namespace Umbraco.Core.Persistence.Repositories FormatDeleteStatement("umbracoRelation", "childId"), FormatDeleteStatement("cmsTagRelationship", "nodeId"), FormatDeleteStatement("umbracoDomains", "domainRootStructureID"), - FormatDeleteStatement("cmsDocument", "NodeId"), + FormatDeleteStatement("cmsDocument", "nodeId"), FormatDeleteStatement("cmsPropertyData", "contentNodeId"), FormatDeleteStatement("cmsPreviewXml", "nodeId"), FormatDeleteStatement("cmsContentVersion", "ContentId"), - FormatDeleteStatement("cmsContentXml", "nodeID"), - FormatDeleteStatement("cmsContent", "NodeId"), + FormatDeleteStatement("cmsContentXml", "nodeId"), + FormatDeleteStatement("cmsContent", "nodeId"), "UPDATE umbracoNode SET parentID = '-20' WHERE trashed = '1' AND nodeObjectType = @NodeObjectType", "DELETE FROM umbracoNode WHERE trashed = '1' AND nodeObjectType = @NodeObjectType" }; diff --git a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs index fb6ed8ef39..a2b91a8447 100644 --- a/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/UserRepository.cs @@ -136,7 +136,7 @@ namespace Umbraco.Core.Persistence.Repositories "DELETE FROM cmsTask WHERE parentUserId = @Id", "DELETE FROM umbracoUser2NodePermission WHERE userId = @Id", "DELETE FROM umbracoUser2NodeNotify WHERE userId = @Id", - "DELETE FROM umbracoUserLogins WHERE userId = @Id", + "DELETE FROM umbracoUserLogins WHERE userID = @Id", "DELETE FROM umbracoUser2app WHERE " + SqlSyntaxContext.SqlSyntaxProvider.GetQuotedColumnName("user") + "=@Id", "DELETE FROM umbracoUser WHERE id = @Id" };