/// <summary> /// Call to the shard set driver when an existing shard is being synchronized. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> public void SyncShard(ShardBase shard, ShardSetConfig shardSetConfig) { // get the settings for dac pac publishing from the shard set setting // use the sync settings // Retrieve storage account from connection string. var connectionString = ConfigurationManager.ConnectionStrings["AzureStorage"]; if (connectionString == null) { throw new InvalidOperationException("Connection string to azure storage is required in your app.config"); } var dacPacBlobName = shardSetConfig.GetShardSetSetting(_dacPacBlobNameKey); var dacPacSyncProfileBlobName = shardSetConfig.GetShardSetSetting(_dacPacSyncProfileBlobNameKey); var dacPacShouldDeployOnSync = shardSetConfig.GetShardSetSetting(_dacPacShouldDeployOnSyncKey); var dacPacsPath = DownloadDacpacsFromBlobStore(connectionString, shardSetConfig.ShardSetName); var isNewDb = dacPacShouldDeployOnSync.ToLower() == "true" && PublishDacPac(shard, shardSetConfig, dacPacsPath + @"\" + dacPacBlobName, dacPacsPath + @"\" + dacPacSyncProfileBlobName); UpdateReferenceData(shard, isNewDb); }
public void Publish(ShardBase shard, ShardSetConfig shardSetConfig, string shardUserName, string shardUserPassword, string sql, CommandType commandType) { var shardConnection = new ShardConnection { ServerInstanceName = shard.ServerInstanceName, Catalog = shard.Catalog, UserName = shardUserName, Password = shardUserPassword, ShardSetName = shardSetConfig.ShardSetName }; using (var sqlConnection = GetReliableConnection(shardConnection.ConnectionString)) { try { //open the connection sqlConnection.Open(); // execute the command var sqlCommand = sqlConnection.CreateCommand(); sqlCommand.CommandText = sql; sqlCommand.CommandType = commandType; sqlCommand.ExecuteNonQuery(); } catch (Exception) { // todo: Add Logging throw; } } }
private bool PublishDacPac(ShardBase shard, ShardSetConfig shardSetConfig, string dacPacPath, string dacPacProfilePath) { var publisher = InstantiateDacPacPublisher(shard, shardSetConfig); return(publisher.PublishDacPac(dacPacPath, dacPacProfilePath)); }
public DacPacPublisherParams(ShardBase shard, ShardSetConfig shardSetConfig, string shardUserName, string shardUserPassword, string shardAdminUserName, string shardAdminPassword) { _shard = shard; _shardSetConfig = shardSetConfig; _shardUserName = shardUserName; _shardUserPassword = shardUserPassword; _shardAdminUserName = shardAdminUserName; _shardAdminPassword = shardAdminPassword; }
private ShardConnection GetShardConnection(ShardBase shard, ShardSetConfig shardSetConfig) { return(new ShardConnection { ServerInstanceName = shard.ServerInstanceName, Catalog = shard.Catalog, UserName = _settings.AdminUser, Password = _settings.AdminPassword, ShardSetName = shardSetConfig.ShardSetName }); }
/// <summary> /// Initializes a new instance of the <see cref="ReferenceTableUpdater" /> class. /// </summary> /// <param name="referenceDataConnectionString">The reference data connection string.</param> /// <param name="shard">The shard to update.</param> /// <param name="settings">The settings.</param> /// <param name="tableGroupName">Name of the shard set.</param> public ReferenceTableUpdater(string referenceDataConnectionString, ShardBase shard, Settings settings, string tableGroupName) { _referenceDataConnectionString = referenceDataConnectionString; _shardConnection = new ShardConnection { ServerInstanceName = shard.ServerInstanceName, Catalog = shard.Catalog, UserName = settings.AdminUser, Password = settings.AdminPassword, ShardSetName = tableGroupName }; }
private DacPacPublisher InstantiateDacPacPublisher(ShardBase shard, ShardSetConfig shardSetConfig) { var parameters = new DacPacPublisher.DacPacPublisherParams( shard, shardSetConfig, _settings.ShardUser, _settings.ShardPassword, _settings.AdminUser, _settings.AdminPassword); return(new DacPacPublisher(parameters)); }
/// <summary> /// Call to the shard set driver when a shardlet is copied from one shard to another. /// </summary> /// <param name="sourceShard">The source shard.</param> /// <param name="destinationShard">The destination shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> /// <param name="shardingKey">The distribution key.</param> /// <param name="uniqueProcessID">The unique process identifier.</param> public void CopyShardlet(ShardBase sourceShard, ShardBase destinationShard, ShardSetConfig shardSetConfig, string shardingKey, Guid uniqueProcessID) { //Setup the connections for the source and destination shard var sourceConnection = GetShardConnection(sourceShard, shardSetConfig); var destinationConnection = GetShardConnection(destinationShard, shardSetConfig); var uniqueProcessString = uniqueProcessID.ToString().Trim().Replace("-", string.Empty); // copy the shardlet ResetTempTables(uniqueProcessString, destinationConnection); CopyShardletIntoTempTables(shardingKey, sourceConnection, destinationConnection, uniqueProcessString); MergeShardletAndDropTempTables(destinationConnection, uniqueProcessString); }
/// <summary> /// Call to the shard set driver when a shard is to be deleted. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> public void DeleteShard(ShardBase shard, ShardSetConfig shardSetConfig) { // todo: make sure this check occurs in the caller //if (!ignorePopulation) //{ // // todo: inefficient to return the entire list to see if any exist // var shardDistributionKeys = GetShardDistributionKeys(shard, shardSetConfig); // if (shardDistributionKeys.Any()) return; //} // todo: why is the delete code on the publisher? var publisher = InstantiateDacPacPublisher(shard, shardSetConfig); publisher.DropDatabase(); }
/// <summary> /// Call to the shard set driver when a specific shardlet is to be deleted from the shardlet. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> /// <param name="shardingKey">The distribution key.</param> public void DeleteShardlet(ShardBase shard, ShardSetConfig shardSetConfig, string shardingKey) { var shardConnection = GetShardConnection(shard, shardSetConfig); using (var connection = new ReliableSqlConnection(shardConnection.ConnectionString)) { connection.Open(); var command = new SqlCommand(_deleteShardletProcedure, connection.Current) { CommandType = CommandType.StoredProcedure }; command.Parameters.Add(CreateShardingKeyParameter(shardingKey)); command.ExecuteNonQuery(); } }
private void UpdateReferenceData(ShardBase shard, bool isNewDb) { var updater = GetReferenceTableUpdater(shard); if (isNewDb) { updater.CreateData("[Person].[CountryRegion]"); updater.CreateData("[Sales].[SalesTerritory]"); updater.CreateData("[Person].[StateProvince]"); updater.CreateData("[Sales].[Currency]"); updater.CreateData("[Sales].[CurrencyRate]"); updater.CreateData("[Sales].[SalesTaxRate]"); updater.CreateData("[Production].[UnitMeasure]"); updater.CreateData("[Production].[ProductCategory]"); updater.CreateData("[Production].[ProductModel]"); updater.CreateData("[Production].[ProductSubcategory]"); updater.CreateData("[Production].[Product]"); } else { updater.SyncData("[Person].[CountryRegion]", "[Deployment].[CountryRegionTemp]", "[Deployment].[SyncCountryRegion]"); updater.SyncData("[Sales].[SalesTerritory]", "[Deployment].[SalesTerritoryTemp]", "[Deployment].[SyncSalesTerritory]"); updater.SyncData("[Person].[StateProvince]", "[Deployment].[StateProvinceTemp]", "[Deployment].[SyncStateProvince]"); updater.SyncData("[Sales].[Currency]", "[Deployment].[CurrencyTemp]", "[Deployment].[SyncCurrency]"); updater.SyncData("[Sales].[CurrencyRate]", "[Deployment].[CurrencyRateTemp]", "[Deployment].[SyncCurrencyRate]"); updater.SyncData("[Sales].[SalesTaxRate]", "[Deployment].[SalesTaxRateTemp]", "[Deployment].[SyncSalesTaxRate]"); updater.SyncData("[Production].[UnitMeasure]", "[Deployment].[UnitMeasureTemp]", "[Deployment].[SyncUnitMeasure]"); updater.SyncData("[Production].[ProductCategory]", "[Deployment].[ProductCategoryTemp]", "[Deployment].[SyncProductCategory]"); updater.SyncData("[Production].[ProductModel]", "[Deployment].[ProductModelTemp]", "[Deployment].[SyncProductModel]"); updater.SyncData("[Production].[ProductSubcategory]", "[Deployment].[ProductSubcategoryTemp]", "[Deployment].[SyncProductSubcategory]"); updater.SyncData("[Production].[Product]", "[Deployment].[ProductTemp]", "[Deployment].[SyncProduct]"); } }
private static void AddTestShardlets(ShardBase shard, ShardSetConfig shardSetConfig, int initialTestCustomerID, int numberOfTestCustomers, int numberOfTestOrders, int numberOfTestSalesLineNums) { var shardCatalogConnection = new ShardConnection { ServerInstanceName = shard.ServerInstanceName, Catalog = shard.Catalog, UserName = "******", Password = "******", ShardSetName = shardSetConfig.ShardSetName }; var builder = new TestDataBuilder(GetReferenceConnectionString()); builder.AddTestSalesOrdersInDatabase(shardCatalogConnection.ConnectionString, initialTestCustomerID, numberOfTestCustomers, numberOfTestOrders); builder.AddTestShoppingCartItemsInDatabase(shardCatalogConnection.ConnectionString, initialTestCustomerID, numberOfTestCustomers, numberOfTestSalesLineNums); }
/// <summary> /// Call to the shard set driver when a shard is to be first created.. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> public void CreateShard(ShardBase shard, ShardSetConfig shardSetConfig) { // Retrieve storage account from connection string. var connectionString = ConfigurationManager.ConnectionStrings["AzureStorage"]; if (connectionString == null) { throw new InvalidOperationException("Connection string to azure storage is required in your app.config"); } var dacPacBlobName = shardSetConfig.GetShardSetSetting(_dacPacBlobNameKey); var dacPacDeployProfileBlobName = shardSetConfig.GetShardSetSetting(_dacPacProfileBlobNameKey); var dacPacsPath = DownloadDacpacsFromBlobStore(connectionString, shardSetConfig.ShardSetName); var isNewDb = PublishDacPac(shard, shardSetConfig, dacPacsPath + @"\" + dacPacBlobName, dacPacsPath + @"\" + dacPacDeployProfileBlobName); UpdateReferenceData(shard, isNewDb); }
/// <summary> /// Call to the shard set driver when an existing shard is being synchronized. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> public void SyncShard(ShardBase shard, ShardSetConfig shardSetConfig) { throw new NotImplementedException(); }
/// <summary> /// Call to the shard set driver when a specific shardlet is to be deleted from the shardlet. /// </summary> /// <param name="shard">The shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> /// <param name="shardingKey">The distribution key.</param> public void DeleteShardlet(ShardBase shard, ShardSetConfig shardSetConfig, string shardingKey) { throw new NotImplementedException(); }
/// <summary> /// Call to the shard set driver when a shardlet is copied from one shard to another. /// </summary> /// <param name="sourceShard">The source shard.</param> /// <param name="destinationShard">The destination shard.</param> /// <param name="shardSetConfig">The shard set configuration.</param> /// <param name="shardingKey">The distribution key.</param> /// <param name="uniqueProcessID">The unique process identifier.</param> public void CopyShardlet(ShardBase sourceShard, ShardBase destinationShard, ShardSetConfig shardSetConfig, string shardingKey, Guid uniqueProcessID) { throw new NotImplementedException(); }
private ReferenceTableUpdater GetReferenceTableUpdater(ShardBase shard) { return(new ReferenceTableUpdater(GetReferenceDataConnectionString(), shard, _settings, "AWSales")); }