From 64e750b2f031a7ef9dca2d56b3a86a6ea1b59df6 Mon Sep 17 00:00:00 2001 From: xieguigang Date: Sat, 19 Jun 2021 03:06:21 +0800 Subject: [PATCH] improvements of load driver file --- .../Expressions/Keywords/ImportDataDriver.vb | 27 +++++++++++++++++-- .../LINQ/Interpreter/Query/QueryExpression.vb | 2 +- LINQ/LINQ/Runtime/Registry.vb | 25 ++--------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/LINQ/LINQ/Interpreter/Expressions/Keywords/ImportDataDriver.vb b/LINQ/LINQ/Interpreter/Expressions/Keywords/ImportDataDriver.vb index 14747dd..26819e1 100644 --- a/LINQ/LINQ/Interpreter/Expressions/Keywords/ImportDataDriver.vb +++ b/LINQ/LINQ/Interpreter/Expressions/Keywords/ImportDataDriver.vb @@ -1,4 +1,6 @@ -Namespace Interpreter.Expressions +Imports Microsoft.VisualBasic.Language + +Namespace Interpreter.Expressions Public Class ImportDataDriver : Inherits KeywordExpression @@ -15,7 +17,28 @@ End Sub Public Overrides Function Exec(context As ExecutableContext) As Object - Throw New NotImplementedException() + If dllName.FileExists Then + Return dllName + End If + + Dim fileName As Value(Of String) = "" + Dim driver As String = dllName + + If driver.ExtensionSuffix <> "dll" Then + driver = $"{driver}.dll" + End If + + For Each dir As String In {App.HOME, App.CurrentDirectory} + If (fileName = $"{dir}/{driver}").FileExists Then + Return fileName + End If + Next + + Throw New BadImageFormatException($"driver module '{driver}' not found!") + End Function + + Public Overrides Function ToString() As String + Return $"load driver: {dllName}" End Function End Class End Namespace \ No newline at end of file diff --git a/LINQ/LINQ/Interpreter/Query/QueryExpression.vb b/LINQ/LINQ/Interpreter/Query/QueryExpression.vb index 75be55a..ef5376a 100644 --- a/LINQ/LINQ/Interpreter/Query/QueryExpression.vb +++ b/LINQ/LINQ/Interpreter/Query/QueryExpression.vb @@ -73,7 +73,7 @@ Namespace Interpreter.Query Dim registry As Registry = globalEnv.registry For Each name As ImportDataDriver In attaches - Call registry.Register(driver:=name.dllName) + Call registry.Register(driverDll:=name.Exec(context)) Next End Sub diff --git a/LINQ/LINQ/Runtime/Registry.vb b/LINQ/LINQ/Runtime/Registry.vb index 9cfc199..c478388 100644 --- a/LINQ/LINQ/Runtime/Registry.vb +++ b/LINQ/LINQ/Runtime/Registry.vb @@ -50,9 +50,8 @@ Namespace Runtime ReadOnly drivers As New Dictionary(Of String, IDriverLoader) - Public Sub Register(driver As String) - Dim dll As String = getDllFile(driver) - Dim assembly As Assembly = Assembly.LoadFile(dll) + Public Sub Register(driverDll As String) + Dim assembly As Assembly = Assembly.LoadFile(driverDll) For Each type As Type In From m As Type In assembly.GetTypes @@ -68,26 +67,6 @@ Namespace Runtime Next End Sub - Private Function getDllFile(driver As String) As String - If driver.FileExists Then - Return driver - End If - - Dim fileName As Value(Of String) = "" - - If driver.ExtensionSuffix <> "dll" Then - driver = $"{driver}.dll" - End If - - For Each dir As String In {App.HOME, App.CurrentDirectory} - If (fileName = $"{dir}/{driver}").FileExists Then - Return fileName - End If - Next - - Throw New BadImageFormatException($"driver module '{driver}' not found!") - End Function - Public Function GetTypeCodeName(type As Type) As String Select Case type Case GetType(Integer) : Return "i32"