/* * Copyright (c) 2021, Jan de Visser * Copyright (c) 2021, Mahmoud Mandour * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace SQL { /** * A Database object logically connects a Heap with the SQL data we want * to store in it. It has BTree pointers for B-Trees holding the definitions * of tables, columns, indexes, and other SQL objects. */ class Database : public Core::Object { C_OBJECT(Database); public: ~Database() override; ErrorOr open(); bool is_open() const { return m_open; } ErrorOr commit(); ErrorOr add_schema(SchemaDef const&); static Key get_schema_key(String const&); ErrorOr> get_schema(String const&); ErrorOr add_table(TableDef& table); static Key get_table_key(String const&, String const&); ErrorOr> get_table(String const&, String const&); ErrorOr> select_all(TableDef const&); ErrorOr> match(TableDef const&, Key const&); ErrorOr insert(Row&); ErrorOr update(Row&); private: explicit Database(String); bool m_open { false }; NonnullRefPtr m_heap; Serializer m_serializer; RefPtr m_schemas; RefPtr m_tables; RefPtr m_table_columns; HashMap> m_schema_cache; HashMap> m_table_cache; }; }