From 7ec326d57bc58f306791317cf5ec701311c01681 Mon Sep 17 00:00:00 2001 From: "nick.yi" Date: Wed, 4 Feb 2026 09:29:47 +0800 Subject: [PATCH 1/3] optimize ExecuteQueryFn,SqlSelctFn --- .../Functions/ExecuteQueryFn.cs | 56 ++---- .../Functions/SqlSelect.cs | 168 ------------------ .../Functions/SqlSelectFn.cs | 58 ++++++ .../Services/SqlExecuteService.cs | 158 ++++++++++++++++ .../SqlDriverPlugin.cs | 1 + 5 files changed, 230 insertions(+), 211 deletions(-) delete mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlExecuteService.cs diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs index 89a5e142c..c31a5c35a 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs @@ -1,11 +1,3 @@ -using BotSharp.Core.Infrastructures; -using Dapper; -using Microsoft.Data.SqlClient; -using Microsoft.Data.Sqlite; -using MySqlConnector; -using Npgsql; -using System.Text; - namespace BotSharp.Plugin.SqlDriver.Functions; public class ExecuteQueryFn : IFunctionCallback @@ -13,13 +5,18 @@ public class ExecuteQueryFn : IFunctionCallback public string Name => "execute_sql"; public string Indication => "Performing data retrieval operation."; private readonly SqlDriverSetting _setting; + private readonly SqlExecuteService _sqlExecuteService; private readonly IServiceProvider _services; private readonly ILogger _logger; - public ExecuteQueryFn(IServiceProvider services, SqlDriverSetting setting, ILogger logger) + public ExecuteQueryFn(IServiceProvider services, + SqlDriverSetting setting, + SqlExecuteService sqlExecuteService, + ILogger logger) { _services = services; _setting = setting; + _sqlExecuteService = sqlExecuteService; _logger = logger; } @@ -38,14 +35,15 @@ public async Task Execute(RoleDialogModel message) IEnumerable results = []; try { - results = dbType.ToLower() switch + results = await (dbType.ToLower() switch { - "mysql" => RunQueryInMySql(dbConnectionString, args.SqlStatements), - "sqlserver" or "mssql" => RunQueryInSqlServer(dbConnectionString, args.SqlStatements), - "redshift" => RunQueryInRedshift(dbConnectionString, args.SqlStatements), - "sqlite" => RunQueryInSqlite(dbConnectionString, args.SqlStatements), + "mysql" => _sqlExecuteService.RunQueryInMySql(dbConnectionString, args.SqlStatements), + "sqlserver" or "mssql" => _sqlExecuteService.RunQueryInSqlServer(dbConnectionString, args.SqlStatements), + "redshift" => _sqlExecuteService.RunQueryInRedshift(dbConnectionString, args.SqlStatements), + "sqlite" => _sqlExecuteService.RunQueryInSqlite(dbConnectionString, args.SqlStatements), + "mongodb" => _sqlExecuteService.RunQueryInMongoDb(dbConnectionString, args.SqlStatements.FirstOrDefault(), []), _ => throw new NotImplementedException($"Database type {dbType} is not supported.") - }; + }); if (args.SqlStatements.Length == 1 && args.SqlStatements[0].StartsWith("DROP TABLE")) { @@ -215,34 +213,6 @@ private string EscapeMarkdownField(string field) return field.Replace("|", "\\|"); } - private IEnumerable RunQueryInMySql(string connectionString, string[] sqlTexts) - { - var settings = _services.GetRequiredService(); - using var connection = new MySqlConnection(connectionString); - return connection.Query(string.Join(";\r\n", sqlTexts)); - } - - private IEnumerable RunQueryInSqlServer(string connectionString, string[] sqlTexts) - { - var settings = _services.GetRequiredService(); - using var connection = new SqlConnection(connectionString); - return connection.Query(string.Join("\r\n", sqlTexts)); - } - - private IEnumerable RunQueryInRedshift(string connectionString, string[] sqlTexts) - { - var settings = _services.GetRequiredService(); - using var connection = new NpgsqlConnection(connectionString); - return connection.Query(string.Join("\r\n", sqlTexts)); - } - - private IEnumerable RunQueryInSqlite(string connectionString, string[] sqlTexts) - { - var settings = _services.GetRequiredService(); - using var connection = new SqliteConnection(connectionString); - return connection.Query(string.Join("\r\n", sqlTexts)); - } - private async Task RefineSqlStatement(RoleDialogModel message, ExecuteQueryArgs args) { if (args.Tables == null || args.Tables.Length == 0) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs deleted file mode 100644 index b31a74516..000000000 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelect.cs +++ /dev/null @@ -1,168 +0,0 @@ -using Microsoft.Data.SqlClient; -using MySqlConnector; -using Npgsql; -using MongoDB.Driver; -using MongoDB.Bson; -using static Dapper.SqlMapper; - -namespace BotSharp.Plugin.SqlDriver.Functions; - -public class SqlSelect : IFunctionCallback -{ - public string Name => "sql_select"; - private readonly IServiceProvider _services; - private readonly SqlDriverSetting _settings; - - public SqlSelect(IServiceProvider services, SqlDriverSetting settings) - { - _settings = settings; - _services = services; - } - - public async Task Execute(RoleDialogModel message) - { - var args = JsonSerializer.Deserialize(message.FunctionArgs); - - if (args.GeneratedWithoutTableDefinition) - { - message.Content = $"Get the table definition first."; - return false; - } - - // check if need to instantely - var dbHook = _services.GetRequiredService(); - var dbType = dbHook.GetDatabaseType(message); - var dbConnectionString = dbHook.GetConnectionString(message) ?? - _settings.Connections.FirstOrDefault(c => c.DbType == dbType)?.ConnectionString ?? - throw new Exception("database connectdion is not found"); - - var result = dbType switch - { - "mysql" => RunQueryInMySql(dbConnectionString, args), - "sqlserver" or "mssql" => RunQueryInSqlServer(dbConnectionString, args), - "redshift" => RunQueryInRedshift(dbConnectionString, args), - "mongodb" => RunQueryInMongoDb(dbConnectionString, args), - _ => throw new NotImplementedException($"Database type {dbType} is not supported.") - }; - - if (result == null) - { - message.Content = "Record not found"; - } - else - { - if (dbType == "mongodb") message.StopCompletion = true; - message.Content = JsonSerializer.Serialize(result); - args.Return.Value = message.Content; - } - - return true; - } - - private IEnumerable RunQueryInMySql(string connectionString, SqlStatement args) - { - using var connection = new MySqlConnection(connectionString); - var dictionary = new Dictionary(); - foreach (var p in args.Parameters) - { - dictionary["@" + p.Name] = p.Value; - } - return connection.Query(args.Statement, dictionary); - } - - private IEnumerable RunQueryInSqlServer(string connectionString, SqlStatement args) - { - using var connection = new SqlConnection(connectionString); - var dictionary = new Dictionary(); - foreach (var p in args.Parameters) - { - dictionary["@" + p.Name] = p.Value; - } - return connection.Query(args.Statement, dictionary); - } - - private IEnumerable RunQueryInRedshift(string connectionString, SqlStatement args) - { - using var connection = new NpgsqlConnection(connectionString); - var dictionary = new Dictionary(); - foreach (var p in args.Parameters) - { - dictionary["@" + p.Name] = p.Value; - } - return connection.Query(args.Statement, dictionary); - } - - private IEnumerable RunQueryInMongoDb(string connectionString, SqlStatement args) - { - var client = new MongoClient(connectionString); - - // Normalize multi-line query to single line - var statement = Regex.Replace(args.Statement.Trim(), @"\s+", " "); - - // Parse MongoDB query: database.collection.find({query}).projection({}).sort({}).limit(100) - var match = Regex.Match(statement, - @"^([^.]+)\.([^.]+)\.find\s*\((.*?)\)(.*)?$", - RegexOptions.Singleline); - - if (!match.Success) - return ["Invalid MongoDB query format. Expected: database.collection.find({query})"]; - - var queryJson = ApplyParameters(match.Groups[3].Value.Trim(), args.Parameters); - - try - { - var database = client.GetDatabase(match.Groups[1].Value); - var collection = database.GetCollection(match.Groups[2].Value); - - var filter = string.IsNullOrWhiteSpace(queryJson) || queryJson == "{}" - ? Builders.Filter.Empty - : BsonDocument.Parse(queryJson); - - var findFluent = collection.Find(filter); - findFluent = ApplyChainedOperations(findFluent, match.Groups[4].Value); - - return findFluent.ToList().Select(doc => BsonTypeMapper.MapToDotNetValue(doc)); - } - catch (Exception ex) - { - return [$"Invalid MongoDB query: {ex.Message}"]; - } - } - - private string ApplyParameters(string query, Models.SqlParameter[] parameters) - { - foreach (var p in parameters) - query = query.Replace($"@{p.Name}", p.Value?.ToString() ?? "null"); - return query; - } - - private IFindFluent ApplyChainedOperations( - IFindFluent findFluent, string chainedOps) - { - if (string.IsNullOrWhiteSpace(chainedOps)) return findFluent; - - // Apply projection - var projMatch = Regex.Match(chainedOps, @"\.projection\s*\((.*?)\)", RegexOptions.Singleline); - if (projMatch.Success) - findFluent = findFluent.Project(BsonDocument.Parse(projMatch.Groups[1].Value.Trim())); - - // Apply sort - var sortMatch = Regex.Match(chainedOps, @"\.sort\s*\((.*?)\)", RegexOptions.Singleline); - if (sortMatch.Success) - findFluent = findFluent.Sort(BsonDocument.Parse(sortMatch.Groups[1].Value.Trim())); - - // Apply limit - var limitMatch = Regex.Match(chainedOps, @"\.limit\s*\((\d+)\)"); - if (limitMatch.Success && int.TryParse(limitMatch.Groups[1].Value, out var limit)) - { - findFluent = findFluent.Limit(limit); - } - else - { - findFluent = findFluent.Limit(10); - } - - return findFluent; - } - -} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs new file mode 100644 index 000000000..4cf2a7da7 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs @@ -0,0 +1,58 @@ +namespace BotSharp.Plugin.SqlDriver.Functions; + +public class SqlSelectFn : IFunctionCallback +{ + public string Name => "sql_select"; + private readonly IServiceProvider _services; + private readonly SqlExecuteService _sqlExecuteService; + private readonly SqlDriverSetting _settings; + + public SqlSelectFn(IServiceProvider services, + SqlExecuteService sqlExecuteService, + SqlDriverSetting settings) + { + _settings = settings; + _services = services; + _sqlExecuteService = sqlExecuteService; + } + + public async Task Execute(RoleDialogModel message) + { + var args = JsonSerializer.Deserialize(message.FunctionArgs); + + if (args.GeneratedWithoutTableDefinition) + { + message.Content = $"Get the table definition first."; + return false; + } + + // check if need to instantely + var dbHook = _services.GetRequiredService(); + var dbType = dbHook.GetDatabaseType(message); + var dbConnectionString = dbHook.GetConnectionString(message) ?? + _settings.Connections.FirstOrDefault(c => c.DbType == dbType)?.ConnectionString ?? + throw new Exception("database connectdion is not found"); + + var result = await (dbType switch + { + "mysql" => _sqlExecuteService.RunQueryInMySql(dbConnectionString, args.Statement, args.Parameters), + "sqlserver" or "mssql" => _sqlExecuteService.RunQueryInSqlServer(dbConnectionString, args.Statement, args.Parameters), + "redshift" => _sqlExecuteService.RunQueryInRedshift(dbConnectionString, args.Statement, args.Parameters), + "mongodb" => _sqlExecuteService.RunQueryInMongoDb(dbConnectionString, args.Statement, args.Parameters), + _ => throw new NotImplementedException($"Database type {dbType} is not supported.") + }); + + if (result == null) + { + message.Content = "Record not found"; + } + else + { + if (dbType == "mongodb") message.StopCompletion = true; + message.Content = JsonSerializer.Serialize(result); + args.Return.Value = message.Content; + } + + return true; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlExecuteService.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlExecuteService.cs new file mode 100644 index 000000000..94a823310 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Services/SqlExecuteService.cs @@ -0,0 +1,158 @@ +using Dapper; +using Microsoft.Data.SqlClient; +using Microsoft.Data.Sqlite; +using MongoDB.Bson; +using MongoDB.Driver; +using MySqlConnector; +using Npgsql; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using SqlParameter = BotSharp.Plugin.SqlDriver.Models.SqlParameter; + +namespace BotSharp.Plugin.SqlDriver.Services +{ + public class SqlExecuteService + { + public async Task> RunQueryInMySql(string connectionString, string sqlText, SqlParameter[] parameters = null) + { + using var connection = new MySqlConnection(connectionString); + var dictionary = new Dictionary(); + foreach (var p in parameters ?? Array.Empty()) + { + dictionary["@" + p.Name] = p.Value; + } + return await connection.QueryAsync(sqlText, dictionary); + } + + public async Task> RunQueryInSqlServer(string connectionString, string sqlText, SqlParameter[] parameters = null) + { + using var connection = new SqlConnection(connectionString); + var dictionary = new Dictionary(); + foreach (var p in parameters ?? Array.Empty()) + { + dictionary["@" + p.Name] = p.Value; + } + return await connection.QueryAsync(sqlText, dictionary); + } + + public async Task> RunQueryInRedshift(string connectionString, string sqlText, SqlParameter[] parameters = null) + { + using var connection = new NpgsqlConnection(connectionString); + var dictionary = new Dictionary(); + foreach (var p in parameters ?? Array.Empty()) + { + dictionary["@" + p.Name] = p.Value; + } + return await connection.QueryAsync(sqlText, dictionary); + } + + public async Task> RunQueryInSqlite(string connectionString, string sqlText, SqlParameter[] parameters = null) + { + using var connection = new SqliteConnection(connectionString); + var dictionary = new Dictionary(); + foreach (var p in parameters ?? Array.Empty()) + { + dictionary["@" + p.Name] = p.Value; + } + return await connection.QueryAsync(sqlText, dictionary); + } + + public async Task> RunQueryInMongoDb(string connectionString, string sqlText, SqlParameter[] parameters = null) + { + var client = new MongoClient(connectionString); + + // Normalize multi-line query to single line + var statement = Regex.Replace(sqlText.Trim(), @"\s+", " "); + + // Parse MongoDB query: database.collection.find({query}).projection({}).sort({}).limit(100) + var match = Regex.Match(statement, + @"^([^.]+)\.([^.]+)\.find\s*\((.*?)\)(.*)?$", + RegexOptions.Singleline); + + if (!match.Success) + return ["Invalid MongoDB query format. Expected: database.collection.find({query})"]; + + var queryJson = BuildMongoQuery(match.Groups[3].Value.Trim(), parameters ?? Array.Empty()); + + try + { + var database = client.GetDatabase(match.Groups[1].Value); + var collection = database.GetCollection(match.Groups[2].Value); + + var filter = string.IsNullOrWhiteSpace(queryJson) || queryJson == "{}" + ? Builders.Filter.Empty + : BsonDocument.Parse(queryJson); + + var findFluent = collection.Find(filter); + findFluent = BuildMongoFluent(findFluent, match.Groups[4].Value); + + var results = await findFluent.ToListAsync(); + return results.Select(doc => BsonTypeMapper.MapToDotNetValue(doc)); + } + catch (Exception ex) + { + return [$"Invalid MongoDB query: {ex.Message}"]; + } + } + + private string BuildMongoQuery(string query, Models.SqlParameter[] parameters) + { + foreach (var p in parameters) + query = query.Replace($"@{p.Name}", p.Value?.ToString() ?? "null"); + return query; + } + + private IFindFluent BuildMongoFluent( + IFindFluent findFluent, string chainedOps) + { + if (string.IsNullOrWhiteSpace(chainedOps)) return findFluent; + + // Apply projection + var projMatch = Regex.Match(chainedOps, @"\.projection\s*\((.*?)\)", RegexOptions.Singleline); + if (projMatch.Success) + findFluent = findFluent.Project(BsonDocument.Parse(projMatch.Groups[1].Value.Trim())); + + // Apply sort + var sortMatch = Regex.Match(chainedOps, @"\.sort\s*\((.*?)\)", RegexOptions.Singleline); + if (sortMatch.Success) + findFluent = findFluent.Sort(BsonDocument.Parse(sortMatch.Groups[1].Value.Trim())); + + // Apply limit + var limitMatch = Regex.Match(chainedOps, @"\.limit\s*\((\d+)\)"); + if (limitMatch.Success && int.TryParse(limitMatch.Groups[1].Value, out var limit)) + { + findFluent = findFluent.Limit(limit); + } + else + { + findFluent = findFluent.Limit(10); + } + + return findFluent; + } + + public async Task> RunQueryInMySql(string connectionString, string[] sqlTexts) + { + return await RunQueryInMySql(connectionString, string.Join(";\r\n", sqlTexts), []); + } + + public async Task> RunQueryInSqlServer(string connectionString, string[] sqlTexts) + { + return await RunQueryInSqlServer(connectionString, string.Join("\r\n", sqlTexts), []); + } + + public async Task> RunQueryInRedshift(string connectionString, string[] sqlTexts) + { + return await RunQueryInRedshift(connectionString, string.Join("\r\n", sqlTexts), []); + } + + public async Task> RunQueryInSqlite(string connectionString, string[] sqlTexts) + { + return await RunQueryInSqlite(connectionString, string.Join("\r\n", sqlTexts), []); + } + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs index 7d079e57e..f85d83874 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/SqlDriverPlugin.cs @@ -24,6 +24,7 @@ public void RegisterDI(IServiceCollection services, IConfiguration config) }); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); From 29fbf3c9a928ccc2f73c4659d19635281a326beb Mon Sep 17 00:00:00 2001 From: "nick.yi" Date: Wed, 4 Feb 2026 14:24:27 +0800 Subject: [PATCH 2/3] Optimize SqlSelectFn --- .../Constants/StateKeys.cs | 16 ++++++++++++++++ .../Controllers/SqlDriverController.cs | 5 +++-- .../Functions/SqlSelectFn.cs | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.SqlDriver/Constants/StateKeys.cs diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Constants/StateKeys.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Constants/StateKeys.cs new file mode 100644 index 000000000..eb569a8f6 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Constants/StateKeys.cs @@ -0,0 +1,16 @@ +using EntityFrameworkCore.BootKit; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BotSharp.Plugin.SqlDriver.Constants +{ + public class StateKeys + { + public const string DBType = "db_type"; + public const string DataSource = "data_source_name"; + } +} diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Controllers/SqlDriverController.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Controllers/SqlDriverController.cs index a39b04cff..8b6302221 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Controllers/SqlDriverController.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Controllers/SqlDriverController.cs @@ -1,4 +1,5 @@ using BotSharp.Abstraction.Models; +using BotSharp.Plugin.SqlDriver.Constants; using BotSharp.Plugin.SqlDriver.Controllers.ViewModels; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -30,8 +31,8 @@ public async Task ExecuteSqlQuery([FromRoute] string conversation var conv = _services.GetRequiredService(); await conv.SetConversationId(conversationId, [ - new MessageState("database_type", sqlQueryRequest.DbType), - new MessageState("data_source_name", sqlQueryRequest.DataSource), + new MessageState(StateKeys.DBType, sqlQueryRequest.DbType), + new MessageState(StateKeys.DataSource, sqlQueryRequest.DataSource), ]); var msg = new RoleDialogModel(AgentRole.User, sqlQueryRequest.SqlStatement) diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs index 4cf2a7da7..9d4c90f7a 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs @@ -38,6 +38,7 @@ public async Task Execute(RoleDialogModel message) "mysql" => _sqlExecuteService.RunQueryInMySql(dbConnectionString, args.Statement, args.Parameters), "sqlserver" or "mssql" => _sqlExecuteService.RunQueryInSqlServer(dbConnectionString, args.Statement, args.Parameters), "redshift" => _sqlExecuteService.RunQueryInRedshift(dbConnectionString, args.Statement, args.Parameters), + "sqlite" => _sqlExecuteService.RunQueryInSqlite(dbConnectionString, args.Statement, args.Parameters), "mongodb" => _sqlExecuteService.RunQueryInMongoDb(dbConnectionString, args.Statement, args.Parameters), _ => throw new NotImplementedException($"Database type {dbType} is not supported.") }); From 1d83b193232fa7bfb9770923f2135d7b2cbff25e Mon Sep 17 00:00:00 2001 From: "nick.yi" Date: Wed, 4 Feb 2026 15:22:49 +0800 Subject: [PATCH 3/3] Optimize GetConnectionString --- .../BotSharp.Abstraction/MLTasks/IText2SqlHook.cs | 2 +- .../BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs | 2 +- .../BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/MLTasks/IText2SqlHook.cs b/src/Infrastructure/BotSharp.Abstraction/MLTasks/IText2SqlHook.cs index 521937fbd..53e558525 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MLTasks/IText2SqlHook.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MLTasks/IText2SqlHook.cs @@ -6,7 +6,7 @@ public interface IText2SqlHook : IHookBase { // Get database type string GetDatabaseType(RoleDialogModel message); - string? GetConnectionString(RoleDialogModel message); + string? GetConnectionString(RoleDialogModel message, string? dataSource = null); Task SqlGenerated(RoleDialogModel message); Task SqlExecuting(RoleDialogModel message); Task SqlExecuted(RoleDialogModel message); diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs index c31a5c35a..92d6baef5 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/ExecuteQueryFn.cs @@ -27,7 +27,7 @@ public async Task Execute(RoleDialogModel message) var dbHook = _services.GetRequiredService(); var dbType = dbHook.GetDatabaseType(message); var connectionString = _setting.Connections.FirstOrDefault(x => x.Name.Equals(args.DataSource, StringComparison.OrdinalIgnoreCase))?.ConnectionString; - var dbConnectionString = dbHook.GetConnectionString(message) ?? connectionString ?? throw new Exception("database connection is not found"); + var dbConnectionString = dbHook.GetConnectionString(message, args.DataSource) ?? connectionString ?? throw new Exception("database connection is not found"); // Print all the SQL statements for debugging _logger.LogInformation("Executing SQL Statements: {SqlStatements}", string.Join("\r\n", args.SqlStatements)); diff --git a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs index 9d4c90f7a..5b2a50e11 100644 --- a/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs +++ b/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/SqlSelectFn.cs @@ -5,13 +5,10 @@ public class SqlSelectFn : IFunctionCallback public string Name => "sql_select"; private readonly IServiceProvider _services; private readonly SqlExecuteService _sqlExecuteService; - private readonly SqlDriverSetting _settings; public SqlSelectFn(IServiceProvider services, - SqlExecuteService sqlExecuteService, - SqlDriverSetting settings) + SqlExecuteService sqlExecuteService) { - _settings = settings; _services = services; _sqlExecuteService = sqlExecuteService; } @@ -30,7 +27,6 @@ public async Task Execute(RoleDialogModel message) var dbHook = _services.GetRequiredService(); var dbType = dbHook.GetDatabaseType(message); var dbConnectionString = dbHook.GetConnectionString(message) ?? - _settings.Connections.FirstOrDefault(c => c.DbType == dbType)?.ConnectionString ?? throw new Exception("database connectdion is not found"); var result = await (dbType switch