Imports System.IO Imports System.Xml Imports ICSharpCode.SharpZipLib.Zip Imports ICSharpCode.SharpZipLib.Checksums Module Main Private _edkb10 As bms.Logging Private _settings As EDKB05.Common.Settings Private _month As String Sub Main() Try Console.WriteLine("Starte Batch, initialisiere settings und EDKB10...") _settings = New EDKB05.Common.Settings 'Initialisierung vom EDKB10 Logging Dim programId As Integer = Convert.ToInt32(_settings.GetValueByXPath("root/config/ProgramId", "value")) _edkb10 = New bms.Logging(programId, Common.Common.JobType.StartJob) Catch ex As Exception 'De Fall setti nie uufträtte -> fatal error in text file schriibe Dim writer As System.IO.StreamWriter writer = IO.File.AppendText("CATASTROPHICAL_ERROR.txt") writer.WriteLine(DateTime.Now + ": " + ex.Message + " " + ex.StackTrace) writer.Close() 'cancel execution weil ohni edkb10 eee nüüt lauft... Console.WriteLine("CATASTROPHICAL ERROR: settings und EDKB1010 konnten nicht initialisert werden: " & ex.Message & " " & ex.StackTrace) Exit Sub End Try Try 'erfolgreicher start in edkb10 melden _edkb10.Start() Dim runExplicit As Boolean runExplicit = Convert.ToBoolean(_settings.GetValueByXPath("root/config/ExplicitRun", "isEnabled")) Console.WriteLine("Explizit ausführen? " & runExplicit.ToString()) 'Check ob normal der letze Monat verwendet werden 'soll oder der explizit angegebene vom settings file If runExplicit Then 'explicit wert aus den settings nehmen _month = _settings.GetValueByXPath("root/config/ExplicitRun", "month") Else 'nötig weil ev year swtich '-3: definiert(gem hutter 2006-11-21) dass logs nach 3 monaten "archiviert" werden Dim lastMonth As DateTime = DateTime.Today.AddMonths(-3) Dim monthPart As String = lastMonth.Month 'guggen dass schön zweistellig ist If monthPart.Length = 1 Then monthPart = "0" & monthPart End If 'muss im format mm.yyyy sein _month = monthPart & "." & lastMonth.Year End If Console.WriteLine("Monat: " & _month) 'Alle Tabellen laden, welche gesichert werden sollen Dim dsJournalSaveTabellen As New DataSet DataAccess.GetTableList(dsJournalSaveTabellen) Console.WriteLine("Beginne mit Xml Generierung..." & Environment.NewLine) 'mindestens eine tabelle muss gesichert werden If EDKB05.Common.Tools.IsDataSetValid(dsJournalSaveTabellen) Then 'daten in xml exportieren und in zip verpacken GenerateFiles(dsJournalSaveTabellen) Else _edkb10.Log("Es sind keine Tabellen zum Sichern vorhanden", Common.Common.JournalEntryType.Information) Console.WriteLine("Es sind keine Tabellen zum Sichern vorhanden") End If Console.WriteLine(Environment.NewLine & "Xml Generierung abgeschlossen") Try 'alte Zip File löschen Console.WriteLine("Lösche alte Zip-Dateien...") DeleteOldZipFiles() 'alte journale löschen Console.WriteLine("Lösche alte Journale...") DataAccess.DelJournale() Catch ex As Exception _edkb10.Log("Journale löschen: Der Batch wurde ausgeführt, aber die alten Journale konnten nicht gelöscht werden. " & ex.Message & " " & ex.StackTrace, Common.Common.JournalEntryType.Warning) Console.WriteLine("Journale löschen: Der Batch wurde ausgeführt, aber die alten Journale konnten nicht gelöscht werden. " & ex.Message & " " & ex.StackTrace) End Try Try 'ok mails an konfigurierte receivers schicken Dim receiverList As XmlNode = _settings.GetNodeByXPath("root/config/Mail/Receivers") Dim receiver As XmlNode Dim mailer As New Common.Common 'subject und message generieren Dim subject As String = _settings.GetValueByXPath("root/config/Mail/Subject", "text") Dim message As String = "Der Batch wurde am " & DateTime.Now.ToShortDateString() & " " & DateTime.Now.ToShortTimeString() & " erfolgreich ausgeführt." For Each receiver In receiverList.ChildNodes 'mails mit edkb10 verschicken mailer.SendMail(receiver.Attributes("email").InnerText, subject, message) Console.WriteLine("Mail an " & receiver.Attributes("email").InnerText & " verschickt") Next Catch ex As Exception _edkb10.Log("Mails senden: Der Batch wurde ausgeführt, aber beim Mails verschicken ist ein Fehler aufgetreten: " & ex.Message & " " & ex.StackTrace, Common.Common.JournalEntryType.Warning) Console.WriteLine("Mails senden: Der Batch wurde ausgeführt, aber beim Mails verschicken ist ein Fehler aufgetreten: " & ex.Message & " " & ex.StackTrace) End Try Catch ex As Exception _edkb10.Log("Main.Main:" + ex.Message + " " + ex.StackTrace, Common.Common.JournalEntryType.Error) Console.WriteLine("Main.Main:" + ex.Message + " StackTrace:" + ex.StackTrace) Finally 'batch sauber beenden -> ende in edkb10 melden _edkb10.Ende() Console.WriteLine("Ende an EDKB10 gemeldet") End Try End Sub '''Holt die Daten aus der DB und generiert XML files, welche danach in ein '''ZIP gepackt werden '''Nachdem die Xml files in das Zip gepackt wurden, werden diese wieder gelöscht '''DataSet mit dem Tabellen, welche gesichert werden sollen Public Sub GenerateFiles(ByVal ds As DataSet) Try Dim row As DataRow 'Dim dsData As New DataSet Dim doc As New XmlDocument Dim journalNr As Integer, rowCount As Integer Dim xmlFileName As String, zipFileName As String 'zielordner erstellen Dim targetFolder As New DirectoryInfo(_settings.GetValueByXPath("root/config/TargetFolder", "path") & _month & "_temp/") If Not targetFolder.Exists Then targetFolder.Create() End If 'zip file erstellen zipFileName = targetFolder.Parent.FullName & "\" & _month & ".zip" If File.Exists(zipFileName) Then 'meldung dass file existerit, und nochher ombenänne Dim newZipName As String = zipFileName & "_" & DateTime.Today.Year & DateTime.Today.Month & DateTime.Today.Day & "_" & DateTime.Now.Hour & DateTime.Now.Minute _edkb10.Log("Die Datei " & zipFileName & " existiert bereits. Die bestehende Datei wird in " & newZipName & " umbenannt", Common.Common.JournalEntryType.Warning) 'existierende datei umbenennen File.Move(zipFileName, newZipName) End If Console.WriteLine("Erstelle Zip Datei " & zipFileName) 'zip object erstellen und compression festlegen Dim zipOutputStream As New ZipOutputStream(File.Create(zipFileName)) zipOutputStream.SetLevel(6) 'journal für diesen sicherungssatz erstellen DataAccess.InsJounal(zipFileName, _month, journalNr) Console.WriteLine("Journal mit der Id " & journalNr.ToString() & " erstellt") Dim dr As SqlClient.SqlDataReader Dim dtSchema As DataTable Dim sw As StreamWriter Dim columnCount As Integer Dim columnName As String 'jede row enthält eine tabelle von welcher exportiert werden soll For Each row In ds.Tables(0).Rows 'Counters resette columnCount = 0 columnName = "" rowCount = 0 Console.WriteLine("Daten von Tabelle " & row("TabellenName") & " laden...") 'daten für export aus db streamen dr = DataAccess.GetTableData(_month, row("DatumFeld"), row("TabellenName")) 'schema für column definitionen laden dtSchema = dr.GetSchemaTable() 'xml spechern xmlFileName = targetFolder.FullName & row("TabellenName") + ".xml" 'check ob miendestens ein eintrag vorhanden ist If dr.HasRows Then Console.WriteLine("Erstelle Xml Datei...") If File.Exists(xmlFileName) Then 'meldung dass file existerit, und nochher ombenänne Dim newXmlFileName As String = xmlFileName & "_TICKS_" & DateTime.Now.Ticks _edkb10.Log("Die Datei " & xmlFileName & " existiert bereits. Die bestehende Datei wird in " & newXmlFileName & " umbenannt. Die Tabelle " & row("TabellenName") & " ist demnach 2mal in der DB erfasst", Common.Common.JournalEntryType.Warning) 'existierende datei umbenennen File.Move(xmlFileName, newXmlFileName) End If 'Neues file erstellen sw = File.AppendText(xmlFileName) 'xml definitions stuff schriibe sw.WriteLine("") While dr.Read() 'tabledef schriibe sw.WriteLine("") 'alle columns durchgeheb While columnCount < dr.FieldCount 'name der spalte auslesen columnName = dtSchema.Rows(columnCount)(0) 'daten als xml in file schreiben sw.WriteLine("<" & columnName & ">") columnCount = columnCount + 1 End While 'ende des records schreiben sw.WriteLine("") columnCount = 0 rowCount = rowCount + 1 End While 'ende des ds schreiben und stream schliessen sw.WriteLine("") sw.Close() dr.Close() 'file zu zip archiv hinzufügen AddToZip(xmlFileName, zipOutputStream) Else 'es wurden keine daten exportiert _edkb10.Log("Die Tabelle " + row("TabellenName") + " hat keine Einträge welche gesichert werden müssen", Common.Common.JournalEntryType.Information) Console.WriteLine("Tabelle enthält keine Daten welche gesichert werden müssen") End If 'xml löschen File.Delete(xmlFileName) 'journalDetail eintrag erstellen DataAccess.InsJounalDetail(journalNr, row("TabellenName"), rowCount.ToString()) Next 'Zip stream klöse zipOutputStream.Finish() zipOutputStream.Close() 'temp verzeichnis löschen targetFolder.Refresh() If targetFolder.Exists Then Directory.Delete(targetFolder.FullName) Else _edkb10.Log("Der temporäre Ordner " + targetFolder.FullName + " welcher die Xml Output enthält existiert nicht und konnte desshalb nicht gelöscht werden.", Common.Common.JournalEntryType.Warning) End If 'log zeugs schreiben Console.WriteLine("ZIP Archiv für " + _month + " wurde erstellt.") _edkb10.Log("ZIP Archiv für " + _month + " wurde erstellt.", Common.Common.JournalEntryType.Information) 'sicherungssatz als vollständig in db markieren DataAccess.UpdJournalSetVollstaendig(journalNr) Catch ex As Exception Throw ex End Try End Sub '''Fügt ein File zu einem zipOuputStream hinzu ''' ''' Private Sub AddToZip(ByVal fileName As String, ByVal zipOutputStream As ZipOutputStream) Try Dim fileInfo As New FileInfo(fileName) Dim maximumBufferSize As Integer = 4096 Dim bytesRead As Integer = 0 Dim transferBuffer(maximumBufferSize) As Byte 'stream öffnen Dim fs As FileStream = File.OpenRead(fileInfo.FullName) 'buffersize setzen If (fs.Length > maximumBufferSize) Then ReDim transferBuffer(maximumBufferSize) Else ReDim transferBuffer(fs.Length) End If 'neuen zip eintrag erstellen Dim zipEntry As New ZipEntry(fileInfo.Name) 'default stuff setzen zipEntry.DateTime = DateTime.Now zipEntry.Size = fs.Length zipOutputStream.PutNextEntry(zipEntry) 'file stream in zip schreiben Do bytesRead = fs.Read(transferBuffer, 0, transferBuffer.Length) zipOutputStream.Write(transferBuffer, 0, bytesRead) Loop While (bytesRead > 0) fs.Close() Catch ex As Exception Throw ex End Try End Sub '''Löscht die alten Zip Files welche freigegeben wurden Private Sub DeleteOldZipFiles() Try Dim dsFileNameForDelete As New DataSet Dim row As DataRow DataAccess.GetFileNameForDeletet(dsFileNameForDelete) For Each row In dsFileNameForDelete.Tables(0).Rows If File.Exists(row("Filename")) Then File.Delete(row("Filename")) Console.WriteLine("Datei " & row("Filename") & " gelöscht.") End If Next Catch ex As Exception Throw ex End Try End Sub End Module