/* * Copyright (c) 2022, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace Browser { class Database : public RefCounted { using OnResult = Function)>; using OnComplete = Function; using OnError = Function; public: static ErrorOr> create(); static ErrorOr> create(NonnullRefPtr); ErrorOr prepare_statement(StringView statement); template void execute_statement(SQL::StatementID statement_id, OnResult on_result, OnComplete on_complete, OnError on_error, PlaceholderValues&&... placeholder_values) { PendingExecution pending_execution { .on_result = move(on_result), .on_complete = move(on_complete), .on_error = move(on_error), }; Vector values { SQL::Value(forward(placeholder_values))... }; execute_statement(statement_id, move(values), move(pending_execution)); } private: struct ExecutionKey { constexpr bool operator==(ExecutionKey const&) const = default; SQL::StatementID statement_id { 0 }; SQL::ExecutionID execution_id { 0 }; }; struct PendingExecution { OnResult on_result { nullptr }; OnComplete on_complete { nullptr }; OnError on_error { nullptr }; }; struct ExecutionKeyTraits : public Traits { static constexpr unsigned hash(ExecutionKey const& key) { return pair_int_hash(u64_hash(key.statement_id), u64_hash(key.execution_id)); } }; Database(NonnullRefPtr sql_client, SQL::ConnectionID connection_id); void execute_statement(SQL::StatementID statement_id, Vector placeholder_values, PendingExecution pending_execution); NonnullRefPtr m_sql_client; SQL::ConnectionID m_connection_id { 0 }; HashMap m_pending_executions; }; }