You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
14 KiB

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
'''<summary>Holt die Daten aus der DB und generiert XML files, welche danach in ein
'''ZIP gepackt werden</summary>
'''<remarks>Nachdem die Xml files in das Zip gepackt wurden, werden diese wieder gelöscht</remarks>
'''<param name="ds">DataSet mit dem Tabellen, welche gesichert werden sollen</param>
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("<NewDataSet>")
While dr.Read()
'tabledef schriibe
sw.WriteLine("<TableData>")
'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 & "><![CDATA[" & dr(columnCount) & "]]></" & columnName & ">")
columnCount = columnCount + 1
End While
'ende des records schreiben
sw.WriteLine("</TableData>")
columnCount = 0
rowCount = rowCount + 1
End While
'ende des ds schreiben und stream schliessen
sw.WriteLine("</NewDataSet>")
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
'''<summary>Fügt ein File zu einem zipOuputStream hinzu</summary>
'''<param name="fileName"></param>
'''<param name="zipOutputStream"></param>
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
'''<summary>Löscht die alten Zip Files welche freigegeben wurden</summary>
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