/* * Copyright (c) 2021, Jan de Visser * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace SQLServer { class SQLStatement final : public Core::Object { C_OBJECT_ABSTRACT(SQLStatement) public: static SQL::ResultOr> create(DatabaseConnection&, StringView sql); ~SQLStatement() override = default; static RefPtr statement_for(SQL::StatementID statement_id); SQL::StatementID statement_id() const { return m_statement_id; } DatabaseConnection* connection() { return dynamic_cast(parent()); } Optional execute(Vector placeholder_values); private: SQLStatement(DatabaseConnection&, NonnullRefPtr statement); bool should_send_result_rows(SQL::ResultSet const& result) const; void next(SQL::ExecutionID execution_id, SQL::ResultSet result, size_t result_size); void report_error(SQL::Result, SQL::ExecutionID execution_id); SQL::StatementID m_statement_id { 0 }; HashTable m_ongoing_executions; SQL::ExecutionID m_next_execution_id { 0 }; NonnullRefPtr m_statement; }; }