Ejemplo n.º 1
0
        public void AddRangeMapShard(AddRangeMapShardArgs args)
        {
            args.Validate();

            var connectionString = new SqlConnectionStringBuilder(args.ConnectionString);

            Log.Information(
                LoggingMessageTemplates.AddRangeMapShard,
                args.ShardDatabaseName,
                args.ShardServerName,
                args.ShardKeyRange.KeyType.Name,
                args.ShardKeyRange.LowValue,
                args.ShardKeyRange.HighValue,
                args.MapName,
                connectionString.InitialCatalog,
                connectionString.DataSource);

            var shardManagementServiceType = typeof(ShardMapManagementService);
            var addRangeMapShardGeneric    = shardManagementServiceType.GetMethod("AddRangeMapShard");
            var addRangeMapShard           = addRangeMapShardGeneric.MakeGenericMethod(args.ShardKeyRange.KeyType);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);
            var parameters             = new[]
            {
                args.MapName,
                args.ShardKeyRange.LowValue,
                args.ShardKeyRange.HighValue,
                args.ShardServerName,
                args.ShardDatabaseName
            };

            addRangeMapShard.Invoke(shardManagementService, parameters);
        }
Ejemplo n.º 2
0
        public void Deploy(DeployArgs args)
        {
            args.Validate();

            var connectionStringBuilder = new SqlConnectionStringBuilder(args.ConnectionString);
            var targetDatabase          = connectionStringBuilder.InitialCatalog;
            var targetServer            = connectionStringBuilder.DataSource;

            connectionStringBuilder.InitialCatalog = string.Empty;
            var serverConnectionString = connectionStringBuilder.ConnectionString;

            Log.Information(LoggingMessageTemplates.CreateDatabase, targetDatabase, targetServer);
            SqlDatabaseUtilities.CreateDatabaseIfNotExists(targetDatabase, serverConnectionString);

            Log.Information(LoggingMessageTemplates.Deploy, targetDatabase, targetServer);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);

            shardManagementService.Deploy();

            if (args.HasLoginName && args.UseWindowsLogin)
            {
                Log.Information(LoggingMessageTemplates.CreateSqlLoginFromWindowsAccount, args.LoginName, targetServer);
                SqlDatabaseUtilities.CreateWindowsLoginIfNotExists(args.LoginName, serverConnectionString);
            }
            else if (args.HasLoginName)
            {
                Log.Information(LoggingMessageTemplates.CreateSqlLogin, args.LoginName, targetServer);
                SqlDatabaseUtilities.CreateSqlLoginIfNotExists(
                    args.LoginName,
                    args.LoginPassword,
                    serverConnectionString);
            }

            if (args.HasDatabaseUserName)
            {
                Log.Information(
                    LoggingMessageTemplates.CreateDatabaseUser,
                    args.DatabaseUserName,
                    targetDatabase,
                    args.LoginName,
                    targetServer);

                SqlDatabaseUtilities.CreateDatabaseUserIfNotExists(
                    args.LoginName,
                    args.DatabaseUserName,
                    args.ConnectionString);

                Log.Information(
                    LoggingMessageTemplates.GrantUserReadWritePermissions,
                    args.DatabaseUserName,
                    targetDatabase, targetServer);

                SqlDatabaseUtilities.GrantUserDatabaseRequiredPermissions(args.DatabaseUserName, args.ConnectionString);
            }
        }
