public static string Extract(
string deploymentId,
DbConnection connection,
string schemaName,
string extractDirectoryPath,
bool disableVerification = false)
{
const string sql =
"SELECT " +
" AssemblyFileName " +
" , Binaries " +
" , Hashes " +
"FROM [{0}].[__DeploymentHistory] " +
"WHERE DeploymentId = @DeploymentId ";
var hasDeploymentHistoryTable = GetIsDeploymentHistoryTableExists(connection, schemaName);
if (!hasDeploymentHistoryTable)
{
return null;
}
DbCommand command = null;
DbDataReader reader = null;
try
{
command = connection.CreateCommand();
command.CommandText = string.Format(sql, schemaName);
var deploymentIdParam = command.CreateParameter();
deploymentIdParam.DbType = DbType.String;
deploymentIdParam.Direction = ParameterDirection.Input;
deploymentIdParam.ParameterName = "@DeploymentId";
deploymentIdParam.Value = deploymentId;
command.Parameters.Add(deploymentIdParam);
reader = command.ExecuteReader();
if (!reader.HasRows)
{
return null;
}
if (!reader.Read())
{
throw new Exception($"Couldn't read {schemaName} deployment history; deploymentId: {deploymentId}");
}
using (var zipArchive = new ZipArchive(reader.GetStream(1), ZipArchiveMode.Read))
{
ZipUtility.Unzip(extractDirectoryPath, zipArchive);
}
if (!disableVerification)
{
using (var hashesReader = new StreamReader(reader.GetStream(2)))
{
HashUtility.Verify(extractDirectoryPath, hashesReader, m_HashName);
}
}
var assemblyFilePath = Path.Combine(extractDirectoryPath, reader.GetString(0));
reader.Close();
return assemblyFilePath;
}
finally
{
reader.SafeDispose();
command.SafeDispose();
}
}