BTree.cpp 2.4 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 <AK/Format.h>
  7. #include <LibSQL/BTree.h>
  8. #include <LibSQL/Meta.h>
  9. namespace SQL {
  10. BTree::BTree(Heap& heap, NonnullRefPtr<TupleDescriptor> const& descriptor, bool unique, u32 pointer)
  11. : Index(heap, descriptor, unique, pointer)
  12. , m_root(nullptr)
  13. {
  14. }
  15. BTree::BTree(Heap& heap, NonnullRefPtr<TupleDescriptor> const& descriptor, u32 pointer)
  16. : BTree(heap, descriptor, true, pointer)
  17. {
  18. }
  19. BTreeIterator BTree::begin()
  20. {
  21. if (!m_root)
  22. initialize_root();
  23. VERIFY(m_root);
  24. return BTreeIterator(m_root, -1);
  25. }
  26. BTreeIterator BTree::end()
  27. {
  28. return BTreeIterator(nullptr, -1);
  29. }
  30. void BTree::initialize_root()
  31. {
  32. if (pointer()) {
  33. if (pointer() < heap().size()) {
  34. auto buffer = read_block(pointer());
  35. size_t offset = 0;
  36. m_root = make<TreeNode>(*this, nullptr, pointer(), buffer, offset);
  37. } else {
  38. m_root = make<TreeNode>(*this, nullptr, pointer());
  39. }
  40. } else {
  41. set_pointer(new_record_pointer());
  42. m_root = make<TreeNode>(*this, nullptr, pointer());
  43. if (on_new_root)
  44. on_new_root();
  45. }
  46. }
  47. TreeNode* BTree::new_root()
  48. {
  49. set_pointer(new_record_pointer());
  50. m_root = make<TreeNode>(*this, nullptr, m_root.leak_ptr(), pointer());
  51. add_to_write_ahead_log(m_root->as_index_node());
  52. if (on_new_root)
  53. on_new_root();
  54. return m_root;
  55. }
  56. bool BTree::insert(Key const& key)
  57. {
  58. if (!m_root)
  59. initialize_root();
  60. VERIFY(m_root);
  61. return m_root->insert(key);
  62. }
  63. bool BTree::update_key_pointer(Key const& key)
  64. {
  65. if (!m_root)
  66. initialize_root();
  67. VERIFY(m_root);
  68. return m_root->update_key_pointer(key);
  69. }
  70. Optional<u32> BTree::get(Key& key)
  71. {
  72. if (!m_root)
  73. initialize_root();
  74. VERIFY(m_root);
  75. return m_root->get(key);
  76. }
  77. BTreeIterator BTree::find(Key const& key)
  78. {
  79. if (!m_root)
  80. initialize_root();
  81. VERIFY(m_root);
  82. for (auto node = m_root->node_for(key); node; node = node->up()) {
  83. for (auto ix = 0u; ix < node->size(); ix++) {
  84. auto match = (*node)[ix].match(key);
  85. if (match == 0)
  86. return BTreeIterator(node, (int)ix);
  87. else if (match > 0)
  88. return end();
  89. }
  90. }
  91. return end();
  92. }
  93. void BTree::list_tree()
  94. {
  95. if (!m_root)
  96. initialize_root();
  97. m_root->list_node(0);
  98. }
  99. }