MdpSourceConnectionImportService.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System.Data.Common;
  2. using Microsoft.Extensions.Hosting;
  3. using Microsoft.Extensions.Logging;
  4. using SqlSugar;
  5. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  6. /// <summary>
  7. /// 把本环境已注册的 t8_v5 连接抄进 mdp_source。只填 db_host 为空的行,不把口令写入迁移脚本或日志。
  8. /// </summary>
  9. public sealed class MdpSourceConnectionImportService : IHostedService
  10. {
  11. private readonly ISqlSugarClient _db;
  12. private readonly ILogger<MdpSourceConnectionImportService> _logger;
  13. public MdpSourceConnectionImportService(ISqlSugarClient db, ILogger<MdpSourceConnectionImportService> logger)
  14. {
  15. _db = db;
  16. _logger = logger;
  17. }
  18. public async Task StartAsync(CancellationToken cancellationToken)
  19. {
  20. try
  21. {
  22. if (!_db.AsTenant().IsAnyConnection("t8_v5"))
  23. return;
  24. var conn = _db.AsTenant().GetConnectionScope("t8_v5").CurrentConnectionConfig.ConnectionString;
  25. if (string.IsNullOrWhiteSpace(conn))
  26. return;
  27. var builder = new DbConnectionStringBuilder { ConnectionString = conn };
  28. string? Host() => First(builder, "Server", "Data Source", "Host");
  29. var hostRaw = Host() ?? "";
  30. var host = hostRaw;
  31. int? port = null;
  32. var comma = hostRaw.LastIndexOf(',');
  33. if (comma > 0 && int.TryParse(hostRaw[(comma + 1)..], out var p))
  34. {
  35. host = hostRaw[..comma];
  36. port = p;
  37. }
  38. var dbName = First(builder, "Database", "Initial Catalog");
  39. var user = First(builder, "User Id", "Uid", "User ID");
  40. var password = First(builder, "Password", "Pwd") ?? "";
  41. if (string.IsNullOrWhiteSpace(host) || string.IsNullOrWhiteSpace(dbName) || string.IsNullOrWhiteSpace(user))
  42. return;
  43. var n = await _db.Ado.ExecuteCommandAsync(
  44. """
  45. UPDATE mdp_source
  46. SET db_type='SQLSERVER', db_host=@host, db_port=@port, db_name=@name,
  47. db_user=@user, db_password_enc=@pwd, conn_mode='EXTERNAL'
  48. WHERE source_code='T8_V5_SQLSERVER' AND IFNULL(db_host,'')=''
  49. """,
  50. new List<SugarParameter>
  51. {
  52. new("@host", host),
  53. new("@port", port),
  54. new("@name", dbName),
  55. new("@user", user),
  56. new("@pwd", password)
  57. });
  58. if (n > 0)
  59. _logger.LogInformation("已从已注册连接导入来源 T8_V5_SQLSERVER 的连接(口令已写入)");
  60. }
  61. catch (Exception ex)
  62. {
  63. _logger.LogWarning("来源连接导入跳过:{Message}", ex.Message);
  64. }
  65. }
  66. public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
  67. private static string? First(DbConnectionStringBuilder builder, params string[] keys)
  68. {
  69. foreach (var key in keys)
  70. {
  71. if (builder.TryGetValue(key, out var value) && value is string s && !string.IsNullOrWhiteSpace(s))
  72. return s;
  73. }
  74. return null;
  75. }
  76. }