using System; using System.IO; namespace Housing.Services { public class DatabaseSettings { public string Db_Server { get; set; } = string.Empty; public string Db_Name { get; set; } = string.Empty; public string Db_User { get; set; } = string.Empty; public string Db_Password { get; set; } = string.Empty; public static string GetDefaultFilePath() { string folder = AppDomain.CurrentDomain.BaseDirectory; if (!Directory.Exists(folder)) { Directory.CreateDirectory(folder); } return Path.Combine(folder, "Database.ini"); } private string _rawConnectionString = string.Empty; public string ConnectionString { get { // 개별 설정이 모두 지정되어 있는 경우 조합해서 사용 if (!string.IsNullOrWhiteSpace(Db_Server) && !string.IsNullOrWhiteSpace(Db_Name) && !string.IsNullOrWhiteSpace(Db_User) && !string.IsNullOrWhiteSpace(Db_Password)) { return $"Server={Db_Server};Database={Db_Name};User Id={Db_User};Password={Db_Password};"; } // 없으면 레거시 ConnectionString 필드를 그대로 사용 return _rawConnectionString; } set { _rawConnectionString = value; } } private static readonly object _dbLock = new object(); private static DatabaseSettings _cachedSettings; private static DateTime _lastWriteTime; private static string _cachedPath; public static DatabaseSettings Load(string path) { lock (_dbLock) { try { if (File.Exists(path)) { var currentWriteTime = File.GetLastWriteTime(path); if (_cachedSettings != null && _cachedPath == path && _lastWriteTime == currentWriteTime) { return _cachedSettings; } var settings = new DatabaseSettings(); var lines = File.ReadAllLines(path); foreach (var line in lines) { var trimmed = line.Trim(); // 주석 행 스킵 if (trimmed.StartsWith(";") || trimmed.StartsWith("#")) { continue; } if (trimmed.StartsWith("ConnectionString", StringComparison.OrdinalIgnoreCase)) { var parts = trimmed.Split(new[] { '=' }, 2); if (parts.Length == 2) { settings.ConnectionString = parts[1].Trim(); } } else if (trimmed.StartsWith("Db_Server", StringComparison.OrdinalIgnoreCase)) { var parts = trimmed.Split(new[] { '=' }, 2); if (parts.Length == 2) { settings.Db_Server = parts[1].Trim(); } } else if (trimmed.StartsWith("Db_Name", StringComparison.OrdinalIgnoreCase)) { var parts = trimmed.Split(new[] { '=' }, 2); if (parts.Length == 2) { settings.Db_Name = parts[1].Trim(); } } else if (trimmed.StartsWith("Db_User", StringComparison.OrdinalIgnoreCase)) { var parts = trimmed.Split(new[] { '=' }, 2); if (parts.Length == 2) { settings.Db_User = parts[1].Trim(); } } else if (trimmed.StartsWith("Db_Password", StringComparison.OrdinalIgnoreCase)) { var parts = trimmed.Split(new[] { '=' }, 2); if (parts.Length == 2) { settings.Db_Password = parts[1].Trim(); } } } _cachedSettings = settings; _lastWriteTime = currentWriteTime; _cachedPath = path; return settings; } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"[DatabaseSettings Load Error] {ex.Message}"); } return _cachedSettings ?? new DatabaseSettings(); } } } }