Form For Restoring FIrebird Database (Gbk file)
Mon Aug 22 2022 11:51:50 GMT+0000 (UTC)
// Download Firebird 3_0 Server: // https://firebirdsql.org/en/firebird-3-0-0/ public void ShowRestoreFirebirdDatabase() { using (var form = new XF_RestoreFirebirdDatabase()) { form.Text = "Възстановяване на Firebird база (Gbk файл)"; form.StartPosition = FormStartPosition.CenterScreen; form.FileName.ReadOnly = true; form.Log.ReadOnly = true; form.RestorePath.ReadOnly = true; form.btnAddToSettings.Enabled = false; var arguments = "-R -USER 'SYSDBA' -PAS 'masterkey' "; var filePath = string.Empty; form.btnChooseFirebirdDatabase.Click += (s, e) => { using (var dlg = new OpenFileDialog()) { dlg.Title = "Изберете файл"; dlg.InitialDirectory = "d:\\"; dlg.Filter = "Firebird|*.Gbk"; dlg.Multiselect = false; if (dlg.ShowDialog() == DialogResult.OK) { filePath = dlg.FileName; form.FileName.Text = filePath; arguments += filePath + " "; } } }; var restorePath = string.Empty; form.btnChooseRestoreFolder.Click += (s, e) => { using (var dlg = new FolderBrowserDialog()) { if (dlg.ShowDialog() == DialogResult.OK) { restorePath = dlg.SelectedPath; form.RestorePath.Text = restorePath; } } }; Process process = null; form.btnRestoreDatabase.Click += async (s, e) => { if (string.IsNullOrWhiteSpace(filePath)) { MessageBox.Show("Няма посочена база за ресторване.", "Грешка!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (string.IsNullOrWhiteSpace(form.DatabaseName.Text)) { MessageBox.Show("Няма зададено име на база.", "Грешка!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var stopwatch = new Stopwatch(); stopwatch.Start(); EnableForm(false); restorePath = string.Empty; if (string.IsNullOrWhiteSpace(form.RestorePath.Text)) { restorePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "databases", form.DatabaseName.Text + ".GDB"); } else { restorePath = Path.Combine(form.RestorePath.Text, form.DatabaseName.Text + ".GDB"); } arguments += restorePath; process = new Process() { StartInfo = new ProcessStartInfo(GlobMigration.GbakExe, arguments) { CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, }, }; process.Start(); Thread.Sleep(1000); CancellationTokenSource src = new CancellationTokenSource(); CancellationToken ct = src.Token; await Task.Factory.StartNew(() => { if (ct.IsCancellationRequested) { return; } while (!process.HasExited) { var fileInfo = new FileInfo(restorePath); var fileSize = BytesToString(fileInfo.Length); Log(fileSize); Thread.Sleep(3000); } }, ct); if (!File.Exists(restorePath)) { MessageBox.Show("Базата не може да се възстанови. Проверете отново файла, който е изтеглен и пътя до него."); EnableForm(true); return; } var logMessage = $"Приключи възстановяването: {stopwatch.Elapsed.TotalMinutes:F0} минути, {stopwatch.Elapsed.TotalSeconds:F0} секунди"; Log(logMessage); Log($"Записана база в: {restorePath}"); arguments = "-R -USER 'SYSDBA' -PAS 'masterkey' "; EnableForm(true); form.btnAddToSettings.Enabled = true; }; form.FormClosing += (s, e) => { if (process != null && !process.HasExited) { process.Kill(); } }; form.btnOpenDatabaseFolder.Click += (s, e) => { Process.Start(GlobMigration.DatabasesFolderPath); }; form.btnClose.Click += (s, e) => { form.Close(); }; form.btnAddToSettings.Click += (s, e) => { if (!File.Exists(restorePath)) { MessageBox.Show("Не съществува база, която да се закачи.", "Грешка!", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } AddFirebirdDatabaseToSettings(restorePath); MessageBox.Show("Успешно закачена база за настройките."); }; void Log(string msg) { if (form.IsDisposed) { return; } form.BeginInvoke((MethodInvoker)delegate () { form.Log.AppendText($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)}] {msg}" + Environment.NewLine); form.Log.ScrollToCaret(); }); } string BytesToString(long byteCount) { string[] suf = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //Longs run out around EB if (byteCount == 0) { return "0" + suf[0]; } long bytes = Math.Abs(byteCount); int place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024))); double num = Math.Round(bytes / Math.Pow(1024, place), 1); return (Math.Sign(byteCount) * num).ToString() + " " + suf[place]; } void EnableForm(bool enable) { if (form.IsDisposed) { return; } form.BeginInvoke((MethodInvoker)delegate () { form.btnChooseFirebirdDatabase.Enabled = enable; form.btnRestoreDatabase.Enabled = enable; form.btnAddToSettings.Enabled = enable; form.btnChooseRestoreFolder.Enabled = enable; }); } form.ShowDialog(); } }
Comments