Ejemplo n.º 3
0
        public void Deploy(DeployArgs args)
        {
            args.Validate();

            var connectionStringBuilder = new SqlConnectionStringBuilder(args.ConnectionString);
            var targetDatabase = connectionStringBuilder.InitialCatalog;
            var targetServer = connectionStringBuilder.DataSource;

            connectionStringBuilder.InitialCatalog = string.Empty;
            var serverConnectionString = connectionStringBuilder.ConnectionString;

            Log.Information(LoggingMessageTemplates.CreateDatabase, targetDatabase, targetServer);
            SqlDatabaseUtilities.CreateDatabaseIfNotExists(targetDatabase, serverConnectionString);

            Log.Information(LoggingMessageTemplates.Deploy, targetDatabase, targetServer);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);
            shardManagementService.Deploy();

            if (args.HasLoginName && args.UseWindowsLogin)
            {
                Log.Information(LoggingMessageTemplates.CreateSqlLoginFromWindowsAccount, args.LoginName, targetServer);
                SqlDatabaseUtilities.CreateWindowsLoginIfNotExists(args.LoginName, serverConnectionString);
            }
            else if (args.HasLoginName)
            {
                Log.Information(LoggingMessageTemplates.CreateSqlLogin, args.LoginName, targetServer);
                SqlDatabaseUtilities.CreateSqlLoginIfNotExists(
                    args.LoginName,
                    args.LoginPassword,
                    serverConnectionString);
            }

            if (args.HasDatabaseUserName)
            {
                Log.Information(
                    LoggingMessageTemplates.CreateDatabaseUser, 
                    args.DatabaseUserName, 
                    targetDatabase,
                    args.LoginName, 
                    targetServer);

                SqlDatabaseUtilities.CreateDatabaseUserIfNotExists(
                    args.LoginName, 
                    args.DatabaseUserName,
                    args.ConnectionString);

                Log.Information(
                    LoggingMessageTemplates.GrantUserReadWritePermissions, 
                    args.DatabaseUserName,
                    targetDatabase, targetServer);

                SqlDatabaseUtilities.GrantUserDatabaseRequiredPermissions(args.DatabaseUserName, args.ConnectionString);
            }
        }
Ejemplo n.º 4
0
        private static void CreateShardMap(CreateShardMapArgs args, string createMethodName)
        {
            var shardManagementServiceType = typeof(ShardMapManagementService);
            var createShardMapGeneric      = shardManagementServiceType.GetMethod(createMethodName);
            var createShardMap             = createShardMapGeneric.MakeGenericMethod(args.ShardKeyType);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);
            var parameters             = new object[] { args.MapName };

            createShardMap.Invoke(shardManagementService, parameters);
        }
Ejemplo n.º 5
0
        private static void CreateShardMap(CreateShardMapArgs args, string createMethodName)
        {
            var shardManagementServiceType = typeof(ShardMapManagementService);
            var createShardMapGeneric = shardManagementServiceType.GetMethod(createMethodName);
            var createShardMap = createShardMapGeneric.MakeGenericMethod(args.ShardKeyType);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);
            var parameters = new object[] { args.MapName };
            createShardMap.Invoke(shardManagementService, parameters);
        }
Ejemplo n.º 6
0
        public void AddInt32RangeMapShards(AddInt32RangeMapShardsArgs args)
        {
            args.Validate();

            var shardRanges = Int32RangeGenerator.GetRanges(args.ShardLocations.Locations.Length);

            // sanity checks
            if (shardRanges.Count != args.ShardLocations.Locations.Length)
            {
                throw new Exception($"The number of locations ({args.ShardLocations.Locations.Length}) does not match the number of generated shard ranges ({shardRanges.Count}).");
            }

            if (shardRanges[1].LowValue != int.MinValue)
            {
                throw new Exception($"Expected the first shard range low value to be int.MinValue, but it is {shardRanges[1].LowValue}.");
            }

            if (shardRanges[shardRanges.Count].HighValue != int.MaxValue)
            {
                throw new Exception($"Expected the last shard range high value to be int.MaxValue, but it is {shardRanges[shardRanges.Count].HighValue}.");
            }

            // now that we're sure everything is as expected, let's proceed...
            var shardManagementService = new ShardMapManagementService(args.ConnectionString);

            var keyType = typeof(int).Name;
            var connectionString = new SqlConnectionStringBuilder(args.ConnectionString);

            for (int i = 0; i < args.ShardLocations.Locations.Length - 1; i++)
            {
                var shardNumber = (i + 1);
                var location = args.ShardLocations.Locations[i];
                var range = shardRanges[shardNumber];

                Log.Information(
                    LoggingMessageTemplates.AddRangeMapShard,
                    shardNumber,
                    location.DatabaseName,
                    location.ServerName,
                    keyType,
                    range.LowValue,
                    range.HighValue,
                    args.MapName,
                    connectionString.InitialCatalog,
                    connectionString.DataSource);

                shardManagementService.AddRangeMapShard(
                    args.MapName,
                    range.LowValue,
                    range.HighValue,
                    location.ServerName,
                    location.DatabaseName);
            }

            var lastLocation = args.ShardLocations.Locations.Last();
            var lastRange = shardRanges.Last();

            Log.Information(
                LoggingMessageTemplates.AddRangeMapShard,
                lastRange.Key,
                lastLocation.DatabaseName,
                lastLocation.ServerName,
                keyType,
                lastRange.Value.LowValue,
                "+infinity",
                args.MapName,
                connectionString.InitialCatalog,
                connectionString.DataSource);

            shardManagementService.AddRangeMapShard(
                args.MapName, 
                lastRange.Value.LowValue, 
                lastLocation.ServerName,
                lastLocation.DatabaseName);
        }
