mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-23 09:51:57 -05:00
sql+SQLStudio: Recover from errors preparing SQL statements
In both applications, display the SQL statement that failed to parse. For the REPL, ensure the REPL prompts the user for another statement. For SQLStudio, we don't continue executing the script as it likely does not make sense to run statements that come after a failed statement.
This commit is contained in:
parent
c08956028a
commit
82363aa1c4
4 changed files with 19 additions and 6 deletions
|
@ -440,7 +440,7 @@ void MainWidget::drop_event(GUI::DropEvent& drop_event)
|
|||
}
|
||||
}
|
||||
|
||||
DeprecatedString MainWidget::read_next_sql_statement_of_editor()
|
||||
void MainWidget::read_next_sql_statement_of_editor()
|
||||
{
|
||||
StringBuilder piece;
|
||||
do {
|
||||
|
@ -450,7 +450,7 @@ DeprecatedString MainWidget::read_next_sql_statement_of_editor()
|
|||
auto line_maybe = read_next_line_of_editor();
|
||||
|
||||
if (!line_maybe.has_value())
|
||||
return {};
|
||||
return;
|
||||
|
||||
auto& line = line_maybe.value();
|
||||
auto lexer = SQL::AST::Lexer(line);
|
||||
|
@ -490,10 +490,16 @@ DeprecatedString MainWidget::read_next_sql_statement_of_editor()
|
|||
m_editor_line_level = last_token_ended_statement ? 0 : (m_editor_line_level > 0 ? m_editor_line_level : 1);
|
||||
} while ((m_editor_line_level > 0) || piece.is_empty());
|
||||
|
||||
if (auto statement_id = m_sql_client->prepare_statement(m_connection_id, piece.to_deprecated_string()); statement_id.has_value())
|
||||
m_sql_client->async_execute_statement(*statement_id, {});
|
||||
auto sql_statement = piece.to_deprecated_string();
|
||||
|
||||
return piece.to_deprecated_string();
|
||||
if (auto statement_id = m_sql_client->prepare_statement(m_connection_id, sql_statement); statement_id.has_value()) {
|
||||
m_sql_client->async_execute_statement(*statement_id, {});
|
||||
} else {
|
||||
auto* editor = dynamic_cast<ScriptEditor*>(m_tab_widget->active_widget());
|
||||
VERIFY(editor);
|
||||
|
||||
GUI::MessageBox::show_error(window(), DeprecatedString::formatted("Could not parse {}\n{}", editor->path(), sql_statement));
|
||||
}
|
||||
}
|
||||
|
||||
Optional<DeprecatedString> MainWidget::read_next_line_of_editor()
|
||||
|
|
|
@ -61,7 +61,7 @@ private:
|
|||
RefPtr<SQL::SQLClient> m_sql_client;
|
||||
Vector<Vector<DeprecatedString>> m_results;
|
||||
|
||||
DeprecatedString read_next_sql_statement_of_editor();
|
||||
void read_next_sql_statement_of_editor();
|
||||
Optional<DeprecatedString> read_next_line_of_editor();
|
||||
size_t m_current_line_for_parsing { 0 };
|
||||
int m_editor_line_level { 0 };
|
||||
|
|
|
@ -24,6 +24,8 @@ public:
|
|||
ErrorOr<bool> save_as();
|
||||
ErrorOr<bool> attempt_to_close();
|
||||
|
||||
DeprecatedString const& path() const { return m_path; }
|
||||
|
||||
private:
|
||||
ScriptEditor();
|
||||
|
||||
|
|
|
@ -275,6 +275,11 @@ private:
|
|||
});
|
||||
} else if (auto statement_id = m_sql_client->prepare_statement(m_connection_id, piece); statement_id.has_value()) {
|
||||
m_sql_client->async_execute_statement(*statement_id, {});
|
||||
} else {
|
||||
warnln("\033[33;1mError parsing SQL statement\033[0m: {}", piece);
|
||||
m_loop.deferred_invoke([this]() {
|
||||
read_sql();
|
||||
});
|
||||
}
|
||||
|
||||
// ...But m_keep_running can also be set to false by a command handler.
|
||||
|
|
Loading…
Add table
Reference in a new issue