private async Task <bool> Execute(string sql)
        {
            try {
                if (_operationInProgress)
                {
                    throw new Exception("Another operation is already in progress.");
                }

                _manager.CommitOpenEditors();
                await ExecuteCore(sql);

                _manager.SetDirty();
                _manager.Rescan();
                return(true);
            } catch (Exception ex) {
                MessageForm.ShowError(TopLevelControl, "Script Error", "An error occurred.", ex.Message);
                return(false);
            }
        }
        public static async Task <bool> Start(IWin32Window owner, string filePath, NotebookManager manager)
        {
            DatabaseSchema schema = null;

            manager.PushStatus("Reading notebook...");
            try {
                schema = await Task.Run(() => DatabaseSchema.FromNotebook(manager.Notebook));
            } catch (Exception ex) {
                MessageForm.ShowError(owner,
                                      "Import Error",
                                      "Failed to read the list of tables in the notebook.",
                                      ex.Message);
                return(false);
            }
            manager.PopStatus();

            string importSql;

            using (var f = new ImportCsvForm(filePath, schema, manager)) {
                if (f.ShowDialog(owner) != DialogResult.OK)
                {
                    return(false);
                }
                importSql = f.GeneratedImportSql;
            }

            manager.PushStatus($"Importing \"{Path.GetFileName(filePath)}\"...");
            try {
                await Task.Run(() => {
                    manager.ExecuteScript(importSql, withTransaction: true);
                });

                manager.Rescan();
            } catch (Exception ex) {
                manager.PopStatus();
                MessageForm.ShowError(owner, "Import Error", "The import failed.", ex.GetErrorMessage());
                return(false);
            }

            manager.SetDirty();
            manager.PopStatus();
            return(true);
        }
Example #3
0
        private static async Task <bool> RunImportScript(string importSql, IWin32Window owner, string filePath,
                                                         NotebookManager manager)
        {
            manager.PushStatus($"Importing \"{Path.GetFileName(filePath)}\"...");
            try {
                await Task.Run(() => {
                    manager.ExecuteScript(importSql, transactionType: NotebookManager.TransactionType.Transaction);
                });

                manager.Rescan();
            } catch (Exception ex) {
                manager.PopStatus();
                MessageForm.ShowError(owner, "Import Error", "The import failed.", ex.GetErrorMessage());
                return(false);
            }

            manager.SetDirty();
            manager.PopStatus();
            return(true);
        }
        public QueryDocumentControl(string name, NotebookManager manager, IWin32Window mainForm, Slot <bool> operationInProgress)
        {
            InitializeComponent();
            ItemName             = name;
            _manager             = manager;
            _notebook            = manager.Notebook;
            _mainForm            = mainForm;
            _operationInProgress = operationInProgress;
            _resultToolStrip.SetMenuAppearance();

            _grid.EnableDoubleBuffering();

            _textCtl = new SqlTextControl(false)
            {
                Dock    = DockStyle.Fill,
                Padding = new Padding(4, 0, 0, 0)
            };
            _sqlPanel.Controls.Add(_textCtl);

            // if this tool window has been pulled off into a floating window, then the MainForm's key handler won't
            // trigger on F5, so catch it here.
            _textCtl.Scintilla.KeyDown += async(sender, e) => {
                if (e.KeyCode == Keys.F5)
                {
                    await Execute();
                }
            };

            Load += (sender, e) => {
                string initialText = _manager.GetItemData(ItemName);
                if (initialText != null)
                {
                    _textCtl.SqlText = initialText;
                }

                _textCtl.SqlTextChanged += (sender2, e2) => _manager.SetDirty();

                ShowResult(0);
            };
        }
Example #5
0
        private string Execute(string sql)
        {
            _manager.PushStatus("Running console command...");
            _manager.CommitOpenEditors();
            string response;

            try {
                Dictionary <string, object> newVars;
                var result = _manager.ExecuteScriptEx(sql, _variables, true, out newVars);
                _variables = newVars;
                UpdateConsoleState();
                _manager.SetDirty();
                _manager.Rescan();
                var parts = new List <string>();
                if (result.ScalarResult == null && !result.TextOutput.Any() && !result.DataTables.Any())
                {
                    parts.Add("<div style=\"overflow: hidden;\">&nbsp;</div>");
                }
                if (result.ScalarResult != null)
                {
                    parts.Add(
                        "<div style=\"overflow: hidden;\">" +
                        $"Returned: {WebUtility.HtmlEncode(result.ScalarResult.ToString())}" +
                        "</div>"
                        );
                }
                if (result.TextOutput.Any())
                {
                    parts.Add(
                        "<div style=\"overflow: hidden; overflow-x: auto; padding-bottom: 18px;\"><pre style=\"margin: 0; padding: 0;\"><font face=\"Segoe UI\" size=\"2\">" +
                        string.Join("<br>", result.TextOutput.Select(WebUtility.HtmlEncode)) +
                        "</font></pre></div>"
                        );
                }
                var sb = new StringBuilder();
                // inline the CSS so it gets included when the user copies tables to the clipboard
                var cellCss = "border: 1px solid rgb(229, 229, 229); padding: 3px; padding-left: 6px; " +
                              "padding-right: 6px; text-align: left; vertical-align: top; font: 'Segoe UI' 9pt; " +
                              "max-height: 100px; overflow-y: auto;";
                foreach (var dt in result.DataTables)
                {
                    sb.Append("<div style=\"overflow-x: auto; overflow-y: hidden; padding-bottom: 18px;\">");
                    sb.Append("<table style=\"border-collapse: collapse;\"><thead><tr>");
                    foreach (var col in dt.Columns)
                    {
                        sb.Append($"<td style=\"{cellCss}\"><pre style=\"margin: 0; padding: 0;\">" +
                                  $"<font face=\"Segoe UI\" size=\"2\"><b>{WebUtility.HtmlEncode(col)}</b></font></pre></td>");
                    }
                    sb.Append("</tr></thead><tbody>");
                    int count = 0;
                    foreach (var row in dt.Rows)
                    {
                        if (count >= 100)
                        {
                            break;
                        }
                        sb.Append("<tr>");
                        foreach (var cell in row)
                        {
                            string cellText  = cell.ToString();
                            var    cellBytes = cell as byte[];
                            if (cellBytes != null)
                            {
                                if (ArrayUtil.IsSqlArray(cellBytes))
                                {
                                    cellText = "[" + string.Join(", ", ArrayUtil.GetArrayElements(cellBytes)) + "]";
                                }
                            }
                            sb.Append($"<td style=\"{cellCss}\"><pre style=\"margin:0; padding:0;\">" +
                                      $"<font face=\"Segoe UI\" size=\"2\">{WebUtility.HtmlEncode(cellText)}</font></pre></td>");
                        }
                        sb.Append("</tr>");
                        count++;
                    }
                    sb.Append("</tbody></table></div>");
                    if (dt.Rows.Count > 100)
                    {
                        sb.Append($"<div>Table has {dt.Rows.Count} rows, showing 100.</div>");
                    }
                }
                parts.Add(sb.ToString());
                var html = string.Join("", parts);
                response = html;
            } catch (Exception ex) {
                response = $"<div style=\"overflow: hidden; color: red;\">{WebUtility.HtmlEncode(ex.Message)}</div>";
            }

            _manager.PopStatus();
            return($"<div class=\"response\">{response}</div>");
        }
