Form For Restoring FIrebird Database (Gbk file)

PHOTO EMBED

Mon Aug 22 2022 11:51:50 GMT+0000 (UTC)

Saved by @HristoT #c#

// 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();
            }
        }
content_copyCOPY