From b06620f56ebee860eb501f09b98e885582a24aa5 Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Wed, 20 Feb 2013 14:34:18 -0100 Subject: [PATCH] Make the SQL Azure connection string support custom domains and all kinds of ways of entering it. --- src/Umbraco.Core/DatabaseContext.cs | 48 ++++++++++++++++++- .../Persistence/DatabaseContextTests.cs | 26 ++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 7ab6fa3490..90b62acfcd 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -158,7 +158,7 @@ namespace Umbraco.Core } else if (databaseProvider.ToLower().Contains("azure")) { - connectionString = string.Format("Server=tcp:{0}.database.windows.net;Database={1};User ID={2}@{0};Password={3}", server, databaseName, user, password); + connectionString = BuildAzureConnectionString(server, databaseName, user, password); } else { @@ -169,6 +169,52 @@ namespace Umbraco.Core Initialize(providerName); } + internal string BuildAzureConnectionString(string server, string databaseName, string user, string password) + { + if (server.Contains(".") && ServerStartsWithTcp(server) == false) + server = string.Format("tcp:{0}", server); + + if (server.Contains(".") == false && ServerStartsWithTcp(server)) + { + string serverName = server.Contains(",") + ? server.Substring(0, server.IndexOf(",", StringComparison.Ordinal)) + : server; + + var portAddition = string.Empty; + + if (server.Contains(",")) + portAddition = server.Substring(server.IndexOf(",", StringComparison.Ordinal)); + + server = string.Format("{0}.database.windows.net{1}", serverName, portAddition); + } + + if (ServerStartsWithTcp(server) == false) + server = string.Format("tcp:{0}.database.windows.net", server); + + if (server.Contains(",") == false) + server = string.Format("{0},1433", server); + + if (user.Contains("@") == false) + { + var userDomain = server; + + if (ServerStartsWithTcp(server)) + userDomain = userDomain.Substring(userDomain.IndexOf(":", StringComparison.Ordinal) + 1); + + if (userDomain.Contains(".")) + userDomain = userDomain.Substring(0, userDomain.IndexOf(".", StringComparison.Ordinal)); + + user = string.Format("{0}@{1}", user, userDomain); + } + + return string.Format("Server={0};Database={1};User ID={2};Password={3}", server, databaseName, user, password); + } + + private static bool ServerStartsWithTcp(string server) + { + return server.ToLower().StartsWith("tcp:".ToLower()); + } + /// /// Saves the connection string as a proper .net ConnectionString and the legacy AppSettings key/value. /// diff --git a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs index acd2d7dfff..b5fc8bcc4b 100644 --- a/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs +++ b/src/Umbraco.Tests/Persistence/DatabaseContextTests.cs @@ -88,5 +88,31 @@ namespace Umbraco.Tests.Persistence Assert.That(umbracoUserTable, Is.True); Assert.That(cmsTagsTable, Is.True); } + + [TestCase("MyServer", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("MyServer", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer,1433", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net", "MyDatabase", "MyUser@MyServer", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:MyServer.database.windows.net,1433", "MyDatabase", "MyUser@MyServer", "MyPassword")] + public void Build_Azure_Connection_String_Regular(string server, string databaseName, string userName, string password) + { + var connectionString = _dbContext.BuildAzureConnectionString(server, databaseName, userName, password); + Assert.AreEqual(connectionString, "Server=tcp:MyServer.database.windows.net,1433;Database=MyDatabase;User ID=MyUser@MyServer;Password=MyPassword"); + } + + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433", "MyDatabase", "MyUser@kzeej5z8ty", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com", "MyDatabase", "MyUser", "MyPassword")] + [TestCase("tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com", "MyDatabase", "MyUser@kzeej5z8ty", "MyPassword")] + public void Build_Azure_Connection_String_CustomServer(string server, string databaseName, string userName, string password) + { + var connectionString = _dbContext.BuildAzureConnectionString(server, databaseName, userName, password); + Assert.AreEqual(connectionString, "Server=tcp:kzeej5z8ty.ssmsawacluster4.windowsazure.mscds.com,1433;Database=MyDatabase;User ID=MyUser@kzeej5z8ty;Password=MyPassword"); + } } } \ No newline at end of file