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
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
|