185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using DBMigration.Models;
 | |
| using DBMigration.Services;
 | |
| 
 | |
| namespace DBMigration.Forms
 | |
| {
 | |
|     public partial class MainForm : Form
 | |
|     {
 | |
|         private readonly DatabaseService _databaseService;
 | |
|         private readonly MigrationService _migrationService;
 | |
|         private ConnectionInfo? _sourceConnection;
 | |
|         private ConnectionInfo? _targetConnection;
 | |
|         private List<DatabaseObject>? _databaseObjects;
 | |
|         private readonly CancellationTokenSource _cancellationTokenSource;
 | |
| 
 | |
|         public MainForm()
 | |
|         {
 | |
|             InitializeComponent();
 | |
|             _databaseService = new DatabaseService();
 | |
|             _migrationService = new MigrationService();
 | |
|             _cancellationTokenSource = new CancellationTokenSource();
 | |
|             _databaseObjects = new List<DatabaseObject>();
 | |
|         }
 | |
| 
 | |
|         private async void btnConnectSource_Click(object sender, EventArgs e)
 | |
|         {
 | |
|             using (var form = new ConnectionForm())
 | |
|             {
 | |
|                 if (form.ShowDialog() == DialogResult.OK)
 | |
|                 {
 | |
|                     _sourceConnection = form.ConnectionInfo;
 | |
|                     await LoadDatabaseObjectsAsync();
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private async Task LoadDatabaseObjectsAsync()
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 btnConnectSource.Enabled = false;
 | |
|                 treeObjects.Nodes.Clear();
 | |
|                 
 | |
|                 // 테이블, 뷰, 프로시저 노드 생성
 | |
|                 var tableNode = treeObjects.Nodes.Add("Tables");
 | |
|                 var viewNode = treeObjects.Nodes.Add("Views");
 | |
|                 var procNode = treeObjects.Nodes.Add("Stored Procedures");
 | |
|                 
 | |
|                 // 테이블 로드
 | |
|                 tableNode.Nodes.Add("Loading...");
 | |
|                 treeObjects.ExpandAll();
 | |
|                 await LoadTablesAsync(tableNode);
 | |
|                 
 | |
|                 // 뷰 로드
 | |
|                 viewNode.Nodes.Add("Loading...");
 | |
|                 await LoadViewsAsync(viewNode);
 | |
|                 
 | |
|                 // 프로시저 로드
 | |
|                 procNode.Nodes.Add("Loading...");
 | |
|                 await LoadProceduresAsync(procNode);
 | |
| 
 | |
|                 btnConnectSource.Enabled = true;
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 MessageBox.Show($"데이터베이스 객체 로드 중 오류 발생: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
 | |
|                 btnConnectSource.Enabled = true;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private async Task LoadTablesAsync(TreeNode parentNode)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add("Loading...");
 | |
|                 
 | |
|                 await foreach (var table in _databaseService.GetTables(_sourceConnection!))
 | |
|                 {
 | |
|                     if (_cancellationTokenSource.Token.IsCancellationRequested)
 | |
|                         return;
 | |
| 
 | |
|                     var node = new TreeNode($"{table.Schema}.{table.Name}")
 | |
|                     {
 | |
|                         Tag = table,
 | |
|                         Checked = table.IsSelected
 | |
|                     };
 | |
|                     
 | |
|                     parentNode.Nodes.Add(node);
 | |
|                     await Task.Yield();
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add($"Error: {ex.Message}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private async Task LoadViewsAsync(TreeNode parentNode)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add("Loading...");
 | |
|                 
 | |
|                 await foreach (var view in _databaseService.GetViews(_sourceConnection!))
 | |
|                 {
 | |
|                     if (_cancellationTokenSource.Token.IsCancellationRequested)
 | |
|                         return;
 | |
| 
 | |
|                     var node = new TreeNode($"{view.Schema}.{view.Name}")
 | |
|                     {
 | |
|                         Tag = view,
 | |
|                         Checked = view.IsSelected
 | |
|                     };
 | |
|                     
 | |
|                     parentNode.Nodes.Add(node);
 | |
|                     await Task.Yield();
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add($"Error: {ex.Message}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private async Task LoadProceduresAsync(TreeNode parentNode)
 | |
|         {
 | |
|             try
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add("Loading...");
 | |
|                 
 | |
|                 await foreach (var proc in _databaseService.GetProcedures(_sourceConnection!))
 | |
|                 {
 | |
|                     if (_cancellationTokenSource.Token.IsCancellationRequested)
 | |
|                         return;
 | |
| 
 | |
|                     var node = new TreeNode($"{proc.Schema}.{proc.Name}")
 | |
|                     {
 | |
|                         Tag = proc,
 | |
|                         Checked = proc.IsSelected
 | |
|                     };
 | |
|                     
 | |
|                     parentNode.Nodes.Add(node);
 | |
|                     await Task.Yield();
 | |
|                 }
 | |
|             }
 | |
|             catch (Exception ex)
 | |
|             {
 | |
|                 parentNode.Nodes.Clear();
 | |
|                 parentNode.Nodes.Add($"Error: {ex.Message}");
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         protected override void OnFormClosing(FormClosingEventArgs e)
 | |
|         {
 | |
|             _cancellationTokenSource.Cancel();
 | |
|             base.OnFormClosing(e);
 | |
|         }
 | |
| 
 | |
|         private void btnMigrate_Click(object sender, EventArgs e)
 | |
|         {
 | |
|             if (_targetConnection == null)
 | |
|             {
 | |
|                 MessageBox.Show("대상 데이터베이스 연결 정보를 먼저 설정하세요.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var selectedObjects = _databaseObjects.Where(o => o.IsSelected).ToList();
 | |
|             if (selectedObjects.Count == 0)
 | |
|             {
 | |
|                 MessageBox.Show("마이그레이션할 객체를 선택하세요.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             using (var form = new ProgressForm(selectedObjects, _sourceConnection, _targetConnection))
 | |
|             {
 | |
|                 form.ShowDialog();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | 
