Zooflow: Load searches from Database

This commit is contained in:
Jonathan Jenne
2022-06-14 13:38:13 +02:00
parent 84e29c2c0a
commit cb9dc34d9f
3 changed files with 120 additions and 149 deletions

View File

@@ -2,49 +2,34 @@
Imports System.Xml.Serialization
Imports DevExpress.Utils
Imports DevExpress.Utils.Svg
Imports DigitalData.GUIs.ZooFlow.frmSearchFlow
Imports DigitalData.GUIs.ZooFlow.Search.SearchToken
Imports DigitalData.Modules.Base
Imports DigitalData.Modules.Config
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.Language
Imports System.Reflection
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.ZooFlow.State
Namespace Search
Public Class SearchLoader
Inherits BaseClass
Private Const CUSTOM_SEARCH_DIRECTORY = "Searches"
Private ReadOnly Images As SvgImageCollection
Private ReadOnly ImageTable As List(Of ImageTableItem)
Private ReadOnly Config As ConfigManager(Of SystemConfig)
Private ReadOnly Serializer As XmlSerializer
Private ReadOnly Database As MSSQLServer
Private ReadOnly UserState As UserState
Public Sub New(pLogConfig As LogConfig, pConfig As ConfigManager(Of SystemConfig), pSvgImages As SvgImageCollection)
Public Sub New(pLogConfig As LogConfig, pDatabase As MSSQLServer, pUserState As UserState, pSvgImages As SvgImageCollection)
MyBase.New(pLogConfig)
Images = pSvgImages
ImageTable = GetImageTable(pSvgImages)
Config = pConfig
Database = pDatabase
UserState = pUserState
Serializer = New XmlSerializer(GetType(SavedSearch.CustomSearchSerializable))
End Sub
Public Function GetSearchDirectoryPath() As String
Dim oConfigPath As String = Config.UserConfigPath
Dim oConfigDirectory As String = IO.Path.Combine(IO.Path.GetDirectoryName(oConfigPath), CUSTOM_SEARCH_DIRECTORY)
If IO.Directory.Exists(oConfigDirectory) = False Then
Try
IO.Directory.CreateDirectory(oConfigDirectory)
Catch ex As Exception
Logger.Error(ex)
End Try
End If
Return oConfigDirectory
End Function
Public Sub CreateCustomSearch(pTitle As String, pDescription As String, pTokens As List(Of Token), pImage As String)
Dim oSearch As New SavedSearch.CustomSearch With {
.Name = pTitle,
@@ -54,11 +39,18 @@ Namespace Search
}
Try
Dim oSlug = Utils.ConvertTextToSlug(pTitle)
Dim oFilePath As String = IO.Path.Combine(GetSearchDirectoryPath(), $"{oSlug}.xml")
Dim oBuffer As Byte() = SerializeSearch(oSearch)
Dim oBase64 = System.Convert.ToBase64String(oBuffer)
File.WriteAllBytes(oFilePath, oBuffer)
If Database.ExecuteNonQuery(
$"INSERT INTO TBIDB_SEARCH_DEFINITION (TITLE, DESCRIPTION, XML_VALUE, SYS_SEARCH, ADDED_WHO)
VALUES ('{pTitle}', '{pDescription}', '{oBase64}', 0, '{UserState.UserName}')"
) = True Then
Dim oSearchId = Database.GetScalarValue("SELECT MAX(GUID) FROM TBIDB_SEARCH_DEFINITION")
Database.ExecuteNonQuery(
$"INSERT INTO TBIDB_SEARCH_DEF_RELATIONS (SEARCH_ID, USR_ID, ADDED_WHO)
VALUES ({oSearchId}, {UserState.UserId}, '{UserState.UserName}')")
End If
Catch ex As Exception
Logger.Warn("Custom Search could not be saved!")
Logger.Error(ex)
@@ -78,13 +70,18 @@ Namespace Search
Public Function LoadCustomSearches() As List(Of SavedSearch.SavedSearch)
Dim oSearches As New List(Of SavedSearch.SavedSearch)
Dim oPath = GetSearchDirectoryPath()
Dim oSQL As String = $"
SELECT DEF.*
FROM [TBIDB_SEARCH_DEFINITION] DEF
JOIN [TBIDB_SEARCH_DEF_RELATIONS] REL ON REL.SEARCH_ID = DEF.GUID
WHERE REL.USR_ID = {UserState.UserId}
"
Dim oTable = Database.GetDatatable(oSQL)
Dim oFiles = Directory.GetFiles(oPath, "*.xml")
For Each oFile In oFiles
Dim oBytes = File.ReadAllBytes(oFile)
Dim oSearch = DeserializeSearch(oBytes)
For Each oRow As DataRow In oTable.Rows
Dim oBase64 = oRow.Item("XML_VALUE")
Dim oBuffer = System.Convert.FromBase64String(oBase64)
Dim oSearch = DeserializeSearch(oBuffer)
oSearches.Add(oSearch)
Next
@@ -215,9 +212,5 @@ Namespace Search
Image = pImage
End Sub
End Class
End Class
End Namespace