29#include <osl/diagnose.h>
38OStoreBTreeNodeData::OStoreBTreeNodeData (sal_uInt16 nPageSize)
48 for (sal_uInt16
i = 1;
i <
n;
i++)
65 sal_Int32
const m = ((l + r) >> 1);
68 return static_cast<sal_uInt16
>(
m);
75 sal_uInt16
const k =
static_cast<sal_uInt16
>(r);
86 if ((
n <
m) && (
i <
m))
126 for (sal_uInt16
i =
n;
i <
m;
i++)
153 if (!rxPageL->querySplit())
162 xPageR->split (*rxPageL);
163 xPageR->depth (rxPageL->depth());
172 rxPageL->truncate (rxPageL->capacityCount() / 2);
182 xPage->insert (nIndexL + 1,
T(xPageR->m_pData[0].
m_aKey, aLink));
197 page & rPage = *xImpl;
204 T const aEntryL (rPage.m_pData[nIndexL]);
215 eErrCode = aNodeL.
remove (0, rEntryL, rBIOS);
221 if (xPageL->usageCount() == 0)
224 eErrCode = rBIOS.
free (xPageL->location());
229 rPage.remove (nIndexL);
236 rPage.m_pData[nIndexL].m_aKey = xPageL->m_pData[0].
m_aKey;
247 rEntryL = rPage.m_pData[nIndexL];
250 rPage.remove (nIndexL);
271 OSL_PRECOND(
m_xPage !=
nullptr,
"OStoreBTreeRootObject::testInvariant(): Null pointer");
283 eErrCode = construct<page>(rBIOS.
allocator());
292 testInvariant(
"OStoreBTreeRootObject::loadOrCreate(): leave");
304 sal_uInt32
const nRootAddr = xPage->location();
316 rxPageL->depth (xPage->depth() + 1);
317 rxPageL->m_pData[0] = xPage->m_pData[0];
318 rxPageL->m_pData[0].
m_aLink = xPage->location();
319 rxPageL->usageCount(1);
322 rxPageL.
swap (xPage);
324 std::shared_ptr<PageData> tmp (xPage.
get());
345 testInvariant(
"OStoreBTreeRootObject::find_lookup(): enter");
347 std::shared_ptr<PageData> tmp (
m_xPage);
348 tmp.swap (rNode.
get());
352 T const entry (rKey);
359 page const & rPage = *xPage;
360 sal_uInt16
const i = rPage.find(entry);
361 sal_uInt16
const n = rPage.usageCount();
369 sal_uInt32
const nAddr = rPage.m_pData[
i].m_aLink.
location();
383 page const & rPage = *xPage;
384 rIndex = rPage.find(entry);
385 if (rIndex >= rPage.usageCount())
392 SAL_WARN(
"store",
"store::BTreeRoot::find_lookup(): sort error");
397 testInvariant(
"OStoreBTreeRootObject::find_lookup(): leave");
411 testInvariant(
"OStoreBTreeRootObject::find_insert(): enter");
415 if (xRoot->querySplit())
425 eErrCode =
split (0, xPageL, rBIOS);
432 std::shared_ptr<PageData> tmp (
m_xPage);
433 tmp.swap (rNode.
get());
437 T const entry (rKey);
444 page const & rPage = *xPage;
445 sal_uInt16
const i = rPage.find (entry);
446 sal_uInt16
const n = rPage.usageCount();
454 sal_uInt32
const nAddr = rPage.m_pData[
i].m_aLink.
location();
469 if (xNext->querySplit())
472 eErrCode = rNode.
split (
i, xNext, rBIOS);
481 std::shared_ptr<PageData> tmp (aNext.
get());
482 tmp.swap (rNode.
get());
486 page const & rPage = *xPage;
487 rIndex = rPage.find(entry);
488 if (rIndex < rPage.usageCount())
494 SAL_WARN(
"store",
"store::BTreeRoot::find_insert(): sort error");
503 testInvariant(
"OStoreBTreeRootObject::find_insert(): leave");
virtual storeError guard(sal_uInt32 nAddr) override
storeError split(sal_uInt16 nIndexL, PageHolderObject< page > &rxPageL, OStorePageBIOS &rBIOS)
split.
virtual storeError verify(sal_uInt32 nAddr) const override
storeError remove(sal_uInt16 nIndexL, OStoreBTreeEntry &rEntryL, OStorePageBIOS &rBIOS)
remove (down to leaf node, recursive).
storeError loadOrCreate(sal_uInt32 nAddr, OStorePageBIOS &rBIOS)
storeError find_lookup(OStoreBTreeNodeObject &rNode, sal_uInt16 &rIndex, OStorePageKey const &rKey, OStorePageBIOS &rBIOS) const
find_lookup (w/o split()).
storeError change(PageHolderObject< page > &rxPageL, OStorePageBIOS &rBIOS)
change (Root).
storeError find_insert(OStoreBTreeNodeObject &rNode, sal_uInt16 &rIndex, OStorePageKey const &rKey, OStorePageBIOS &rBIOS)
find_insert (possibly with split()).
void testInvariant(char const *message) const
testInvariant.
rtl::Reference< PageData::Allocator > & allocator()
storeError saveObjectAt(OStorePageObject &rPage, sal_uInt32 nAddr)
storeError loadObjectAt(OStorePageObject &rPage, sal_uInt32 nAddr)
Page I/O.
storeError free(sal_uInt32 nAddr)
storeError allocate(OStorePageObject &rPage)
sal_uInt32 location() const
Location.
PageHolderObject< U > makeHolder() const
std::shared_ptr< PageData > & get()
std::shared_ptr< PageData > m_xPage
Representation.
bool construct(rtl::Reference< PageData::Allocator > const &rxAllocator)
void swap(PageHolderObject< T > &rhs)
static storeError verify(std::shared_ptr< PageData > const &rxPage, sal_uInt32 nAddr)
static storeError guard(std::shared_ptr< PageData > const &rxPage, sal_uInt32 nAddr)
std::shared_ptr< PageData > & get()
#define SAL_WARN_IF(condition, area, stream)
#define SAL_WARN(area, stream)
Old OStorePageCache implementation.
sal_uInt32 htonl(sal_uInt32 h)
sal_uInt16 htons(sal_uInt16 h)
CompareResult compare(const OStoreBTreeEntry &rOther) const
void split(const self &rPageL)
split (left half copied from right half of left page).
static const sal_uInt32 theTypeId
void remove(sal_uInt16 i)
sal_uInt16 capacityCount() const
capacityCount (must be even).
void truncate(sal_uInt16 n)
truncate (to n elements).
static const sal_uInt16 thePageSize
void insert(sal_uInt16 i, const T &t)
sal_uInt16 usageCount() const
sal_uInt16 find(const T &t) const
sal_uInt32 m_nMagic
Representation.
sal_uInt32 location() const
Operation.
G m_aGuard
Representation.
sal_uInt32 location() const
location.
storeError
Error Code enumeration.