/* * Copyright (c) 2022-2026, Tim Flynn * Copyright (c) 2023, Jelle Raaijmakers * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include struct sqlite3; struct sqlite3_stmt; namespace Database { class DATABASE_API Database : public RefCounted { public: static ErrorOr> create_memory_backed(); static ErrorOr> create(ByteString const& directory, StringView name); ~Database(); using OnResult = Function; Optional const& database_path() const { return m_database_path; } ErrorOr prepare_statement(StringView statement); void execute_statement(StatementID statement_id, OnResult on_result) { VERIFY(bound_parameter_count(statement_id) == 0); execute_statement_internal(statement_id, move(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)), ...); VERIFY(bound_parameter_count(statement_id) == index - 1); execute_statement_internal(statement_id, move(on_result)); } template ValueType result_column(StatementID, int column); // https://www.sqlite.org/pragma.html#pragma_journal_mode enum class JournalMode { Delete, Truncate, Persist, Memory, WriteAheadLog, Off, }; ErrorOr set_journal_mode_pragma(JournalMode); // https://www.sqlite.org/pragma.html#pragma_synchronous enum class Synchronous { Off, Normal, Full, Extra, }; ErrorOr set_synchronous_pragma(Synchronous); private: static ErrorOr> create(sqlite3*, Optional database_path = {}); Database(sqlite3*, Optional database_path); void execute_statement_internal(StatementID, OnResult); int bound_parameter_count(StatementID); 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]; } Optional m_database_path; sqlite3* m_database { nullptr }; Vector m_prepared_statements; }; }