BTree.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. BTree::BTree(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, bool unique, Block::Index block_index)
  10. : Index(serializer, descriptor, unique, block_index)
  11. , m_root(nullptr)
  12. {
  13. }
  14. BTree::BTree(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, Block::Index block_index)
  15. : BTree(serializer, descriptor, true, block_index)
  16. {
  17. }
  18. BTreeIterator BTree::begin()
  19. {
  20. if (!m_root)
  21. initialize_root();
  22. VERIFY(m_root);
  23. return BTreeIterator(m_root, -1);
  24. }
  25. BTreeIterator BTree::end()
  26. {
  27. return BTreeIterator(nullptr, -1);
  28. }
  29. void BTree::initialize_root()
  30. {
  31. if (block_index()) {
  32. if (serializer().has_block(block_index())) {
  33. serializer().read_storage(block_index());
  34. m_root = serializer().make_and_deserialize<TreeNode>(*this, block_index());
  35. } else {
  36. m_root = make<TreeNode>(*this, nullptr, block_index());
  37. }
  38. } else {
  39. set_block_index(request_new_block_index());
  40. m_root = make<TreeNode>(*this, nullptr, block_index());
  41. if (on_new_root)
  42. on_new_root();
  43. }
  44. m_root->dump_if(0, "initialize_root");
  45. }
  46. TreeNode* BTree::new_root()
  47. {
  48. set_block_index(request_new_block_index());
  49. m_root = make<TreeNode>(*this, nullptr, m_root.leak_ptr(), block_index());
  50. serializer().serialize_and_write(*m_root.ptr());
  51. if (on_new_root)
  52. on_new_root();
  53. return m_root;
  54. }
  55. bool BTree::insert(Key const& key)
  56. {
  57. if (!m_root)
  58. initialize_root();
  59. return m_root->insert(key);
  60. }
  61. bool BTree::update_key_pointer(Key const& key)
  62. {
  63. if (!m_root)
  64. initialize_root();
  65. return m_root->update_key_pointer(key);
  66. }
  67. Optional<u32> BTree::get(Key& key)
  68. {
  69. if (!m_root)
  70. initialize_root();
  71. return m_root->get(key);
  72. }
  73. BTreeIterator BTree::find(Key const& key)
  74. {
  75. if (!m_root)
  76. initialize_root();
  77. for (auto node = m_root->node_for(key); node; node = node->up()) {
  78. for (auto ix = 0u; ix < node->size(); ix++) {
  79. auto match = (*node)[ix].match(key);
  80. if (match == 0)
  81. return BTreeIterator(node, (int)ix);
  82. else if (match > 0)
  83. return end();
  84. }
  85. }
  86. return end();
  87. }
  88. void BTree::list_tree()
  89. {
  90. if (!m_root)
  91. initialize_root();
  92. m_root->list_node(0);
  93. }
  94. }