|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
string connStr;
|
|
|
|
|
// 개별 설정이 모두 지정되어 있는 경우 조합해서 사용
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(Db_Server) &&
|
|
|
|
|
!string.IsNullOrWhiteSpace(Db_Name) &&
|
|
|
|
|
!string.IsNullOrWhiteSpace(Db_User) &&
|
|
|
|
|
!string.IsNullOrWhiteSpace(Db_Password))
|
|
|
|
|
{
|
|
|
|
|
connStr = $"Server={Db_Server};Database={Db_Name};User Id={Db_User};Password={Db_Password};";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// 없으면 레거시 ConnectionString 필드를 그대로 사용
|
|
|
|
|
connStr = _rawConnectionString;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SSL 인증서 체인 신뢰성 오류(TrustServerCertificate=True 누락) 방지 조치 추가
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(connStr) && connStr.IndexOf("TrustServerCertificate", StringComparison.OrdinalIgnoreCase) < 0)
|
|
|
|
|
{
|
|
|
|
|
if (!connStr.EndsWith(";")) connStr += ";";
|
|
|
|
|
connStr += "TrustServerCertificate=True;";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return connStr;
|
|
|
|
|
}
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|