BTree.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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, u32 pointer)
  10. : Index(serializer, descriptor, unique, pointer)
  11. , m_root(nullptr)
  12. {
  13. }
  14. BTree::BTree(Serializer& serializer, NonnullRefPtr<TupleDescriptor> const& descriptor, u32 pointer)
  15. : BTree(serializer, descriptor, true, pointer)
  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 (pointer()) {
  32. if (serializer().has_block(pointer())) {
  33. serializer().get_block(pointer());
  34. m_root = serializer().make_and_deserialize<TreeNode>(*this, pointer());
  35. } else {
  36. m_root = make<TreeNode>(*this, nullptr, pointer());
  37. }
  38. } else {
  39. set_pointer(new_record_pointer());
  40. m_root = make<TreeNode>(*this, nullptr, pointer());
  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_pointer(new_record_pointer());
  49. m_root = make<TreeNode>(*this, nullptr, m_root.leak_ptr(), pointer());
  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. VERIFY(m_root);
  60. return m_root->insert(key);
  61. }
  62. bool BTree::update_key_pointer(Key const& key)
  63. {
  64. if (!m_root)
  65. initialize_root();
  66. VERIFY(m_root);
  67. return m_root->update_key_pointer(key);
  68. }
  69. Optional<u32> BTree::get(Key& key)
  70. {
  71. if (!m_root)
  72. initialize_root();
  73. VERIFY(m_root);
  74. return m_root->get(key);
  75. }
  76. BTreeIterator BTree::find(Key const& key)
  77. {
  78. if (!m_root)
  79. initialize_root();
  80. VERIFY(m_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. }