private void writePowierzchniaToDB(ModelBundle modelDataBundle) { Model2D model = modelDataBundle.models[0]; //każda paczka zawiera tylko jeden model int newModelId = 0; modelIdsAfterRestoreDict.TryGetValue(model.idModel, out newModelId); model.setNewModelIdInPowierzchnia(newModelId); uint maxPowId = 0; string tableName = dbConnector.getTableNameFromQuery(SqlQueries.getPowierzchnieNoBlob); for (int i = 0; i < model.powierzchnieList.Count; i++) { ModelPowierzchnia pow = model.powierzchnieList[i]; dbWriter.writeBulkDataToDB(pow.powDataTable, tableName); if (i == 0) //analogicznie jak w przypadku wpisywania deklaracji modeli, po dodaniu pierwszej powierzchni odczytuję jej ID z bazy { maxPowId = getMaxPowierzchniaIdFromDB(); } else //kolejne ID tworzę sam { maxPowId++; } //w każdej powierzchni, w danych składowych tj trójkątów, punktów itd zmieniam ID powierzchni na nowy, w nowej bazie danych pow.idPow = maxPowId; //mając id aktualizuję PowObrys dbWriter.executeQuery("Update DefPowierzchni set PowObrys = '" + pow.powObrys + "'" + SqlQueries.getPowierzchnie_byIdPowFilter + pow.idPow); //zapisuję dane szczegółowe każdej powierzchni do bazy, tj. punkty, trójkąty itd //writePowierzchniaDataToDB(pow); } }
private void writeModelDeclarationsToDB(MyEventArgs args, ModelBundle modelDeclarationsFromFileBundle) { List <Model2D> models = modelDeclarationsFromFileBundle.models; Dictionary <string, ModelDirectory> checkedDirectories = modelDeclarationsFromFileBundle.checkedDirectories; int maxModelIdInDB = 0; string newDirectoryId = ""; string newIdWlasciciel = args.selectedUserId; bool restoreDirectoryTree = args.restoreDirectoryTree; string newCzyArch = "0"; //wczytywane modele nie będą archiwalne string newIdUzytk = "null"; //wczytywane modele nie będą oznaczone jako wczytane do pamięci dbWriter = new DBWriter(dbConnection); DBValueTypeConverter converter = new DBValueTypeConverter(); if (restoreDirectoryTree && checkedDirectories.Count > 0) { writeDirectoryTreeToDB(checkedDirectories, args.selectedDirectoryId); } //po kolei wpisuję deklaracje wszystkich modeli, po jednym, do tabeli DefModel2D int loopNumber = 0; foreach (Model2D model in models) { string nazwaModel = converter.getConvertedValue(model.nazwaModel, model.nazwaModel_dataType); string opisModel = converter.getConvertedValue(model.opisModel, model.opisModel_dataType); string dataModel = converter.getConvertedValue(model.dataModel, model.dataModel_dataType); if (restoreDirectoryTree && checkedDirectories.Count > 0) { newDirectoryId = model.modelDir.newId; } else { newDirectoryId = args.selectedDirectoryId; } string query = SqlQueries.insertModel.Replace("@nazwaModel", nazwaModel).Replace("@opisModel", opisModel).Replace("@dataModel", dataModel).Replace("@idUzytk", newIdUzytk).Replace("@czyArch", newCzyArch).Replace("@directoryId", newDirectoryId).Replace("@idWlasciciel", newIdWlasciciel); dbWriter.executeQuery(query); if (loopNumber == 0) //wpis modelu robię przez insert, baza danych automatycznie nadaje mu ID, które teraz odczytuję { maxModelIdInDB = getMaxModelIdFromDB(); } else { maxModelIdInDB++; //kolejne modele będą miały kolejne ID, nie muszę za każdym razem czytać tylko inkrementuję } //w każdym modelu w powierzchniach zmieniam Id modelu na nowy, w nowej bazie danych model.IdModelAfterRestore = maxModelIdInDB; modelIdsAfterRestoreDict.Add(model.idModel, model.IdModelAfterRestore); loopNumber++; } }
//tworzy plik a następnie zapisuje strukturę danych, tj deklaracje modeli i słownik katalogów private void initializeFile(string serializationFile) { ModelBundle modelBundle = new ModelBundle(); modelBundle.models = selectedModelDeclarations; modelBundle.checkedDirectories = directoryTreeControl1.checkedDirectories; try { //serialize using (FileStream stream = new FileStream(serializationFile, FileMode.Create)) { MemoryStream originalMemoryStream = new MemoryStream(); MemoryStream compressedMemoryStream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(originalMemoryStream, modelBundle); using (GZipStream gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Compress)) { originalMemoryStream.WriteTo(gzipStream); } byte[] buffer = compressedMemoryStream.ToArray(); int bufferSize = buffer.Length; compressedMemoryStream.Close(); originalMemoryStream.Close(); using (BinaryWriter binWriter = new BinaryWriter(stream)) { binWriter.Write(bufferSize); //pierwsze 4 bajty binWriter.Write(buffer); } } } catch (OutOfMemoryException exc) { MyMessageBox.display(exc.Message + "\r\nwriteModelsToFile"); } }
private void addModelToFile(string serializationFile, Model2D model) { ModelBundle modelDataBundle = new ModelBundle(); modelDataBundle.addModel(model); try { //serialize using (FileStream stream = new FileStream(serializationFile, FileMode.Open)) { MemoryStream originalMemoryStream = new MemoryStream(); MemoryStream compressedMemoryStream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(originalMemoryStream, modelDataBundle); using (GZipStream gzipStream = new GZipStream(compressedMemoryStream, CompressionMode.Compress)) { originalMemoryStream.WriteTo(gzipStream); originalMemoryStream.Close(); } byte[] buffer = compressedMemoryStream.ToArray(); int bufferSize = buffer.Length; compressedMemoryStream.Close(); using (BinaryWriter binWriter = new BinaryWriter(stream)) { stream.Position = stream.Length; binWriter.Write(bufferSize); //pierwsze 4 bajty binWriter.Write(buffer); } } } catch (OutOfMemoryException exc) { MyMessageBox.display(exc.Message + "\r\nwriteModelsToFile", MessageBoxType.Error); } }
//metoda uruchamiana w osobnym wątku private void writeModelsFromFileToDB(MyEventArgs args) { int streamPosition = 0; int dataPacketNumber = 0; int totalNumberOfPackets = 0; //do paska postępu ModelBundle modelDataBundle = new ModelBundle(); try { do { //deserialize using (FileStream stream = new FileStream(args.fileName, FileMode.Open)) { int dataPacketLength = 0; byte[] buffer; using (BinaryReader bReader = new BinaryReader(stream)) { stream.Position = streamPosition; dataPacketLength = bReader.ReadInt32(); //najpierw wpis 4 bajty określa długość paczki, która po nim następuje buffer = new byte[dataPacketLength]; bReader.Read(buffer, 0, dataPacketLength); } MemoryStream compressedStream = new MemoryStream(buffer); MemoryStream decompressedStream = new MemoryStream(); using (GZipStream gzipStream = new GZipStream(compressedStream, CompressionMode.Decompress)) { gzipStream.CopyTo(decompressedStream); compressedStream.Close(); } decompressedStream.Position = 0; BinaryFormatter bformatter = new BinaryFormatter(); modelDataBundle = (ModelBundle)bformatter.Deserialize(decompressedStream); if (dataPacketNumber == 0) { totalNumberOfPackets = modelDataBundle.models.Count; if (modelDataBundle.checkedDirectories.Count == 0 && args.selectedDirectoryId == "") { MyMessageBox.display("Nie można odtworzyć modeli gdyż nie wybrano katalogu docelowego \r\na modele w pliku źródłowym wczytane zostały bez katalogu.\r\nSpróbuj wczytać ponownie wybierając katalog docelowy", MessageBoxType.Error); break; } else { writeModelDeclarationsToDB(args, modelDataBundle); } } else { showProgress(dataPacketNumber, totalNumberOfPackets, modelDataBundle.models[0].nazwaModel.ToString()); //pasek postępu writePowierzchniaToDB(modelDataBundle); } decompressedStream.Close(); streamPosition += dataPacketLength + 4; //tj. przesuwam o nagłówek (int czyli 4 bajty) i długość właśnie przeczytanego pakietu modelDataBundle.clear(); dataPacketNumber++; } }while (dataPacketNumber <= totalNumberOfPackets); if (dataPacketNumber >= totalNumberOfPackets) //komunikat o sukcesie tylko wtedy, gdy cała pętla przeszła { MyMessageBox.displayAndClose("Modele wczytane", 1); } hideProgressItems(); //delegat refreshDirectoryTree(); //delegat } catch (ArgumentException ex) { MyMessageBox.display(ex.Message, MessageBoxType.Error); } catch (OutOfMemoryException exc) { MyMessageBox.display(exc.Message + "\r\nwriteModelsFromFileToDB", MessageBoxType.Error); } catch (EndOfStreamException exce) { MyMessageBox.display(exce.Message + "\r\nwriteModelsFromFileToDB \r\nPlik jest uszkodzony"); } }