public Stream DeploySolutionPackage(Common.Solution solution, Stream messageBody) { String scope = solution.Name; try { //create temp dir String tempDir = Path.Combine(System.IO.Path.GetTempPath(), System.Guid.NewGuid().ToString()); System.IO.Directory.CreateDirectory(tempDir); //save stream to file String packagePath = System.IO.Path.Combine(tempDir, "package.zip"); using (FileStream tempZipFileStream = new FileStream(packagePath, FileMode.Create)) { messageBody.CopyTo(tempZipFileStream); } //unzip folder FileHelper.CreateUnzipFolder(packagePath, tempDir, "package"); //deploy metadata String metadatafile = System.IO.Path.Combine(tempDir, "package", "metadata.xml"); using (System.IO.FileStream fs = new FileStream(metadatafile, FileMode.Open)) { UploadMetadataInternal(solution, fs); } //deploy data String datafile = System.IO.Path.Combine(tempDir, "package", "data.xml"); UploadDataInternal(solution, null, false, false, null, datafile); //deploy resources String resource = System.IO.Path.Combine(tempDir, "package", "resource"); String resourceFolder = System.IO.Path.Combine(solution.SolutionFolder, "resource"); if (System.IO.Directory.Exists(resourceFolder)) { System.IO.Directory.Delete(resourceFolder, true); } System.IO.Directory.CreateDirectory(resourceFolder); DirectoryCopy.Copy(resource, resourceFolder, true); //apply resources new CodeFactory.Builder().Build(solution, true); return(Common.Utils.MakeTextAnswer("ok")); } catch (Exception e) { return(Common.Utils.MakeExceptionAnswer(e, scope)); } }
private void ArchiveFileSystemInternal(Common.Solution solution) { String tempFolder = System.IO.Path.Combine(System.IO.Path.GetTempPath(), Guid.NewGuid().ToString()); Directory.CreateDirectory(tempFolder); //we cant copy the entire "access" folder, "devices.txt" file should be excluded, so.. System.IO.Directory.CreateDirectory(System.IO.Path.Combine(tempFolder, "access")); String passFile = System.IO.Path.Combine(solution.SolutionFolder, @"access\password.txt"); if (System.IO.File.Exists(passFile)) { System.IO.File.Copy(passFile, System.IO.Path.Combine(tempFolder, @"access\password.txt")); } String licFile = System.IO.Path.Combine(solution.SolutionFolder, @"access\licenses.txt"); if (System.IO.File.Exists(licFile)) { System.IO.File.Copy(licFile, System.IO.Path.Combine(tempFolder, @"access\licenses.txt")); } //DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "access"), System.IO.Path.Combine(tempFolder, "access"), true); DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "bin"), System.IO.Path.Combine(tempFolder, "bin"), true); DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "code"), System.IO.Path.Combine(tempFolder, "code"), true); DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "configuration"), System.IO.Path.Combine(tempFolder, "configuration"), true); DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "database"), System.IO.Path.Combine(tempFolder, "database"), true); //DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "log"), System.IO.Path.Combine(tempFolder, "log"), true); DirectoryCopy.Copy(System.IO.Path.Combine(solution.SolutionFolder, "resource"), System.IO.Path.Combine(tempFolder, "resource"), true); string zippingFilePath = tempFolder + "Solution.zip"; FileHelper.CreateZipArchieve(tempFolder, zippingFilePath); UInt32 crc = Crc32.CRC(zippingFilePath); using (FileStream fs = new FileStream(zippingFilePath, FileMode.Open, FileAccess.Read)) { byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); using (SqlConnection conn = new SqlConnection(solution.ConnectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("SELECT CRC FROM [admin].[FileSystem] WHERE [Date] = (SELECT MAX([Date]) FROM [admin].[FileSystem])", conn)) { object crcLast = cmd.ExecuteScalar(); if (crcLast != null) { if (crc.ToString().Equals(crcLast.ToString())) { return; } } } using (SqlCommand cmd = new SqlCommand("INSERT INTO [admin].[FileSystem]([Date],[Data],[CRC]) VALUES(@Date,@Data,@CRC)", conn)) { cmd.Parameters.AddWithValue("@CRC", crc.ToString()); cmd.Parameters.AddWithValue("@Date", DateTime.UtcNow); SqlParameter p = new SqlParameter("@Data", SqlDbType.VarBinary, bytes.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, bytes); cmd.Parameters.Add(p); cmd.ExecuteNonQuery(); } } } }