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