using System.Data.Common;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SqlSugar;
namespace Admin.NET.Plugin.AiDOP.DataPlatform;
///
/// 把本环境已注册的 t8_v5 连接抄进 mdp_source。只填 db_host 为空的行,不把口令写入迁移脚本或日志。
///
public sealed class MdpSourceConnectionImportService : IHostedService
{
private readonly ISqlSugarClient _db;
private readonly ILogger _logger;
public MdpSourceConnectionImportService(ISqlSugarClient db, ILogger logger)
{
_db = db;
_logger = logger;
}
public async Task StartAsync(CancellationToken cancellationToken)
{
try
{
if (!_db.AsTenant().IsAnyConnection("t8_v5"))
return;
var conn = _db.AsTenant().GetConnectionScope("t8_v5").CurrentConnectionConfig.ConnectionString;
if (string.IsNullOrWhiteSpace(conn))
return;
var builder = new DbConnectionStringBuilder { ConnectionString = conn };
string? Host() => First(builder, "Server", "Data Source", "Host");
var hostRaw = Host() ?? "";
var host = hostRaw;
int? port = null;
var comma = hostRaw.LastIndexOf(',');
if (comma > 0 && int.TryParse(hostRaw[(comma + 1)..], out var p))
{
host = hostRaw[..comma];
port = p;
}
var dbName = First(builder, "Database", "Initial Catalog");
var user = First(builder, "User Id", "Uid", "User ID");
var password = First(builder, "Password", "Pwd") ?? "";
if (string.IsNullOrWhiteSpace(host) || string.IsNullOrWhiteSpace(dbName) || string.IsNullOrWhiteSpace(user))
return;
var n = await _db.Ado.ExecuteCommandAsync(
"""
UPDATE mdp_source
SET db_type='SQLSERVER', db_host=@host, db_port=@port, db_name=@name,
db_user=@user, db_password_enc=@pwd, conn_mode='EXTERNAL'
WHERE source_code='T8_V5_SQLSERVER' AND IFNULL(db_host,'')=''
""",
new List
{
new("@host", host),
new("@port", port),
new("@name", dbName),
new("@user", user),
new("@pwd", password)
});
if (n > 0)
_logger.LogInformation("已从已注册连接导入来源 T8_V5_SQLSERVER 的连接(口令已写入)");
}
catch (Exception ex)
{
_logger.LogWarning("来源连接导入跳过:{Message}", ex.Message);
}
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
private static string? First(DbConnectionStringBuilder builder, params string[] keys)
{
foreach (var key in keys)
{
if (builder.TryGetValue(key, out var value) && value is string s && !string.IsNullOrWhiteSpace(s))
return s;
}
return null;
}
}