コード例 #1
0
        protected override async Task ProcessRecordAsync()
        {
            if (Container != null)
            {
                Id = Container.ID;
            }

            if (ToContainer.ToBool())
            {
                var hostPaths = Path.SelectMany(path =>
                {
                    ProviderInfo provider;
                    var resolvedPaths = SessionState.Path.GetResolvedProviderPathFromPSPath(path, out provider);
                    if (provider.Name != "FileSystem")
                    {
                        throw new Exception(string.Format("The path {0} is not in the file system.", path));
                    }

                    return(resolvedPaths);
                }).ToList();

                var p = new ContainerPathStatParameters
                {
                    Path = Destination ?? "."
                };

                var progress = new Progress <string>();
                progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Sending {0}", s));

                using (var reader = Archiver.CreateTarStream(hostPaths, CmdletCancellationToken, progress))
                {
                    await DkrClient.Containers.ExtractArchiveToContainerAsync(Id, p, reader, CmdletCancellationToken);
                }
            }
            else
            {
                var hostPath = System.IO.Path.Combine(SessionState.Path.CurrentFileSystemLocation.Path, Destination ?? "");
                foreach (var singlePath in Path)
                {
                    var p = new GetArchiveFromContainerParameters
                    {
                        Path = singlePath
                    };

                    var response = await DkrClient.Containers.GetArchiveFromContainerAsync(Id, p, false, CmdletCancellationToken);

                    using (var stream = response.Stream)
                    {
                        var progress = new Progress <string>();
                        progress.ProgressChanged += (o, s) => WriteVerbose(string.Format("Extracting {0}", s));

                        var tarReader = new TarReader(stream);
                        await tarReader.ExtractDirectoryAsync(hostPath, CmdletCancellationToken, progress);
                    }
                }
            }
        }
コード例 #2
0
        public Task ExtractArchiveToContainerAsync(string id, ContainerPathStatParameters parameters, Stream stream, CancellationToken cancellationToken)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new ArgumentNullException(nameof(id));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            IQueryString queryParameters = new QueryString <ContainerPathStatParameters>(parameters);

            var data = new BinaryRequestContent(stream, "application/x-tar");

            return(this._client.MakeRequestAsync(new[] { NoSuchContainerHandler }, HttpMethod.Put, $"containers/{id}/archive", queryParameters, data, null, cancellationToken));
        }
コード例 #3
0
        public async Task Restore(string bakFilePath, string dbName)
        {
            string targetPath = "/var/tmp";

            // the only possibility to copy something into the container is the method ExtractArchiveToContainer
            // so we have to provide the backup as tar/gzipped stream
            using (var stream = CreateTarGz(bakFilePath))
            {
                var parameters = new ContainerPathStatParameters {
                    Path = targetPath, AllowOverwriteDirWithFile = true
                };
                await Client.Containers.ExtractArchiveToContainerAsync(ContainerId, parameters, stream);
            }

            using (IDbConnection connection = CreateConnection())
            {
                connection.Open();

                using (var restoreCommand = connection.CreateCommand())
                {
                    restoreCommand.CommandText = "USE master";
                    restoreCommand.ExecuteNonQuery();
                }

                string logicalDataName = "";
                string logicalLogName  = "";
                using (var fileListCommand = connection.CreateCommand())
                {
                    fileListCommand.CommandText = $"RESTORE FILELISTONLY FROM DISK = N'{targetPath}/{Path.GetFileName(bakFilePath)}'";
                    using (var reader = fileListCommand.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            int typeOrdinal        = reader.GetOrdinal("Type");
                            int logicalNameOrdinal = reader.GetOrdinal("LogicalName");
                            if (reader.GetString(typeOrdinal) == "D")
                            {
                                logicalDataName = reader.GetString(logicalNameOrdinal);
                            }

                            if (reader.GetString(typeOrdinal) == "L")
                            {
                                logicalLogName = reader.GetString(logicalNameOrdinal);
                            }
                        }
                    }
                }

                using (var restoreCommand = connection.CreateCommand())
                {
                    var restoreCommandCommandText
                        = $"RESTORE DATABASE [{dbName}] FROM  DISK = N'{targetPath}/{Path.GetFileName(bakFilePath)}' " +
                          "WITH FILE = 1, " +
                          $"MOVE N'{logicalDataName}' TO N'/var/opt/mssql/data/{dbName}_data.mdf', " +
                          $"MOVE N'{logicalLogName}' TO N'/var/opt/mssql/data/{dbName}_log.ldf', " +
                          "NOUNLOAD, REPLACE ";

                    restoreCommand.CommandText = restoreCommandCommandText;
                    restoreCommand.ExecuteNonQuery();
                }
            }
        }