BotSharp/src/Plugins/BotSharp.Plugin.SqlDriver/Functions/GetTableDefinitionFn.cs

64 lines
2 KiB
C#
Raw Normal View History

2024-09-10 22:12:17 +00:00
using BotSharp.Plugin.SqlDriver.Models;
2024-09-04 16:04:19 +00:00
using Microsoft.Extensions.Logging;
2024-08-22 15:15:05 +00:00
using MySqlConnector;
namespace BotSharp.Plugin.SqlDriver.Functions;
public class GetTableDefinitionFn : IFunctionCallback
{
public string Name => "get_table_definition";
private readonly IServiceProvider _services;
2024-09-04 16:04:19 +00:00
private readonly ILogger<GetTableDefinitionFn> _logger;
2024-08-22 15:15:05 +00:00
2024-09-04 16:04:19 +00:00
public GetTableDefinitionFn(
IServiceProvider services,
ILogger<GetTableDefinitionFn> logger)
2024-08-22 15:15:05 +00:00
{
_services = services;
2024-09-04 16:04:19 +00:00
_logger = logger;
2024-08-22 15:15:05 +00:00
}
public async Task<bool> Execute(RoleDialogModel message)
{
2024-09-10 22:12:17 +00:00
var args = JsonSerializer.Deserialize<SqlStatement>(message.FunctionArgs);
var tables = new string[] { args.Table };
2024-08-22 15:15:05 +00:00
var agentService = _services.GetRequiredService<IAgentService>();
var sqlDriver = _services.GetRequiredService<SqlDriverService>();
var settings = _services.GetRequiredService<SqlDriverSetting>();
2024-08-30 21:12:20 +00:00
// Get table DDL from database
2024-09-04 16:04:19 +00:00
2024-08-30 21:12:20 +00:00
var tableDdls = new List<string>();
2024-09-10 22:12:17 +00:00
using var connection = new MySqlConnection(settings.MySqlExecutionConnectionString);
2024-09-03 20:41:12 +00:00
connection.Open();
2024-08-22 15:15:05 +00:00
2024-09-04 16:04:19 +00:00
foreach (var table in tables)
2024-08-22 15:15:05 +00:00
{
2024-09-04 16:04:19 +00:00
try
2024-09-03 20:41:12 +00:00
{
2024-09-04 16:04:19 +00:00
var escapedTableName = MySqlHelper.EscapeString(table);
2024-09-05 15:34:35 +00:00
var sql = $"SHOW CREATE TABLE `{escapedTableName}`";
2024-09-04 16:04:19 +00:00
using var command = new MySqlCommand(sql, connection);
using var reader = command.ExecuteReader();
if (reader.Read())
{
2024-09-05 15:34:35 +00:00
var result = reader.GetString(1);
2024-09-04 16:04:19 +00:00
tableDdls.Add(result);
}
reader.Close();
command.Dispose();
}
catch (Exception ex)
2024-09-03 20:41:12 +00:00
{
2024-09-05 01:11:25 +00:00
_logger.LogWarning($"Error when getting ddl statement of table {table}. {ex.Message}\r\n{ex.InnerException}");
2024-09-03 20:41:12 +00:00
}
2024-08-22 15:15:05 +00:00
}
2024-09-03 20:41:12 +00:00
connection.Close();
2024-09-04 16:04:19 +00:00
message.Content = string.Join("\r\n\r\n", tableDdls);
2024-08-22 15:15:05 +00:00
return true;
}
}