/* * 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 #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; ResultOr open(); bool is_open() const { return m_open; } ErrorOr commit(); ResultOr add_schema(SchemaDef const&); static Key get_schema_key(DeprecatedString const&); ResultOr> get_schema(DeprecatedString const&); ResultOr add_table(TableDef& table); static Key get_table_key(DeprecatedString const&, DeprecatedString const&); ResultOr> get_table(DeprecatedString const&, DeprecatedString const&); ErrorOr> select_all(TableDef&); ErrorOr> match(TableDef&, Key const&); ErrorOr insert(Row&); ErrorOr remove(Row&); ErrorOr update(Row&); private: explicit Database(DeprecatedString); 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; }; }