Example #6
0
        private async Task DoCommonImport(IImportSession session)
        {
            IReadOnlyList <ImportPreviewForm.SelectedTable> selectedTables = null;
            bool csvHasHeaderRow = false, copyData = false;

            using (var frm = new ImportPreviewForm(session)) {
                if (frm.ShowDialog(_owner) != DialogResult.OK)
                {
                    return;
                }
                selectedTables  = frm.SelectedTables;
                csvHasHeaderRow = frm.CsvHasHeaderRow;
                copyData        = frm.CopyData;
            }

            var fileSession = session as IFileImportSession;
            var dbSession = session as IDatabaseImportSession;

            if (fileSession != null)
            {
                fileSession.FileHasHeaderRow = csvHasHeaderRow;
            }

            Action import = () => {
                _notebook.Invoke(() => {
                    _notebook.Execute("BEGIN");

                    try {
                        if (dbSession != null)
                        {
                            DoDatabaseImport(selectedTables, copyData, dbSession);
                        }
                        else if (fileSession != null)
                        {
                            DoDatabaseImport(selectedTables, fileSession);
                        }
                        else
                        {
                            throw new InvalidOperationException("Unexpected session type.");
                        }

                        _notebook.Execute("COMMIT");
                        session.AddToRecentlyUsed();
                    } catch {
                        try { _notebook.Execute("ROLLBACK"); } catch { }
                        throw;
                    }
                });
            };

            _manager.PushStatus("Importing the selected tables...");
            Exception exception = null;
            await Task.Run(() => {
                try {
                    import();
                } catch (Exception ex) {
                    exception = ex;
                }
            });

            _manager.PopStatus();
            _manager.Rescan();

            if (exception == null)
            {
                _manager.SetDirty();
            }
            else
            {
                MessageForm.ShowError(_owner, "Import Error", "The import failed.", exception.Message);
            }
        }
Example #7
0
        public NoteDocumentControl(string name, NotebookManager manager)
        {
            InitializeComponent();
            ItemName = name;
            _manager = manager;
            _toolStrip.SetMenuAppearance();
            _contextMenuStrip.SetMenuAppearance();
            _browser.PreviewKeyDown += (sender, e) => {
                if (e.KeyData == (Keys.Control | Keys.C))
                {
                    EnableDisableContextMenu();
                    _copyMnu.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.X))
                {
                    EnableDisableContextMenu();
                    _cutMnu.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.V))
                {
                    EnableDisableContextMenu();
                    _pasteMnu.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.A))
                {
                    _selectAllMnu.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.B))
                {
                    _boldBtn.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.I))
                {
                    _italicBtn.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.U))
                {
                    _underlineBtn.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.L))
                {
                    _alignLeftBtn.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.E))
                {
                    _alignCenterBtn.PerformClick();
                }
                else if (e.KeyData == (Keys.Control | Keys.R))
                {
                    _alignRightBtn.PerformClick();
                }
                else if (e.KeyData == Keys.Delete)
                {
                    _browser.Document.ExecCommand("delete", false, null);
                }
                else
                {
                    manager.HandleAppHotkeys(e.KeyData);
                }
            };

            using (var fonts = new InstalledFontCollection()) {
                foreach (var family in fonts.Families.OrderBy(x => x.Name))
                {
                    _fontNameCmb.Items.Add(family.Name);
                }
            }

            _browser.DocumentText = "<html><body></body></html>";
            ((IHTMLDocument2)_browser.Document.DomDocument).designMode = "On";

            var doc = (IHTMLDocument2)_browser.Document.DomDocument;

            doc.write(_manager.GetItemData(ItemName));

            var markupContainer = (IMarkupContainer2)doc;

            markupContainer.RegisterForDirtyRange(_sink, out _sinkCookie);

            _sink.Change += (sender2, e2) => _manager.SetDirty();
            _timer.Start();

            Load += (sender, e) => { _browser.Focus(); _browser.Select(); };
        }