using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xaml; using System.IO.Compression; using System.Diagnostics; using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Core; using KlassenBIB; using SanShared.Exceptions; namespace Database { public class Datenbank { public const string pfad = "./"; public string projekt; public static readonly Datenbank instance = new Datenbank(); public static Datenbank Instance { get { return instance; } } public KlassenBIB.Projekt loadedProjekt = null; public KlassenBIB.MainDataBase MainDatenbank = null; public KlassenBIB.DB TeufelDB = null; public Datenbank() { TeufelDB = new KlassenBIB.DB(); string filepath = ""; filepath = Path.Combine("./projekte", "TeufelDB.xaml"); if(File.Exists(filepath)) TeufelDB = XamlServices.Load("./projekte/TeufelDB.xaml") as KlassenBIB.DB; //Debugger.Break(); filepath = Path.Combine("./projekte","MainDatenbank.xaml"); if(File.Exists(filepath)) { MainDatenbank = XamlServices.Load(filepath) as KlassenBIB.MainDataBase; } else { MainDatenbank = new MainDataBase(); } } private string projektpfad = string.Empty; public bool LoadProjekt(string projekt, string projektpfad) { this.projekt = projekt; //UnPackProject("18-850","willyteufelchen"); //PackSystem("./projekte/18-850.zip", "./projekte/18-850","willyteufelchen"); string filepath = Path.Combine(projektpfad, string.Format("{0}.xaml", projekt)); this.projektpfad = filepath; if (File.Exists(filepath)) { File.Copy(filepath, string.Format("{0}_{1}_{2}.bak", filepath,DateTime.Now.ToShortDateString(),DateTime.Now.Ticks)); try { loadedProjekt = XamlServices.Load(filepath) as KlassenBIB.Projekt; } catch(XamlObjectWriterException ex) { if (ex.HResult.Equals(-2146233088)) throw new DataBaseVersionMismatchException(ex.Message); } } else loadedProjekt = new KlassenBIB.Projekt(); UpdateDatabase.UpdateNewGuids(); UpdateDatabase.TransferAuftraggeber(); UpdateDatabase.MakeNewDatabaseSystem(); UpdateDatabase.TransferSanierteObjekte(); return true; } public bool InitProjekt(Projekt projekt,string projektpfad) { this.projektpfad = Path.Combine(projektpfad,string.Format("{0}.xaml",projekt.Nummer)); loadedProjekt = projekt; SaveProjekt(); return true; } private void UnPackProject(string projekt, string password = "") { if (!Directory.Exists("./temp")) Directory.CreateDirectory("./temp"); ZipFile zf = null; try { FileStream fs = File.OpenRead(Path.Combine("projekte", string.Format("{0}.zip", projekt))); zf = new ZipFile(fs); if (!password.Equals("")) zf.Password = password; foreach(ZipEntry zipEntry in zf) { if (!zipEntry.IsFile) continue; string entryFileName = zipEntry.Name; byte[] buffer = new byte[4096]; Stream zipStream = zf.GetInputStream(zipEntry); string fullZipToPath = Path.Combine("./temp/", entryFileName); string directoryName = Path.GetDirectoryName(fullZipToPath); if (directoryName.Length > 0) Directory.CreateDirectory(directoryName); using (FileStream streamWriter = File.Create(fullZipToPath)) { StreamUtils.Copy(zipStream, streamWriter, buffer); } } } finally { if(zf != null) { zf.IsStreamOwner = true; zf.Close(); } } } public bool CreateProjekt(string projektnummer) { string filepath = Path.Combine(pfad, projektnummer); if (File.Exists(filepath)) return false; using (MemoryStream memoryStream = new MemoryStream()) { using (ZipArchive archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { var demoFile = archive.CreateEntry("daten/foo.txt"); using (var entryStream = demoFile.Open()) { XamlServices.Save(entryStream, loadedProjekt); } } using (var fileStream = new FileStream("./test.zip", FileMode.Create)) { memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.CopyTo(fileStream); } } return true; } private void PackSystem(string outPathName, string folderName, string password = "") { FileStream fsOut = File.Create(outPathName); ZipOutputStream zipStream = new ZipOutputStream(fsOut); zipStream.SetLevel(3); if (!password.Equals("")) zipStream.Password = password; int folderOffset = folderName.Length +(folderName.EndsWith("\\") ? 0 : 1); CompressFolder(folderName, zipStream, folderOffset); zipStream.IsStreamOwner = true; zipStream.Close(); } private void CompressFolder(string path, ZipOutputStream zipStream, int folderOffset) { string[] files = Directory.GetFiles(path); foreach(string filename in files) { FileInfo fi = new FileInfo(filename); string entryName = filename.Substring(folderOffset); entryName = ZipEntry.CleanName(entryName); ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = fi.LastWriteTime; newEntry.Size = fi.Length; zipStream.PutNextEntry(newEntry); byte[] buffer = new byte[4096]; using (FileStream streamReader = File.OpenRead(filename)) { StreamUtils.Copy(streamReader, zipStream, buffer); } zipStream.CloseEntry(); } string[] folders = Directory.GetDirectories(path); foreach(string folder in folders) { CompressFolder(folder, zipStream, folderOffset); } } public void Test() { using (MemoryStream memoryStream = new MemoryStream()) { using (var fileStream = new FileStream("./test.zip", FileMode.Open)) { fileStream.Seek(0, SeekOrigin.Begin); fileStream.CopyTo(memoryStream); } using (ZipArchive archive = new ZipArchive(memoryStream, ZipArchiveMode.Update, true)) { ZipArchiveEntry test = archive.CreateEntry("./datas/test.txt"); Debugger.Break(); } Debugger.Break(); } } public void SaveProjekt() { XamlServices.Save("./projekte/MainDatenbank.xaml", MainDatenbank); XamlServices.Save(projektpfad, loadedProjekt); XamlServices.Save("./projekte/TeufelDB.xaml", TeufelDB); } } }