Make the SQL Azure connection string support custom domains and all kinds of

ways of entering it.
This commit is contained in:
Sebastiaan Janssen
2013-02-20 14:34:18 -01:00
parent 5d931d1146
commit b06620f56e
2 changed files with 73 additions and 1 deletions

View File

@@ -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());
}
/// <summary>
/// Saves the connection string as a proper .net ConnectionString and the legacy AppSettings key/value.
/// </summary>

View File

@@ -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");
}
}
}