diff options
Diffstat (limited to 'connectivity/source/inc/dbase/dindexnode.hxx')
-rw-r--r-- | connectivity/source/inc/dbase/dindexnode.hxx | 530 |
1 files changed, 265 insertions, 265 deletions
diff --git a/connectivity/source/inc/dbase/dindexnode.hxx b/connectivity/source/inc/dbase/dindexnode.hxx index c1db23f76b60..181c6ff74322 100644 --- a/connectivity/source/inc/dbase/dindexnode.hxx +++ b/connectivity/source/inc/dbase/dindexnode.hxx @@ -28,277 +28,277 @@ class SvStream; namespace connectivity::dbase +{ + + class ONDXNode; + class ODbaseIndex; + + // Index Key + + typedef file::OOperand ONDXKey_BASE; + class ONDXKey : public ONDXKey_BASE { + friend class ONDXNode; + sal_uInt32 nRecord; /* Record pointer */ + ORowSetValue xValue; /* Key values */ + + public: + ONDXKey(); + ONDXKey(ORowSetValue aVal, sal_Int32 eType, sal_uInt32 nRec); + ONDXKey(const OUString& aStr, sal_uInt32 nRec); + ONDXKey(double aVal, sal_uInt32 nRec); + + inline ONDXKey(const ONDXKey& rKey); + + inline ONDXKey& operator= (const ONDXKey& rKey); + virtual void setValue(const ORowSetValue& _rVal) override; + + virtual const ORowSetValue& getValue() const override; + + sal_uInt32 GetRecord() const { return nRecord; } + void setRecord(sal_uInt32 _nRec) { nRecord = _nRec; } + void ResetRecord() { nRecord = 0; } + + bool operator == (const ONDXKey& rKey) const; + bool operator != (const ONDXKey& rKey) const; + bool operator < (const ONDXKey& rKey) const; + bool operator <= (const ONDXKey& rKey) const; + bool operator > (const ONDXKey& rKey) const; + + static bool IsText(sal_Int32 eType); - class ONDXNode; - class ODbaseIndex; - - // Index Key - - typedef file::OOperand ONDXKey_BASE; - class ONDXKey : public ONDXKey_BASE - { - friend class ONDXNode; - sal_uInt32 nRecord; /* Record pointer */ - ORowSetValue xValue; /* Key values */ - - public: - ONDXKey(); - ONDXKey(ORowSetValue aVal, sal_Int32 eType, sal_uInt32 nRec); - ONDXKey(const OUString& aStr, sal_uInt32 nRec); - ONDXKey(double aVal, sal_uInt32 nRec); - - inline ONDXKey(const ONDXKey& rKey); - - inline ONDXKey& operator= (const ONDXKey& rKey); - virtual void setValue(const ORowSetValue& _rVal) override; - - virtual const ORowSetValue& getValue() const override; - - sal_uInt32 GetRecord() const { return nRecord; } - void setRecord(sal_uInt32 _nRec) { nRecord = _nRec; } - void ResetRecord() { nRecord = 0; } - - bool operator == (const ONDXKey& rKey) const; - bool operator != (const ONDXKey& rKey) const; - bool operator < (const ONDXKey& rKey) const; - bool operator <= (const ONDXKey& rKey) const; - bool operator > (const ONDXKey& rKey) const; - - static bool IsText(sal_Int32 eType); - - private: - int Compare(const ONDXKey& rKey) const; - }; - - - class ONDXPage; - - // Index Page Pointer - // This is ref-count pointer class - class ONDXPagePtr - { - friend SvStream& WriteONDXPagePtr(SvStream &rStream, const ONDXPagePtr&); - friend SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); - - ONDXPage* mpPage; - sal_uInt32 nPagePos; // Position in the index file - - public: - ONDXPagePtr(); - ONDXPagePtr(ONDXPagePtr&& rObj) noexcept; - ONDXPagePtr(ONDXPagePtr const & rRef); - ONDXPagePtr(ONDXPage* pRefPage); - ~ONDXPagePtr(); - void Clear(); - ONDXPagePtr& operator=(ONDXPagePtr const & rRef); - ONDXPagePtr& operator=(ONDXPagePtr && rRef); - bool Is() const { return mpPage != nullptr; } - - ONDXPage * operator ->() const { assert(mpPage != nullptr); return mpPage; } - operator ONDXPage *() const { return mpPage; } - - sal_uInt32 GetPagePos() const {return nPagePos;} - bool HasPage() const {return nPagePos != 0;} - }; - - // Index Page - // This is a ref-counted class, with re-cycling - class ONDXPage - { - friend class ODbaseIndex; - friend class ONDXPagePtr; - - friend SvStream& WriteONDXPage(SvStream &rStream, const ONDXPage&); - friend SvStream& operator >> (SvStream &rStream, ONDXPage&); - - // work around a clang 3.5 optimization bug: if the bNoDelete is *first* - // it mis-compiles "if (--nRefCount == 0)" and never deletes any object - unsigned int nRefCount : 31; - // the only reason this is not bool is because MSVC cannot handle mixed type bitfields - unsigned int bNoDelete : 1; - sal_uInt32 nPagePos; // Position in the index file - bool bModified : 1; - sal_uInt16 nCount; - - ONDXPagePtr aParent, // Parent page - aChild; // Pointer to the right child page - ODbaseIndex& rIndex; - std::unique_ptr<ONDXNode[]> - ppNodes; // Array of nodes - - public: - // Node operations - sal_uInt16 Count() const {return nCount;} - - bool Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft = 0); - bool Insert(sal_uInt16 nIndex, ONDXNode& rNode); - bool Append(ONDXNode& rNode); - void Delete(sal_uInt16); - void Remove(sal_uInt16); - void Release(bool bSave = true); - void ReleaseFull(); - - // Split and merge - ONDXNode Split(ONDXPage& rPage); - void Merge(sal_uInt16 nParentNodePos, const ONDXPagePtr& xPage); - - // Access operators - ONDXNode& operator[] (sal_uInt16 nPos); - const ONDXNode& operator[] (sal_uInt16 nPos) const; - - bool IsRoot() const; - bool IsLeaf() const; - bool IsModified() const; - bool HasParent() const; - - bool IsFull() const; - - sal_uInt32 GetPagePos() const {return nPagePos;} - ONDXPagePtr& GetChild(ODbaseIndex const * pIndex = nullptr); - - // Parent does not need to be reloaded - const ONDXPagePtr& GetParent() const; - ODbaseIndex& GetIndex() {return rIndex;} - const ODbaseIndex& GetIndex() const {return rIndex;} - - // Setting the child, via reference to retain the PagePos - void SetChild(const ONDXPagePtr& rCh); - void SetParent(const ONDXPagePtr& rPa); - - sal_uInt16 Search(const ONDXKey& rSearch); - sal_uInt16 Search(const ONDXPage* pPage); - void SearchAndReplace(const ONDXKey& rSearch, ONDXKey const & rReplace); - - protected: - ONDXPage(ODbaseIndex& rIndex, sal_uInt32 nPos, ONDXPage*); - ~ONDXPage(); - - void ReleaseRef(); - void QueryDelete(); - void AddNextRef() - { - assert( nRefCount < (1 << 30) && "Do not add refs to dead objects" ); - ++nRefCount; - } - void AddFirstRef() - { - assert( nRefCount < (1 << 30) && "Do not add refs to dead objects" ); - if( bNoDelete ) - bNoDelete = 0; - ++nRefCount; - } - - void SetModified(bool bMod) {bModified = bMod;} - void SetPagePos(sal_uInt32 nPage) {nPagePos = nPage;} - - bool Find(const ONDXKey&); // Descend recursively - sal_uInt16 FindPos(const ONDXKey& rKey) const; + private: + int Compare(const ONDXKey& rKey) const; + }; + + + class ONDXPage; + + // Index Page Pointer + // This is ref-count pointer class + class ONDXPagePtr + { + friend SvStream& WriteONDXPagePtr(SvStream &rStream, const ONDXPagePtr&); + friend SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); + + ONDXPage* mpPage; + sal_uInt32 nPagePos; // Position in the index file + + public: + ONDXPagePtr(); + ONDXPagePtr(ONDXPagePtr&& rObj) noexcept; + ONDXPagePtr(ONDXPagePtr const & rRef); + ONDXPagePtr(ONDXPage* pRefPage); + ~ONDXPagePtr(); + void Clear(); + ONDXPagePtr& operator=(ONDXPagePtr const & rRef); + ONDXPagePtr& operator=(ONDXPagePtr && rRef); + bool Is() const { return mpPage != nullptr; } + + ONDXPage * operator ->() const { assert(mpPage != nullptr); return mpPage; } + operator ONDXPage *() const { return mpPage; } + + sal_uInt32 GetPagePos() const {return nPagePos;} + bool HasPage() const {return nPagePos != 0;} + }; + + // Index Page + // This is a ref-counted class, with re-cycling + class ONDXPage + { + friend class ODbaseIndex; + friend class ONDXPagePtr; + + friend SvStream& WriteONDXPage(SvStream &rStream, const ONDXPage&); + friend SvStream& operator >> (SvStream &rStream, ONDXPage&); + + // work around a clang 3.5 optimization bug: if the bNoDelete is *first* + // it mis-compiles "if (--nRefCount == 0)" and never deletes any object + unsigned int nRefCount : 31; + // the only reason this is not bool is because MSVC cannot handle mixed type bitfields + unsigned int bNoDelete : 1; + sal_uInt32 nPagePos; // Position in the index file + bool bModified : 1; + sal_uInt16 nCount; + + ONDXPagePtr aParent, // Parent page + aChild; // Pointer to the right child page + ODbaseIndex& rIndex; + std::unique_ptr<ONDXNode[]> + ppNodes; // Array of nodes + + public: + // Node operations + sal_uInt16 Count() const {return nCount;} + + bool Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft = 0); + bool Insert(sal_uInt16 nIndex, ONDXNode& rNode); + bool Append(ONDXNode& rNode); + void Delete(sal_uInt16); + void Remove(sal_uInt16); + void Release(bool bSave = true); + void ReleaseFull(); + + // Split and merge + ONDXNode Split(ONDXPage& rPage); + void Merge(sal_uInt16 nParentNodePos, const ONDXPagePtr& xPage); + + // Access operators + ONDXNode& operator[] (sal_uInt16 nPos); + const ONDXNode& operator[] (sal_uInt16 nPos) const; + + bool IsRoot() const; + bool IsLeaf() const; + bool IsModified() const; + bool HasParent() const; + + bool IsFull() const; + + sal_uInt32 GetPagePos() const {return nPagePos;} + ONDXPagePtr& GetChild(ODbaseIndex const * pIndex = nullptr); + + // Parent does not need to be reloaded + const ONDXPagePtr& GetParent() const; + ODbaseIndex& GetIndex() {return rIndex;} + const ODbaseIndex& GetIndex() const {return rIndex;} + + // Setting the child, via reference to retain the PagePos + void SetChild(const ONDXPagePtr& rCh); + void SetParent(const ONDXPagePtr& rPa); + + sal_uInt16 Search(const ONDXKey& rSearch); + sal_uInt16 Search(const ONDXPage* pPage); + void SearchAndReplace(const ONDXKey& rSearch, ONDXKey const & rReplace); + + protected: + ONDXPage(ODbaseIndex& rIndex, sal_uInt32 nPos, ONDXPage*); + ~ONDXPage(); + + void ReleaseRef(); + void QueryDelete(); + void AddNextRef() + { + assert( nRefCount < (1 << 30) && "Do not add refs to dead objects" ); + ++nRefCount; + } + void AddFirstRef() + { + assert( nRefCount < (1 << 30) && "Do not add refs to dead objects" ); + if( bNoDelete ) + bNoDelete = 0; + ++nRefCount; + } + + void SetModified(bool bMod) {bModified = bMod;} + void SetPagePos(sal_uInt32 nPage) {nPagePos = nPage;} + + bool Find(const ONDXKey&); // Descend recursively + sal_uInt16 FindPos(const ONDXKey& rKey) const; #if OSL_DEBUG_LEVEL > 1 - void PrintPage(); + void PrintPage(); #endif - }; - - SvStream& WriteONDXPagePtr(SvStream &rStream, const ONDXPagePtr&); - SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); - - inline bool ONDXPage::IsRoot() const {return !aParent.Is();} - inline bool ONDXPage::IsLeaf() const {return !aChild.HasPage();} - inline bool ONDXPage::IsModified() const {return bModified;} - inline bool ONDXPage::HasParent() const {return aParent.Is();} - inline const ONDXPagePtr& ONDXPage::GetParent() const {return aParent;} - - inline void ONDXPage::SetParent(const ONDXPagePtr& rPa = ONDXPagePtr()) - { - aParent = rPa; - } - - inline void ONDXPage::SetChild(const ONDXPagePtr& rCh = ONDXPagePtr()) - { - aChild = rCh; - if (aChild.Is()) - aChild->SetParent(this); - } - SvStream& operator >> (SvStream &rStream, ONDXPage& rPage); - SvStream& WriteONDXPage(SvStream &rStream, const ONDXPage& rPage); - - - // Index Node - - class ONDXNode - { - friend class ONDXPage; - ONDXPagePtr aChild; /* Next page reference */ - ONDXKey aKey; - - public: - ONDXNode(){} - ONDXNode(const ONDXKey& rKey) - :aKey(rKey) {} - - // Does the node point to a page? - bool HasChild() const {return aChild.HasPage();} - // If an index is provided, we may be able to retrieve the page - ONDXPagePtr& GetChild(ODbaseIndex* pIndex = nullptr, ONDXPage* = nullptr); - - const ONDXKey& GetKey() const { return aKey;} - ONDXKey& GetKey() { return aKey;} - - // Setting the child, via reference to retain the PagePos - void SetChild(const ONDXPagePtr& rCh = ONDXPagePtr(), ONDXPage* = nullptr); - - void Write(SvStream &rStream, const ONDXPage& rPage) const; - void Read(SvStream &rStream, ODbaseIndex const &); - }; - - inline ONDXKey::ONDXKey(const ONDXKey& rKey) - : ONDXKey_BASE(rKey.getDBType()) - ,nRecord(rKey.nRecord) - ,xValue(rKey.xValue) - { - } - - inline ONDXKey& ONDXKey::operator=(const ONDXKey& rKey) - { - if(&rKey == this) - return *this; - - xValue = rKey.xValue; - nRecord = rKey.nRecord; - m_eDBType = rKey.getDBType(); + }; + + SvStream& WriteONDXPagePtr(SvStream &rStream, const ONDXPagePtr&); + SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); + + inline bool ONDXPage::IsRoot() const {return !aParent.Is();} + inline bool ONDXPage::IsLeaf() const {return !aChild.HasPage();} + inline bool ONDXPage::IsModified() const {return bModified;} + inline bool ONDXPage::HasParent() const {return aParent.Is();} + inline const ONDXPagePtr& ONDXPage::GetParent() const {return aParent;} + + inline void ONDXPage::SetParent(const ONDXPagePtr& rPa = ONDXPagePtr()) + { + aParent = rPa; + } + + inline void ONDXPage::SetChild(const ONDXPagePtr& rCh = ONDXPagePtr()) + { + aChild = rCh; + if (aChild.Is()) + aChild->SetParent(this); + } + SvStream& operator >> (SvStream &rStream, ONDXPage& rPage); + SvStream& WriteONDXPage(SvStream &rStream, const ONDXPage& rPage); + + + // Index Node + + class ONDXNode + { + friend class ONDXPage; + ONDXPagePtr aChild; /* Next page reference */ + ONDXKey aKey; + + public: + ONDXNode(){} + ONDXNode(const ONDXKey& rKey) + :aKey(rKey) {} + + // Does the node point to a page? + bool HasChild() const {return aChild.HasPage();} + // If an index is provided, we may be able to retrieve the page + ONDXPagePtr& GetChild(ODbaseIndex* pIndex = nullptr, ONDXPage* = nullptr); + + const ONDXKey& GetKey() const { return aKey;} + ONDXKey& GetKey() { return aKey;} + + // Setting the child, via reference to retain the PagePos + void SetChild(const ONDXPagePtr& rCh = ONDXPagePtr(), ONDXPage* = nullptr); + + void Write(SvStream &rStream, const ONDXPage& rPage) const; + void Read(SvStream &rStream, ODbaseIndex const &); + }; + + inline ONDXKey::ONDXKey(const ONDXKey& rKey) + : ONDXKey_BASE(rKey.getDBType()) + ,nRecord(rKey.nRecord) + ,xValue(rKey.xValue) + { + } + + inline ONDXKey& ONDXKey::operator=(const ONDXKey& rKey) + { + if(&rKey == this) return *this; - } - - inline bool ONDXKey::operator == (const ONDXKey& rKey) const - { - if(&rKey == this) - return true; - return Compare(rKey) == 0; - } - inline bool ONDXKey::operator != (const ONDXKey& rKey) const - { - return !operator== (rKey); - } - inline bool ONDXKey::operator < (const ONDXKey& rKey) const - { - return Compare(rKey) < 0; - } - inline bool ONDXKey::operator > (const ONDXKey& rKey) const - { - return Compare(rKey) > 0; - } - inline bool ONDXKey::operator <= (const ONDXKey& rKey) const - { - return !operator > (rKey); - } - - inline void ONDXNode::SetChild(const ONDXPagePtr& rCh, ONDXPage* pParent) - { - aChild = rCh; - if (aChild.Is()) - aChild->SetParent(pParent); - } + + xValue = rKey.xValue; + nRecord = rKey.nRecord; + m_eDBType = rKey.getDBType(); + return *this; + } + + inline bool ONDXKey::operator == (const ONDXKey& rKey) const + { + if(&rKey == this) + return true; + return Compare(rKey) == 0; + } + inline bool ONDXKey::operator != (const ONDXKey& rKey) const + { + return !operator== (rKey); + } + inline bool ONDXKey::operator < (const ONDXKey& rKey) const + { + return Compare(rKey) < 0; + } + inline bool ONDXKey::operator > (const ONDXKey& rKey) const + { + return Compare(rKey) > 0; + } + inline bool ONDXKey::operator <= (const ONDXKey& rKey) const + { + return !operator > (rKey); + } + + inline void ONDXNode::SetChild(const ONDXPagePtr& rCh, ONDXPage* pParent) + { + aChild = rCh; + if (aChild.Is()) + aChild->SetParent(pParent); + } } |