/* * Copyright (c) 2022-2024, Tim Flynn * Copyright (c) 2023, Jelle Raaijmakers * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include struct sqlite3; struct sqlite3_stmt; namespace WebView { class Database : public RefCounted { public: static ErrorOr> create(); ~Database(); using StatementID = size_t; using OnResult = Function; ErrorOr prepare_statement(StringView statement); void execute_statement(StatementID, OnResult on_result); template void execute_statement(StatementID statement_id, OnResult on_result, PlaceholderValues&&... placeholder_values) { int index = 1; (apply_placeholder(statement_id, index++, forward(placeholder_values)), ...); execute_statement(statement_id, move(on_result)); } template ValueType result_column(StatementID, int column); private: explicit Database(sqlite3*); template void apply_placeholder(StatementID statement_id, int index, ValueType const& value); ALWAYS_INLINE sqlite3_stmt* prepared_statement(StatementID statement_id) { VERIFY(statement_id < m_prepared_statements.size()); return m_prepared_statements[statement_id]; } sqlite3* m_database { nullptr }; Vector m_prepared_statements; }; }