BTree.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibSQL/BTree.h>
  7. #include <LibSQL/Meta.h>
  8. namespace SQL {
  9. ErrorOr<NonnullRefPtr<BTree>> BTree::create(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, bool unique, Block::Index block_index)
  10. {
  11. return adopt_nonnull_ref_or_enomem(new (nothrow) BTree(serializer, descriptor, unique, block_index));
  12. }
  13. ErrorOr<NonnullRefPtr<BTree>> BTree::create(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, Block::Index block_index)
  14. {
  15. return create(serializer, descriptor, true, block_index);
  16. }
  17. BTree::BTree(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, bool unique, Block::Index block_index)
  18. : Index(serializer, descriptor, unique, block_index)
  19. , m_root(nullptr)
  20. {
  21. }
  22. BTreeIterator BTree::begin()
  23. {
  24. if (!m_root)
  25. initialize_root();
  26. VERIFY(m_root);
  27. return BTreeIterator(m_root, -1);
  28. }
  29. BTreeIterator BTree::end()
  30. {
  31. return BTreeIterator(nullptr, -1);
  32. }
  33. void BTree::initialize_root()
  34. {
  35. if (block_index()) {
  36. if (serializer().has_block(block_index())) {
  37. serializer().read_storage(block_index());
  38. m_root = serializer().make_and_deserialize<TreeNode>(*this, block_index());
  39. } else {
  40. m_root = make<TreeNode>(*this, nullptr, block_index());
  41. }
  42. } else {
  43. set_block_index(request_new_block_index());
  44. m_root = make<TreeNode>(*this, nullptr, block_index());
  45. if (on_new_root)
  46. on_new_root();
  47. }
  48. m_root->dump_if(0, "initialize_root");
  49. }
  50. TreeNode* BTree::new_root()
  51. {
  52. set_block_index(request_new_block_index());
  53. m_root = make<TreeNode>(*this, nullptr, m_root.leak_ptr(), block_index());
  54. serializer().serialize_and_write(*m_root.ptr());
  55. if (on_new_root)
  56. on_new_root();
  57. return m_root;
  58. }
  59. bool BTree::insert(Key const& key)
  60. {
  61. if (!m_root)
  62. initialize_root();
  63. return m_root->insert(key);
  64. }
  65. bool BTree::update_key_pointer(Key const& key)
  66. {
  67. if (!m_root)
  68. initialize_root();
  69. return m_root->update_key_pointer(key);
  70. }
  71. Optional<u32> BTree::get(Key& key)
  72. {
  73. if (!m_root)
  74. initialize_root();
  75. return m_root->get(key);
  76. }
  77. BTreeIterator BTree::find(Key const& key)
  78. {
  79. if (!m_root)
  80. initialize_root();
  81. for (auto node = m_root->node_for(key); node; node = node->up()) {
  82. for (auto ix = 0u; ix < node->size(); ix++) {
  83. auto match = (*node)[ix].match(key);
  84. if (match == 0)
  85. return BTreeIterator(node, (int)ix);
  86. else if (match > 0)
  87. return end();
  88. }
  89. }
  90. return end();
  91. }
  92. void BTree::list_tree()
  93. {
  94. if (!m_root)
  95. initialize_root();
  96. m_root->list_node(0);
  97. }
  98. }