64 lines
2.3 KiB
C#
64 lines
2.3 KiB
C#
using System;
|
|
using System.Data.SqlClient;
|
|
using System.IO;
|
|
using Umbraco.Cms.Core;
|
|
|
|
namespace Umbraco.Cms.Infrastructure.Persistence
|
|
{
|
|
public class SqlServerDatabaseCreator : IDatabaseCreator
|
|
{
|
|
public string ProviderName => Constants.DatabaseProviders.SqlServer;
|
|
|
|
public void Create(string connectionString)
|
|
{
|
|
var builder = new SqlConnectionStringBuilder(connectionString);
|
|
|
|
// Get connection string without database specific information
|
|
var masterBuilder = new SqlConnectionStringBuilder(builder.ConnectionString)
|
|
{
|
|
AttachDBFilename = string.Empty,
|
|
InitialCatalog = string.Empty
|
|
};
|
|
var masterConnectionString = masterBuilder.ConnectionString;
|
|
|
|
string fileName = builder.AttachDBFilename,
|
|
database = builder.InitialCatalog;
|
|
|
|
// Create database
|
|
if (!string.IsNullOrEmpty(fileName) && !File.Exists(fileName))
|
|
{
|
|
if (string.IsNullOrWhiteSpace(database))
|
|
{
|
|
// Use a temporary database name
|
|
database = "Umbraco-" + Guid.NewGuid();
|
|
}
|
|
|
|
using var connection = new SqlConnection(masterConnectionString);
|
|
connection.Open();
|
|
|
|
using var command = new SqlCommand(
|
|
$"CREATE DATABASE [{database}] ON (NAME='{database}', FILENAME='{fileName}');" +
|
|
$"ALTER DATABASE [{database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;" +
|
|
$"EXEC sp_detach_db @dbname='{database}';",
|
|
connection);
|
|
command.ExecuteNonQuery();
|
|
|
|
connection.Close();
|
|
}
|
|
else if (!string.IsNullOrEmpty(database))
|
|
{
|
|
using var connection = new SqlConnection(masterConnectionString);
|
|
connection.Open();
|
|
|
|
using var command = new SqlCommand(
|
|
$"IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = '{database}') " +
|
|
$"CREATE DATABASE [{database}];",
|
|
connection);
|
|
command.ExecuteNonQuery();
|
|
|
|
connection.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|