コード例 #1
0
        public override void ExecuteCommand()
        {
            if (!String.IsNullOrEmpty(DatabaseName))
            {
                ConnectionString.InitialCatalog = DatabaseName;
            }
            Log.Info("Exporting {0} on {1} to {2}", ConnectionString.InitialCatalog, Util.GetDatabaseServerName(ConnectionString), DestinationStorage.Credentials.AccountName);

            string serverName = ConnectionString.DataSource;

            if (serverName.StartsWith("tcp:"))
            {
                serverName = serverName.Substring(4);
            }

            WASDImportExport.ImportExportHelper helper = new WASDImportExport.ImportExportHelper(Log)
            {
                EndPointUri  = SqlDacEndpoint.AbsoluteUri,
                DatabaseName = ConnectionString.InitialCatalog,
                ServerName   = serverName,
                UserName     = ConnectionString.UserID,
                Password     = ConnectionString.Password,
                StorageKey   = Convert.ToBase64String(DestinationStorage.Credentials.ExportKey())
            };

            // Prep the blob
            string blobUrl = null;

            if (!WhatIf)
            {
                var client    = DestinationStorage.CreateCloudBlobClient();
                var container = client.GetContainerReference(DestinationContainer);
                container.CreateIfNotExists();
                var blob = container.GetBlockBlobReference(ConnectionString.InitialCatalog + ".bacpac");
                if (blob.Exists())
                {
                    Log.Info("Skipping export of {0} because the blob already exists", blob.Name);
                }
                else
                {
                    Log.Info("Starting export to {0}", blob.Uri.AbsoluteUri);

                    // Export!
                    blobUrl = helper.DoExport(blob.Uri.AbsoluteUri, WhatIf);
                }
            }

            Log.Info("Export Complete");
        }
コード例 #2
0
        public override void ExecuteCommand()
        {
            var destClient    = DestinationStorage.CreateCloudBlobClient();
            var destContainer = destClient.GetContainerReference(DestinationContainer);

            // Iterate through the blobs
            int index = 0;
            var blobs = Util.EnumerateBlobs(Log, destContainer, Prefix ?? String.Empty);

            Parallel.ForEach(blobs, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 10
            }, blob =>
            {
                Interlocked.Increment(ref index);
                if (blob.CopyState.Status != CopyStatus.Pending)
                {
                    DateTime start = DateTime.UtcNow;
                    int counter    = 0;
                    while (blob.CopyState.Status == CopyStatus.Pending)
                    {
                        Thread.Sleep(1000);
                        counter++;
                        blob.FetchAttributes();

                        if (counter % 5 == 0)
                        {
                            Log.Info("{1}Waiting on {0} ...", blob.Name, counter > 5 ? "Still " : "");
                        }
                    }
                    if (counter > 2)
                    {
                        Log.Info("Copy of {0} has finished!", blob.Name);
                    }
                }
                index++;
            });

            Log.Info("{0} Copies Complete!", index);
        }
コード例 #3
0
        public override void ExecuteCommand()
        {
            var sourceClient    = SourceStorage.CreateCloudBlobClient();
            var sourceContainer = sourceClient.GetContainerReference(SourceContainer);

            if (!sourceContainer.Exists())
            {
                Log.Warn("No blobs in container!");
                return;
            }

            var destClient    = DestinationStorage.CreateCloudBlobClient();
            var destContainer = destClient.GetContainerReference(DestinationContainer);

            destContainer.CreateIfNotExists();

            Log.Info("Collecting blob names in {0} to copy to {1}", SourceStorage.Credentials.AccountName, DestinationStorage.Credentials.AccountName);
            var blobs = Util.CollectBlobs(
                Log,
                sourceContainer,
                Prefix ?? String.Empty,
                condition: b => (!PackageBlobsOnly || (!b.Name.StartsWith("/") && String.Equals(b.Name.ToLowerInvariant(), b.Name, StringComparison.Ordinal))),
                countEstimate: 140000);
            var count = blobs.Count;
            int index = 0;

            Parallel.ForEach(blobs, new ParallelOptions {
                MaxDegreeOfParallelism = 10
            }, blob =>
            {
                int currentIndex = Interlocked.Increment(ref index);
                var percentage   = (((double)currentIndex / (double)count) * 100);
                var destBlob     = destContainer.GetBlockBlobReference(blob.Name);

                try
                {
                    if (!destBlob.Exists() || Overwrite)
                    {
                        Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Started Async Copy of {0}.", blob.Name, currentIndex, count, percentage);
                        if (!WhatIf)
                        {
                            destBlob.StartCopyFromBlob(blob);
                        }
                    }
                    else
                    {
                        Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Blob already Exists", blob.Name, index, count, percentage);
                    }
                }
                catch (StorageException stex)
                {
                    if (stex.RequestInformation.HttpStatusCode == (int)HttpStatusCode.Conflict &&
                        stex.RequestInformation.ExtendedErrorInformation.ErrorCode == BlobErrorCodeStrings.PendingCopyOperation)
                    {
                        Log.Info("[{1:000000}/{2:000000}] ({3:000.00}%) Skipped {0}. Already being copied", blob.Name, index, count, percentage);
                    }
                }
                catch (Exception ex)
                {
                    Log.Error("Error processing {0}: {1}", blob.Name, ex.ToString());
                    throw;
                }
            });

            Log.Info("Copies started. Run checkblobcopies with similar parameters to wait on blob copy completion");
        }