Imports System.Collections.Generic
Console.WriteLine(String.Join("-",new String(50) {}))
dim results As DataTable = RunSql("history")
Dim list as New List(Of HistoryItem)
For Each row As DataRow In results.Rows()
list.Add(GetQueuedHistoryItem(row))
Console.WriteLine("Error building queued history item.", ex)
For Each hi As HistoryItem in list
Console.Write(hi.ID & " - ")
Console.Write(hi.Destination & " - ")
Console.Write(hi.Source & " - ")
Console.WriteLine(hi.Status & ":")
For Each li As LogItem in hi.Logs
Console.WriteLine(li.MessageTail)
Console.WriteLine(String.Join("-",new String(50) {}))
Private Function GetQueuedHistoryItem(row As DataRow) As HistoryItem
Dim _historyitem As New HistoryItem()
.ID = row("HistoryItemID").ToString()
.TaskID = row("TaskID").ToString()
.StartTime = Date.Parse(row("StartTime").ToString())
.FinishTime = Date.Parse(row("FinishTime").ToString())
.Type = CInt(row("Type"))
.Source = row("Source").ToString()
.Destination = row("Destination").ToString()
.Status = CInt(row("Status"))
.Logs = GetQueuedLogs(.ID)
Private Function GetLogItem(row As DataRow) As LogItem
Dim _logitem As New LogItem
.MessageCode = CUInt(row("MessageCode"))
.MessageTail = row("MessageTail").ToString()
.ModuleName = row("ModuleName").ToString()
.Time = row("Time").ToString()
Private Function GetQueuedLogs(HistoryItemID As String) As List(Of LogItem)
Dim result As DataTable = RunSql("logs")
If result Is Nothing Then Return New List(Of LogItem)
Dim list As New List(Of LogItem)
For Each row As DataRow In result.Rows()
list.Add(GetLogItem(row))
LogException(String.Format("Error building LogItem from HistoryItem ID: {0}", HistoryItemID), ex)
LogException(String.Format("Error getting list of LogItems from HistoryItem ID: {0}", HistoryItemID), ex)
Return New List(Of LogItem)
Sub LogException (str As String,ex As Exception)
Console.WriteLine(str & "---" & ex.Message)
Public Function RunSql(type as String) As DataTable
Dim dt As new DataTable()
dt.Columns.Add("HistoryItemID")
dt.Columns.Add("Time",Date.Now().GetType())
dt.Columns.Add("MessageCode",1.GetType())
dt.Columns.Add("MessageTail")
dt.Columns.Add("ModuleName")
dt.Columns.Add("StartTimeTicks")
dt.Rows.Add("852AAFC9-EC73-4D07-AFCA-8C62AF275677", "22-Jun-2017 01:00:00", 100, "service (build 59) started job by incremental trigger", "service", "636336900000000000")
dt.Columns.Add("HistoryItemID")
dt.Columns.Add("StartTime",Date.Now().GetType())
dt.Columns.Add("FinishTime",Date.Now().GetType())
dt.Columns.Add("Type",1.GetType())
dt.Columns.Add("Status",1.GetType())
dt.Columns.Add("Destination")
dt.Columns.Add("StartTimeTicks")
dt.Rows.Add("852AAFC9-EC73-4D07-AFCA-8C62AF275677","69ABFD36-CC7E-45E5-A3B5-3545AC1A2A31", "2017-06-22 01:00:00", "2017-06-22 01:00:29", 1, 9, " (C:\) NTFS", "\\jccbdr01\ShadowProtect\jccit01\C_VOL-b001-i179.spi", "636336900000000000")
dt.Rows.Add("4F59E9FE-D9DB-4EA1-A444-B1C4B91F6D9B","69ABFD36-CC7E-45E5-A3B5-3545AC1A2A31", "2017-06-22 01:00:00", "2017-06-22 01:00:29", 1, 9, " (C:\) NTFS", "\\jccbdr01\ShadowProtect\jccit01\C_VOL-b001-i179.spi", "636336900000000000")
dt.Rows.Add("CC2F7306-0CD9-4296-B3A9-6A6340EEE86A","69ABFD36-CC7E-45E5-A3B5-3545AC1A2A31", "2017-06-22 01:00:00", "2017-06-22 01:00:29", 1, 9, " (C:\) NTFS", "\\jccbdr01\ShadowProtect\jccit01\C_VOL-b001-i179.spi", "636336900000000000")
dt.Rows.Add("30500F3A-A94E-4C7D-AB29-2838DDA9606C","69ABFD36-CC7E-45E5-A3B5-3545AC1A2A31", "2017-06-22 01:00:00", "2017-06-22 01:00:29", 1, 9, " (C:\) NTFS", "\\jccbdr01\ShadowProtect\jccit01\C_VOL-b001-i179.spi", "636336900000000000")
dt.Rows.Add("E4F3AA09-5A64-463E-8D60-CBA7431B2FFF","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
dt.Rows.Add("5EBB6536-FC43-47C7-85F9-B37689CE82B7","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
dt.Rows.Add("C4E091EF-8370-4E4C-A2B3-04604B7DF309","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
dt.Rows.Add("6F7C0300-CB7B-4D1D-BF07-AC675D5493CD","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
dt.Rows.Add("8C04DF35-E6C4-422E-AD71-B8CD34C3B603","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
dt.Rows.Add("3C6EA055-4034-4CF5-B5F6-1A0A8D1F1E2D","9D50936F-7C2F-4060-BEC7-A864CA78683C", "2017-06-22 01:00:29", "2017-06-22 01:00:30", 1, 9, "Recovery NTFS", "\\jccbdr01\ShadowProtect\jccit01\Recovery_VOL-b001-i179.spi", "636336900290000000")
Property TaskID As String
Property StartTime As Date
ReadOnly Property StartTimeTicks As Long
Property FinishTime As Date
Property Source As String
Property Destination As String
Property Status As Integer
Property Logs As List(Of LogItem)
Private Sub AddDifference(ByRef Differences As Dictionary(Of String, Object), ByVal Key As PropertyKeys, ByVal Data As Object)
Differences.Add(CInt(Key).ToString(), Data)
Public Function GetDifferences(NewData As HistoryItem, LogDifferences As List(Of SerializedModel), Optional NewItem As Boolean = False) As Dictionary(Of String, Object)
Dim differences As New Dictionary(Of String, Object)
For Each SP_Log As LogItem In NewData.Logs
LogDifferences.Add(New SerializedModel(ActionID.Create, ID, SP_Log.GetDictionary(ID)))
For Each SP_Log As LogItem In NewData.Logs
Dim newlog As Boolean = True
For Each DB_Log As LogItem In Logs
If DB_Log.Equals(SP_Log) Then
LogDifferences.Add(New SerializedModel(ActionID.Create, ID, SP_Log.GetDictionary(ID)))
If TaskID <> NewData.TaskID OrElse
StartTime <> NewData.StartTime OrElse
FinishTime <> NewData.FinishTime OrElse
Type <> NewData.Type OrElse
Status <> NewData.Status OrElse
Source <> NewData.Source OrElse
Destination <> NewData.Destination Then
AddDifference(differences, PropertyKeys.HistoryItemID, NewData.ID)
AddDifference(differences, PropertyKeys.TaskID, NewData.TaskID)
AddDifference(differences, PropertyKeys.StartTime, NewData.StartTime)
AddDifference(differences, PropertyKeys.StartTimeTicks, NewData.StartTimeTicks)
AddDifference(differences, PropertyKeys.FinishTime, NewData.FinishTime)
AddDifference(differences, PropertyKeys.Type, NewData.Type)
AddDifference(differences, PropertyKeys.Status, NewData.Status)
AddDifference(differences, PropertyKeys.Source, NewData.Source)
AddDifference(differences, PropertyKeys.Destination, NewData.Destination)
Public Class SerializedModel
Public Sub New(ActionID As ActionID, ItemID As String, Differences As Dictionary(Of String, Object))
Me.Differences = Differences
Property ActionID As ActionID
Property ItemID As String
Property Differences As New Dictionary(Of String, Object)()
Property MessageCode As UInteger
Property MessageTail As String
Property ModuleName As String
Property HistoryItemID As String
ReadOnly Property StartTimeTicks As Long
Return CType(Time, Date).Ticks
ReadOnly Property TimeDate As Date
Dim d As Date = Date.MinValue
ReadOnly Property Type As LogItemType
Return LogItemType.LogError
ElseIf MessageCode < 300 Then
Return LogItemType.Informational
ElseIf MessageCode < 500 Then
Return LogItemType.Warning
ElseIf MessageCode < 600 Then
Return LogItemType.LogError
Return LogItemType.Informational
ReadOnly Property LogItemImage As String
Case LogItemType.Informational
iconpath = "/StorageCraftPlugin;component/Resources/Icons/Symbols/16/Information_16.png"
iconpath = "/StorageCraftPlugin;component/Resources/Icons/Symbols/16/Warning_16.png"
Case LogItemType.LogError
iconpath = "/StorageCraftPlugin;component/Resources/Icons/Symbols/16/Delete_16.png"
iconpath = "/StorageCraftPlugin;component/Resources/Icons/Symbols/16/Delete_16.png"
Public Sub New(message As String, timestamp As String, code As UInteger, name As String)
Private Sub AddDifference(ByRef Differences As Dictionary(Of String, Object), ByVal Key As PropertyKeys, ByVal Data As Object)
Differences.Add(CInt(Key).ToString(), Data)
Public Function GetDictionary(HistoryItemID As String) As Dictionary(Of String, Object)
Dim dic As New Dictionary(Of String, Object)
AddDifference(dic, PropertyKeys.Time, Time)
AddDifference(dic, PropertyKeys.MessageCode, MessageCode)
AddDifference(dic, PropertyKeys.MessageTail, MessageTail)
AddDifference(dic, PropertyKeys.ModuleName, ModuleName)
AddDifference(dic, PropertyKeys.HistoryItemID, HistoryItemID)
AddDifference(dic, PropertyKeys.StartTimeTicks, StartTimeTicks)
Public Overrides Function Equals(obj As Object) As Boolean
If obj Is Nothing OrElse Not Me.GetType() Is obj.GetType() Then Return False
Dim l As LogItem = CType(obj, LogItem)
If l.TimeDate <> TimeDate Then Return False
If l.MessageCode <> MessageCode Then Return False
If l.MessageTail <> MessageTail Then Return False
If l.ModuleName <> ModuleName Then Return False