diff --git a/Tests/LibSQL/TestSqlBtreeIndex.cpp b/Tests/LibSQL/TestSqlBtreeIndex.cpp index 45cde7441ac..c46eb8b6cca 100644 --- a/Tests/LibSQL/TestSqlBtreeIndex.cpp +++ b/Tests/LibSQL/TestSqlBtreeIndex.cpp @@ -134,7 +134,7 @@ NonnullRefPtr setup_btree(SQL::Serializer& serializer) root_pointer = serializer.heap().request_new_block_index(); serializer.heap().set_user_value(0, root_pointer); } - auto btree = SQL::BTree::construct(serializer, tuple_descriptor, true, root_pointer); + auto btree = MUST(SQL::BTree::create(serializer, tuple_descriptor, true, root_pointer)); btree->on_new_root = [&]() { serializer.heap().set_user_value(0, btree->root()); }; diff --git a/Userland/Libraries/LibSQL/BTree.cpp b/Userland/Libraries/LibSQL/BTree.cpp index 230790bcd2c..23f0fdbab3c 100644 --- a/Userland/Libraries/LibSQL/BTree.cpp +++ b/Userland/Libraries/LibSQL/BTree.cpp @@ -9,17 +9,22 @@ namespace SQL { +ErrorOr> BTree::create(Serializer& serializer, NonnullRefPtr const& descriptor, bool unique, Block::Index block_index) +{ + return adopt_nonnull_ref_or_enomem(new (nothrow) BTree(serializer, descriptor, unique, block_index)); +} + +ErrorOr> BTree::create(Serializer& serializer, NonnullRefPtr const& descriptor, Block::Index block_index) +{ + return create(serializer, descriptor, true, block_index); +} + BTree::BTree(Serializer& serializer, NonnullRefPtr const& descriptor, bool unique, Block::Index block_index) : Index(serializer, descriptor, unique, block_index) , m_root(nullptr) { } -BTree::BTree(Serializer& serializer, NonnullRefPtr const& descriptor, Block::Index block_index) - : BTree(serializer, descriptor, true, block_index) -{ -} - BTreeIterator BTree::begin() { if (!m_root) diff --git a/Userland/Libraries/LibSQL/BTree.h b/Userland/Libraries/LibSQL/BTree.h index 3e01a5235ef..4dc1fd1f050 100644 --- a/Userland/Libraries/LibSQL/BTree.h +++ b/Userland/Libraries/LibSQL/BTree.h @@ -92,10 +92,9 @@ private: }; class BTree : public Index { - C_OBJECT(BTree); - public: - ~BTree() override = default; + static ErrorOr> create(Serializer&, NonnullRefPtr const&, bool unique, Block::Index); + static ErrorOr> create(Serializer&, NonnullRefPtr const&, Block::Index); Block::Index root() const { return m_root ? m_root->block_index() : 0; } bool insert(Key const&); @@ -110,7 +109,6 @@ public: private: BTree(Serializer&, NonnullRefPtr const&, bool unique, Block::Index); - BTree(Serializer&, NonnullRefPtr const&, Block::Index); void initialize_root(); TreeNode* new_root(); OwnPtr m_root { nullptr }; diff --git a/Userland/Libraries/LibSQL/Database.cpp b/Userland/Libraries/LibSQL/Database.cpp index d56a9908fcf..123f0b641cb 100644 --- a/Userland/Libraries/LibSQL/Database.cpp +++ b/Userland/Libraries/LibSQL/Database.cpp @@ -32,17 +32,17 @@ ResultOr Database::open() VERIFY(!m_open); TRY(m_heap->open()); - m_schemas = BTree::construct(m_serializer, SchemaDef::index_def()->to_tuple_descriptor(), m_heap->schemas_root()); + m_schemas = TRY(BTree::create(m_serializer, SchemaDef::index_def()->to_tuple_descriptor(), m_heap->schemas_root())); m_schemas->on_new_root = [&]() { m_heap->set_schemas_root(m_schemas->root()); }; - m_tables = BTree::construct(m_serializer, TableDef::index_def()->to_tuple_descriptor(), m_heap->tables_root()); + m_tables = TRY(BTree::create(m_serializer, TableDef::index_def()->to_tuple_descriptor(), m_heap->tables_root())); m_tables->on_new_root = [&]() { m_heap->set_tables_root(m_tables->root()); }; - m_table_columns = BTree::construct(m_serializer, ColumnDef::index_def()->to_tuple_descriptor(), m_heap->table_columns_root()); + m_table_columns = TRY(BTree::create(m_serializer, ColumnDef::index_def()->to_tuple_descriptor(), m_heap->table_columns_root())); m_table_columns->on_new_root = [&]() { m_heap->set_table_columns_root(m_table_columns->root()); }; diff --git a/Userland/Libraries/LibSQL/Index.h b/Userland/Libraries/LibSQL/Index.h index e10c1459e14..804f3904485 100644 --- a/Userland/Libraries/LibSQL/Index.h +++ b/Userland/Libraries/LibSQL/Index.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include #include @@ -31,11 +31,9 @@ private: Block::Index m_block_index; }; -class Index : public Core::EventReceiver { - C_OBJECT_ABSTRACT(Index); - +class Index : public RefCounted { public: - ~Index() override = default; + virtual ~Index() = default; NonnullRefPtr descriptor() const { return m_descriptor; } [[nodiscard]] bool duplicates_allowed() const { return !m_unique; }