コード例 #1
0
        /// <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);
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        private bool PublishDacPac(ShardBase shard, ShardSetConfig shardSetConfig, string dacPacPath,
                                   string dacPacProfilePath)
        {
            var publisher = InstantiateDacPacPublisher(shard, shardSetConfig);

            return(publisher.PublishDacPac(dacPacPath, dacPacProfilePath));
        }
コード例 #4
0
 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;
 }
コード例 #5
0
 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
     });
 }
コード例 #6
0
 /// <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
     };
 }
コード例 #7
0
        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));
        }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
        /// <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();
        }
コード例 #10
0
        /// <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();
            }
        }
コード例 #11
0
        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]");
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        /// <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();
 }
コード例 #17
0
 private ReferenceTableUpdater GetReferenceTableUpdater(ShardBase shard)
 {
     return(new ReferenceTableUpdater(GetReferenceDataConnectionString(), shard, _settings, "AWSales"));
 }