Ejemplo n.º 7
0
        public void AddRangeMapShard(AddRangeMapShardArgs args)
        {
            args.Validate();

            var connectionString = new SqlConnectionStringBuilder(args.ConnectionString);
            Log.Information(
                LoggingMessageTemplates.AddRangeMapShard,
                args.ShardDatabaseName,
                args.ShardServerName,
                args.ShardKeyRange.KeyType.Name,
                args.ShardKeyRange.LowValue,
                args.ShardKeyRange.HighValue,
                args.MapName,
                connectionString.InitialCatalog,
                connectionString.DataSource);

            var shardManagementServiceType = typeof(ShardMapManagementService);
            var addRangeMapShardGeneric = shardManagementServiceType.GetMethod("AddRangeMapShard");
            var addRangeMapShard = addRangeMapShardGeneric.MakeGenericMethod(args.ShardKeyRange.KeyType);

            var shardManagementService = new ShardMapManagementService(args.ConnectionString);
            var parameters = new[]
            {
                args.MapName,
                args.ShardKeyRange.LowValue,
                args.ShardKeyRange.HighValue,
                args.ShardServerName,
                args.ShardDatabaseName
            };
            addRangeMapShard.Invoke(shardManagementService, parameters);
        }
Ejemplo n.º 8
0
        public void AddInt32RangeMapShards(AddInt32RangeMapShardsArgs args)
        {
            args.Validate();

            var shardRanges = Int32RangeGenerator.GetRanges(args.ShardLocations.Locations.Length);

            // sanity checks
            if (shardRanges.Count != args.ShardLocations.Locations.Length)
            {
                throw new Exception($"The number of locations ({args.ShardLocations.Locations.Length}) does not match the number of generated shard ranges ({shardRanges.Count}).");
            }

            if (shardRanges[1].LowValue != int.MinValue)
            {
                throw new Exception($"Expected the first shard range low value to be int.MinValue, but it is {shardRanges[1].LowValue}.");
            }

            if (shardRanges[shardRanges.Count].HighValue != int.MaxValue)
            {
                throw new Exception($"Expected the last shard range high value to be int.MaxValue, but it is {shardRanges[shardRanges.Count].HighValue}.");
            }

            // now that we're sure everything is as expected, let's proceed...
            var shardManagementService = new ShardMapManagementService(args.ConnectionString);

            var keyType          = typeof(int).Name;
            var connectionString = new SqlConnectionStringBuilder(args.ConnectionString);

            for (int i = 0; i < args.ShardLocations.Locations.Length - 1; i++)
            {
                var shardNumber = (i + 1);
                var location    = args.ShardLocations.Locations[i];
                var range       = shardRanges[shardNumber];

                Log.Information(
                    LoggingMessageTemplates.AddRangeMapShard,
                    shardNumber,
                    location.DatabaseName,
                    location.ServerName,
                    keyType,
                    range.LowValue,
                    range.HighValue,
                    args.MapName,
                    connectionString.InitialCatalog,
                    connectionString.DataSource);

                shardManagementService.AddRangeMapShard(
                    args.MapName,
                    range.LowValue,
                    range.HighValue,
                    location.ServerName,
                    location.DatabaseName);
            }

            var lastLocation = args.ShardLocations.Locations.Last();
            var lastRange    = shardRanges.Last();

            Log.Information(
                LoggingMessageTemplates.AddRangeMapShard,
                lastRange.Key,
                lastLocation.DatabaseName,
                lastLocation.ServerName,
                keyType,
                lastRange.Value.LowValue,
                "+infinity",
                args.MapName,
                connectionString.InitialCatalog,
                connectionString.DataSource);

            shardManagementService.AddRangeMapShard(
                args.MapName,
                lastRange.Value.LowValue,
                lastLocation.ServerName,
                lastLocation.DatabaseName);
        }