Modules/Patterns/Modules/BaseModule.vb

120 lines
4.0 KiB
VB.net

Imports DigitalData.Modules.Logging
Imports System.Text.RegularExpressions
Namespace Modules
Public Class BaseModule
Friend ReadOnly Logger As Logger
Private ReadOnly MyRegex As Regex = New Regex("{#(\w+)#([\:\.\w\s_/-]+)}+")
Private ReadOnly SqlPhrases As New List(Of String) From {
"SELECT ", "UPDATE ", "DELETE ", "EXEC "
}
Private Const MAX_TRY_COUNT = 100
Public Sub New(pLogConfig As LogConfig)
Logger = pLogConfig.GetLogger()
End Sub
Public Sub IncrementCounterOrThrow(ByRef pCounter As Integer)
If pCounter >= MAX_TRY_COUNT Then
Throw New OverflowException("Max tries exceeded while replacing placeholders!")
End If
pCounter += 1
End Sub
Public Function ReplacePattern(pInput As String, pType As String, pReplacement As String) As String
Dim oElements As MatchCollection = MyRegex.Matches(pInput)
If IsNothing(pReplacement) Then
Return pInput
End If
Dim oIsSQL As Boolean = False
For Each oPhrase In SqlPhrases
If pInput.Contains(oPhrase) Then
oIsSQL = True
Exit For
End If
Next
If oIsSQL = True Then
Logger.Debug("Input string is most likely an SQL Query, masking quotes in replacement string.")
pReplacement = pReplacement.Replace("'", "''")
End If
For Each oElement As Match In oElements
' if group 1 contains the 'pattern' the replace whole group with 'replacement'
' and return it
If oElement.Groups(1).Value = pType Then
Logger.Debug("Replacing Placeholder with [{0}]", pReplacement)
Return Regex.Replace(pInput, oElement.Groups(0).Value, pReplacement)
End If
Next
' no replacement made
Return pInput
End Function
Public Function ContainsPatternAndValue(pInput As String, pType As String, pValue As String) As Boolean
Dim oElements As MatchCollection = MyRegex.Matches(pInput)
For Each oElement As Match In oElements
' Pattern in pInput
Dim oType As String = oElement.Groups(1).Value
Dim oValue As String = oElement.Groups(2).Value
If oType = pType And oValue = pValue Then
Return True
End If
Next
Return False
End Function
Public Function ContainsPattern(pInput As String, pType As String) As String
Dim oElements As MatchCollection = MyRegex.Matches(pInput)
For Each oElement As Match In oElements
Dim t As String = oElement.Groups(1).Value
If t = pType Then
Return True
End If
Next
Return False
End Function
Public Function HasPattern(pInput As String, pType As String) As Boolean
Dim oMatches = MyRegex.Matches(pInput)
For Each oMatch As Match In oMatches
For Each oGroup As Group In oMatch.Groups
If oGroup.Value = pType Then
Return True
End If
Next
Next
Return False
End Function
Public Function GetNextPattern(pInput As String, pType As String) As Pattern
Dim oElements As MatchCollection = MyRegex.Matches(pInput)
For Each oElement As Match In oElements
' Pattern in pInput
Dim oType As String = oElement.Groups(1).Value
Dim oValue As String = oElement.Groups(2).Value
If oType = pType Then
Return New Pattern(oType, oValue)
End If
Next
Return Nothing
End Function
End Class
End Namespace