1*caf5cd79SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*caf5cd79SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*caf5cd79SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*caf5cd79SAndrew Rist * distributed with this work for additional information 6*caf5cd79SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*caf5cd79SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*caf5cd79SAndrew Rist * "License"); you may not use this file except in compliance 9*caf5cd79SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*caf5cd79SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*caf5cd79SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*caf5cd79SAndrew Rist * software distributed under the License is distributed on an 15*caf5cd79SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*caf5cd79SAndrew Rist * KIND, either express or implied. See the License for the 17*caf5cd79SAndrew Rist * specific language governing permissions and limitations 18*caf5cd79SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*caf5cd79SAndrew Rist *************************************************************/ 21*caf5cd79SAndrew Rist 22*caf5cd79SAndrew Rist 23cdf0e10cSrcweir #ifndef _CONNECTIVITY_DBASE_INDEXNODE_HXX_ 24cdf0e10cSrcweir #define _CONNECTIVITY_DBASE_INDEXNODE_HXX_ 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "file/fcode.hxx" 27cdf0e10cSrcweir #include "file/FTable.hxx" 28cdf0e10cSrcweir #include "dbase/DIndexPage.hxx" 29cdf0e10cSrcweir #include "connectivity/FValue.hxx" 30cdf0e10cSrcweir #include <tools/ref.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #define NODE_NOTFOUND 0xFFFF 33cdf0e10cSrcweir #define PAGE_SIZE 512 34cdf0e10cSrcweir 35cdf0e10cSrcweir namespace connectivity 36cdf0e10cSrcweir { 37cdf0e10cSrcweir namespace dbase 38cdf0e10cSrcweir { 39cdf0e10cSrcweir 40cdf0e10cSrcweir class ONDXNode; 41cdf0e10cSrcweir class ODbaseIndex; 42cdf0e10cSrcweir //================================================================== 43cdf0e10cSrcweir // Index Key 44cdf0e10cSrcweir //================================================================== 45cdf0e10cSrcweir typedef file::OOperand ONDXKey_BASE; 46cdf0e10cSrcweir class ONDXKey : public ONDXKey_BASE 47cdf0e10cSrcweir { 48cdf0e10cSrcweir friend class ONDXNode; 49cdf0e10cSrcweir sal_uInt32 nRecord; /* Satzzeiger */ 50cdf0e10cSrcweir ORowSetValue xValue; /* Schluesselwert */ 51cdf0e10cSrcweir 52cdf0e10cSrcweir public: 53cdf0e10cSrcweir ONDXKey(sal_uInt32 nRec=0); 54cdf0e10cSrcweir ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec); 55cdf0e10cSrcweir ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec = 0); 56cdf0e10cSrcweir ONDXKey(double aVal, sal_uInt32 nRec = 0); 57cdf0e10cSrcweir 58cdf0e10cSrcweir inline ONDXKey(const ONDXKey& rKey); 59cdf0e10cSrcweir 60cdf0e10cSrcweir inline ONDXKey& operator= (const ONDXKey& rKey); 61cdf0e10cSrcweir virtual void setValue(const ORowSetValue& _rVal); 62cdf0e10cSrcweir 63cdf0e10cSrcweir virtual const ORowSetValue& getValue() const; 64cdf0e10cSrcweir GetRecord() const65cdf0e10cSrcweir sal_uInt32 GetRecord() const { return nRecord; } setRecord(sal_uInt32 _nRec)66cdf0e10cSrcweir void setRecord(sal_uInt32 _nRec) { nRecord = _nRec; } ResetRecord()67cdf0e10cSrcweir void ResetRecord() { nRecord = 0; } 68cdf0e10cSrcweir 69cdf0e10cSrcweir sal_Bool operator == (const ONDXKey& rKey) const; 70cdf0e10cSrcweir sal_Bool operator != (const ONDXKey& rKey) const; 71cdf0e10cSrcweir sal_Bool operator < (const ONDXKey& rKey) const; 72cdf0e10cSrcweir sal_Bool operator <= (const ONDXKey& rKey) const; 73cdf0e10cSrcweir sal_Bool operator > (const ONDXKey& rKey) const; 74cdf0e10cSrcweir sal_Bool operator >= (const ONDXKey& rKey) const; 75cdf0e10cSrcweir 76cdf0e10cSrcweir sal_Bool Load (SvFileStream& rStream, sal_Bool bText); 77cdf0e10cSrcweir sal_Bool Write(SvFileStream& rStream, sal_Bool bText); 78cdf0e10cSrcweir 79cdf0e10cSrcweir static sal_Bool IsText(sal_Int32 eType); 80cdf0e10cSrcweir 81cdf0e10cSrcweir private: 82cdf0e10cSrcweir StringCompare Compare(const ONDXKey& rKey) const; 83cdf0e10cSrcweir }; 84cdf0e10cSrcweir 85cdf0e10cSrcweir 86cdf0e10cSrcweir 87cdf0e10cSrcweir 88cdf0e10cSrcweir //================================================================== 89cdf0e10cSrcweir // Index Seitenverweis 90cdf0e10cSrcweir //================================================================== 91cdf0e10cSrcweir SV_DECL_REF(ONDXPage) // Basisklasse da weitere Informationen gehalten werden muessen 92cdf0e10cSrcweir 93cdf0e10cSrcweir 94cdf0e10cSrcweir class ONDXPagePtr : public ONDXPageRef 95cdf0e10cSrcweir { 96cdf0e10cSrcweir friend SvStream& operator << (SvStream &rStream, const ONDXPagePtr&); 97cdf0e10cSrcweir friend SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); 98cdf0e10cSrcweir 99cdf0e10cSrcweir sal_uInt32 nPagePos; // Position in der Indexdatei 100cdf0e10cSrcweir 101cdf0e10cSrcweir public: ONDXPagePtr(sal_uInt32 nPos=0)102cdf0e10cSrcweir ONDXPagePtr(sal_uInt32 nPos = 0):nPagePos(nPos){} 103cdf0e10cSrcweir ONDXPagePtr(const ONDXPagePtr& rRef); 104cdf0e10cSrcweir ONDXPagePtr(ONDXPage* pRefPage); 105cdf0e10cSrcweir 106cdf0e10cSrcweir ONDXPagePtr& operator=(const ONDXPagePtr& rRef); 107cdf0e10cSrcweir ONDXPagePtr& operator=(ONDXPage* pPageRef); 108cdf0e10cSrcweir GetPagePos() const109cdf0e10cSrcweir sal_uInt32 GetPagePos() const {return nPagePos;} HasPage() const110cdf0e10cSrcweir sal_Bool HasPage() const {return nPagePos != 0;} 111cdf0e10cSrcweir // sal_Bool Is() const { return isValid(); } 112cdf0e10cSrcweir }; 113cdf0e10cSrcweir //================================================================== 114cdf0e10cSrcweir // Index Seite 115cdf0e10cSrcweir //================================================================== 116cdf0e10cSrcweir class ONDXPage : public SvRefBase 117cdf0e10cSrcweir { 118cdf0e10cSrcweir friend class ODbaseIndex; 119cdf0e10cSrcweir 120cdf0e10cSrcweir friend SvStream& operator << (SvStream &rStream, const ONDXPage&); 121cdf0e10cSrcweir friend SvStream& operator >> (SvStream &rStream, ONDXPage&); 122cdf0e10cSrcweir 123cdf0e10cSrcweir sal_uInt32 nPagePos; // Position in der Indexdatei 124cdf0e10cSrcweir sal_Bool bModified : 1; 125cdf0e10cSrcweir sal_uInt16 nCount; 126cdf0e10cSrcweir 127cdf0e10cSrcweir ONDXPagePtr aParent, // VaterSeite 128cdf0e10cSrcweir aChild; // Zeiger auf rechte ChildPage 129cdf0e10cSrcweir ODbaseIndex& rIndex; 130cdf0e10cSrcweir ONDXNode* ppNodes; // array von Knoten 131cdf0e10cSrcweir 132cdf0e10cSrcweir public: 133cdf0e10cSrcweir // Knoten Operationen Count() const134cdf0e10cSrcweir sal_uInt16 Count() const {return nCount;} 135cdf0e10cSrcweir 136cdf0e10cSrcweir sal_Bool Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft = 0); 137cdf0e10cSrcweir sal_Bool Insert(sal_uInt16 nIndex, ONDXNode& rNode); 138cdf0e10cSrcweir sal_Bool Append(ONDXNode& rNode); 139cdf0e10cSrcweir sal_Bool Delete(sal_uInt16); 140cdf0e10cSrcweir void Remove(sal_uInt16); 141cdf0e10cSrcweir void Release(sal_Bool bSave = sal_True); 142cdf0e10cSrcweir void ReleaseFull(sal_Bool bSave = sal_True); 143cdf0e10cSrcweir 144cdf0e10cSrcweir // Aufteilen und Zerlegen 145cdf0e10cSrcweir ONDXNode Split(ONDXPage& rPage); 146cdf0e10cSrcweir void Merge(sal_uInt16 nParentNodePos, ONDXPagePtr xPage); 147cdf0e10cSrcweir 148cdf0e10cSrcweir // Zugriffsoperationen 149cdf0e10cSrcweir ONDXNode& operator[] (sal_uInt16 nPos); 150cdf0e10cSrcweir const ONDXNode& operator[] (sal_uInt16 nPos) const; 151cdf0e10cSrcweir 152cdf0e10cSrcweir sal_Bool IsRoot() const; 153cdf0e10cSrcweir sal_Bool IsLeaf() const; 154cdf0e10cSrcweir sal_Bool IsModified() const; 155cdf0e10cSrcweir sal_Bool HasParent(); 156cdf0e10cSrcweir sal_Bool HasChild() const; 157cdf0e10cSrcweir 158cdf0e10cSrcweir sal_Bool IsFull() const; 159cdf0e10cSrcweir GetPagePos() const160cdf0e10cSrcweir sal_uInt32 GetPagePos() const {return nPagePos;} 161cdf0e10cSrcweir ONDXPagePtr& GetChild(ODbaseIndex* pIndex = 0); 162cdf0e10cSrcweir 163cdf0e10cSrcweir // Parent braucht nicht nachgeladen zu werden 164cdf0e10cSrcweir ONDXPagePtr GetParent(); GetIndex()165cdf0e10cSrcweir ODbaseIndex& GetIndex() {return rIndex;} GetIndex() const166cdf0e10cSrcweir const ODbaseIndex& GetIndex() const {return rIndex;} 167cdf0e10cSrcweir 168cdf0e10cSrcweir // Setzen des Childs, ueber Referenz, um die PagePos zu erhalten 169cdf0e10cSrcweir void SetChild(ONDXPagePtr aCh); 170cdf0e10cSrcweir void SetParent(ONDXPagePtr aPa); 171cdf0e10cSrcweir 172cdf0e10cSrcweir sal_uInt16 Search(const ONDXKey& rSearch); 173cdf0e10cSrcweir sal_uInt16 Search(const ONDXPage* pPage); 174cdf0e10cSrcweir void SearchAndReplace(const ONDXKey& rSearch, ONDXKey& rReplace); 175cdf0e10cSrcweir 176cdf0e10cSrcweir protected: 177cdf0e10cSrcweir ONDXPage(ODbaseIndex& rIndex, sal_uInt32 nPos, ONDXPage* = NULL); 178cdf0e10cSrcweir ~ONDXPage(); 179cdf0e10cSrcweir 180cdf0e10cSrcweir virtual void QueryDelete(); 181cdf0e10cSrcweir SetModified(sal_Bool bMod)182cdf0e10cSrcweir void SetModified(sal_Bool bMod) {bModified = bMod;} SetPagePos(sal_uInt32 nPage)183cdf0e10cSrcweir void SetPagePos(sal_uInt32 nPage) {nPagePos = nPage;} 184cdf0e10cSrcweir 185cdf0e10cSrcweir sal_Bool Find(const ONDXKey&); // rek. Abstieg 186cdf0e10cSrcweir sal_uInt16 FindPos(const ONDXKey& rKey) const; 187cdf0e10cSrcweir 188cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1 189cdf0e10cSrcweir void PrintPage(); 190cdf0e10cSrcweir #endif 191cdf0e10cSrcweir }; 192cdf0e10cSrcweir 193cdf0e10cSrcweir SV_IMPL_REF(ONDXPage); 194cdf0e10cSrcweir 195cdf0e10cSrcweir SvStream& operator << (SvStream &rStream, const ONDXPagePtr&); 196cdf0e10cSrcweir SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); 197cdf0e10cSrcweir IsRoot() const198cdf0e10cSrcweir inline sal_Bool ONDXPage::IsRoot() const {return !aParent.Is();} IsLeaf() const199cdf0e10cSrcweir inline sal_Bool ONDXPage::IsLeaf() const {return !aChild.HasPage();} IsModified() const200cdf0e10cSrcweir inline sal_Bool ONDXPage::IsModified() const {return bModified;} HasParent()201cdf0e10cSrcweir inline sal_Bool ONDXPage::HasParent() {return aParent.Is();} HasChild() const202cdf0e10cSrcweir inline sal_Bool ONDXPage::HasChild() const {return aChild.HasPage();} GetParent()203cdf0e10cSrcweir inline ONDXPagePtr ONDXPage::GetParent() {return aParent;} 204cdf0e10cSrcweir SetParent(ONDXPagePtr aPa=ONDXPagePtr ())205cdf0e10cSrcweir inline void ONDXPage::SetParent(ONDXPagePtr aPa = ONDXPagePtr()) 206cdf0e10cSrcweir { 207cdf0e10cSrcweir aParent = aPa; 208cdf0e10cSrcweir } 209cdf0e10cSrcweir SetChild(ONDXPagePtr aCh=ONDXPagePtr ())210cdf0e10cSrcweir inline void ONDXPage::SetChild(ONDXPagePtr aCh = ONDXPagePtr()) 211cdf0e10cSrcweir { 212cdf0e10cSrcweir aChild = aCh; 213cdf0e10cSrcweir if (aChild.Is()) 214cdf0e10cSrcweir aChild->SetParent(this); 215cdf0e10cSrcweir } 216cdf0e10cSrcweir SvStream& operator >> (SvStream &rStream, ONDXPage& rPage); 217cdf0e10cSrcweir SvStream& operator << (SvStream &rStream, const ONDXPage& rPage); 218cdf0e10cSrcweir 219cdf0e10cSrcweir 220cdf0e10cSrcweir typedef ::std::vector<ONDXPage*> ONDXPageList; 221cdf0e10cSrcweir 222cdf0e10cSrcweir //================================================================== 223cdf0e10cSrcweir // Index Knoten 224cdf0e10cSrcweir //================================================================== 225cdf0e10cSrcweir class ONDXNode 226cdf0e10cSrcweir { 227cdf0e10cSrcweir friend class ONDXPage; 228cdf0e10cSrcweir ONDXPagePtr aChild; /* naechster Seitenverweis */ 229cdf0e10cSrcweir ONDXKey aKey; 230cdf0e10cSrcweir 231cdf0e10cSrcweir public: ONDXNode()232cdf0e10cSrcweir ONDXNode(){} ONDXNode(const ONDXKey & rKey,ONDXPagePtr aPagePtr=ONDXPagePtr ())233cdf0e10cSrcweir ONDXNode(const ONDXKey& rKey, 234cdf0e10cSrcweir ONDXPagePtr aPagePtr = ONDXPagePtr()) 235cdf0e10cSrcweir :aChild(aPagePtr),aKey(rKey) {} 236cdf0e10cSrcweir 237cdf0e10cSrcweir // verweist der Knoten auf eine Seite HasChild() const238cdf0e10cSrcweir sal_Bool HasChild() const {return aChild.HasPage();} 239cdf0e10cSrcweir // Ist ein Index angegeben, kann gegebenfalls die Seite nachgeladen werden 240cdf0e10cSrcweir ONDXPagePtr& GetChild(ODbaseIndex* pIndex = NULL, ONDXPage* = NULL); 241cdf0e10cSrcweir GetKey() const242cdf0e10cSrcweir const ONDXKey& GetKey() const { return aKey;} GetKey()243cdf0e10cSrcweir ONDXKey& GetKey() { return aKey;} 244cdf0e10cSrcweir 245cdf0e10cSrcweir // Setzen des Childs, ueber Referenz, um die PagePos zu erhalten 246cdf0e10cSrcweir void SetChild(ONDXPagePtr aCh = ONDXPagePtr(), ONDXPage* = NULL); SetKey(ONDXKey & rKey)247cdf0e10cSrcweir void SetKey(ONDXKey& rKey) {aKey = rKey;} 248cdf0e10cSrcweir 249cdf0e10cSrcweir void Write(SvStream &rStream, const ONDXPage& rPage) const; 250cdf0e10cSrcweir void Read(SvStream &rStream, ODbaseIndex&); 251cdf0e10cSrcweir }; 252cdf0e10cSrcweir //================================================================== 253cdf0e10cSrcweir // inline implementation 254cdf0e10cSrcweir //================================================================== 255cdf0e10cSrcweir // inline ONDXKey::ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec) 256cdf0e10cSrcweir // : ONDXKey_BASE(eType) 257cdf0e10cSrcweir // , nRecord(nRec),xValue(rVal) 258cdf0e10cSrcweir // { 259cdf0e10cSrcweir // } 260cdf0e10cSrcweir 261cdf0e10cSrcweir 262cdf0e10cSrcweir // inline ONDXKey::ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec) 263cdf0e10cSrcweir // : ONDXKey_BASE(::com::sun::star::sdbc::DataType::VARCHAR) 264cdf0e10cSrcweir // ,nRecord(nRec) 265cdf0e10cSrcweir // { 266cdf0e10cSrcweir // if (aStr.len()) 267cdf0e10cSrcweir // xValue = aStr; 268cdf0e10cSrcweir // } 269cdf0e10cSrcweir 270cdf0e10cSrcweir // inline ONDXKey::ONDXKey(double aVal, sal_uInt32 nRec) 271cdf0e10cSrcweir // : ONDXKey_BASE(::com::sun::star::sdbc::DataType::DOUBLE) 272cdf0e10cSrcweir // ,nRecord(nRec) 273cdf0e10cSrcweir // ,xValue(aVal) 274cdf0e10cSrcweir // { 275cdf0e10cSrcweir // } 276cdf0e10cSrcweir 277cdf0e10cSrcweir // inline ONDXKey::ONDXKey(sal_uInt32 nRec) 278cdf0e10cSrcweir // :nRecord(nRec) 279cdf0e10cSrcweir // { 280cdf0e10cSrcweir // } 281cdf0e10cSrcweir ONDXKey(const ONDXKey & rKey)282cdf0e10cSrcweir inline ONDXKey::ONDXKey(const ONDXKey& rKey) 283cdf0e10cSrcweir : ONDXKey_BASE(rKey.getDBType()) 284cdf0e10cSrcweir ,nRecord(rKey.nRecord) 285cdf0e10cSrcweir ,xValue(rKey.xValue) 286cdf0e10cSrcweir { 287cdf0e10cSrcweir } 288cdf0e10cSrcweir operator =(const ONDXKey & rKey)289cdf0e10cSrcweir inline ONDXKey& ONDXKey::operator=(const ONDXKey& rKey) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir if(&rKey == this) 292cdf0e10cSrcweir return *this; 293cdf0e10cSrcweir 294cdf0e10cSrcweir xValue = rKey.xValue; 295cdf0e10cSrcweir nRecord = rKey.nRecord; 296cdf0e10cSrcweir m_eDBType = rKey.getDBType(); 297cdf0e10cSrcweir return *this; 298cdf0e10cSrcweir } 299cdf0e10cSrcweir operator ==(const ONDXKey & rKey) const300cdf0e10cSrcweir inline sal_Bool ONDXKey::operator == (const ONDXKey& rKey) const 301cdf0e10cSrcweir { 302cdf0e10cSrcweir if(&rKey == this) 303cdf0e10cSrcweir return sal_True; 304cdf0e10cSrcweir return Compare(rKey) == COMPARE_EQUAL; 305cdf0e10cSrcweir } operator !=(const ONDXKey & rKey) const306cdf0e10cSrcweir inline sal_Bool ONDXKey::operator != (const ONDXKey& rKey) const 307cdf0e10cSrcweir { 308cdf0e10cSrcweir return !operator== (rKey); 309cdf0e10cSrcweir } operator <(const ONDXKey & rKey) const310cdf0e10cSrcweir inline sal_Bool ONDXKey::operator < (const ONDXKey& rKey) const 311cdf0e10cSrcweir { 312cdf0e10cSrcweir return Compare(rKey) == COMPARE_LESS; 313cdf0e10cSrcweir } operator >(const ONDXKey & rKey) const314cdf0e10cSrcweir inline sal_Bool ONDXKey::operator > (const ONDXKey& rKey) const 315cdf0e10cSrcweir { 316cdf0e10cSrcweir return Compare(rKey) == COMPARE_GREATER; 317cdf0e10cSrcweir } operator <=(const ONDXKey & rKey) const318cdf0e10cSrcweir inline sal_Bool ONDXKey::operator <= (const ONDXKey& rKey) const 319cdf0e10cSrcweir { 320cdf0e10cSrcweir return !operator > (rKey); 321cdf0e10cSrcweir } operator >=(const ONDXKey & rKey) const322cdf0e10cSrcweir inline sal_Bool ONDXKey::operator >= (const ONDXKey& rKey) const 323cdf0e10cSrcweir { 324cdf0e10cSrcweir return !operator< (rKey); 325cdf0e10cSrcweir } 326cdf0e10cSrcweir SetChild(ONDXPagePtr aCh,ONDXPage * pParent)327cdf0e10cSrcweir inline void ONDXNode::SetChild(ONDXPagePtr aCh, ONDXPage* pParent) 328cdf0e10cSrcweir { 329cdf0e10cSrcweir aChild = aCh; 330cdf0e10cSrcweir if (aChild.Is()) 331cdf0e10cSrcweir aChild->SetParent(pParent); 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 336cdf0e10cSrcweir } 337cdf0e10cSrcweir 338cdf0e10cSrcweir 339cdf0e10cSrcweir 340cdf0e10cSrcweir 341cdf0e10cSrcweir #endif // _CONNECTIVITY_DBASE_INDEXNODE_HXX_ 342cdf0e10cSrcweir 343cdf0e10cSrcweir 344