| /************************************************************** | 
 |  *  | 
 |  * Licensed to the Apache Software Foundation (ASF) under one | 
 |  * or more contributor license agreements.  See the NOTICE file | 
 |  * distributed with this work for additional information | 
 |  * regarding copyright ownership.  The ASF licenses this file | 
 |  * to you under the Apache License, Version 2.0 (the | 
 |  * "License"); you may not use this file except in compliance | 
 |  * with the License.  You may obtain a copy of the License at | 
 |  *  | 
 |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
 |  *  | 
 |  * Unless required by applicable law or agreed to in writing, | 
 |  * software distributed under the License is distributed on an | 
 |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |  * KIND, either express or implied.  See the License for the | 
 |  * specific language governing permissions and limitations | 
 |  * under the License. | 
 |  *  | 
 |  *************************************************************/ | 
 |  | 
 |  | 
 | #ifndef _CONNECTIVITY_DBASE_INDEXNODE_HXX_ | 
 | #define _CONNECTIVITY_DBASE_INDEXNODE_HXX_ | 
 |  | 
 | #include "file/fcode.hxx" | 
 | #include "file/FTable.hxx" | 
 | #include "dbase/DIndexPage.hxx" | 
 | #include "connectivity/FValue.hxx" | 
 | #include <tools/ref.hxx> | 
 |  | 
 | #define NODE_NOTFOUND 0xFFFF | 
 | #define PAGE_SIZE 512 | 
 |  | 
 | namespace connectivity | 
 | { | 
 | 	namespace dbase | 
 | 	{ | 
 |  | 
 | 		class ONDXNode; | 
 | 		class ODbaseIndex; | 
 | 		//================================================================== | 
 | 		// Index Key | 
 | 		//================================================================== | 
 | 		typedef file::OOperand ONDXKey_BASE; | 
 | 		class ONDXKey : public ONDXKey_BASE | 
 | 		{ | 
 | 			friend class ONDXNode; | 
 | 			sal_uInt32			nRecord;				/* Satzzeiger				*/ | 
 | 			ORowSetValue	xValue;					/* Schluesselwert			*/ | 
 |  | 
 | 		public: | 
 | 			ONDXKey(sal_uInt32 nRec=0); | 
 | 			ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec); | 
 | 			ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec = 0); | 
 | 			ONDXKey(double aVal, sal_uInt32 nRec = 0); | 
 |  | 
 | 			inline ONDXKey(const ONDXKey& rKey); | 
 |  | 
 | 			inline ONDXKey& operator= (const ONDXKey& rKey); | 
 | 			virtual void setValue(const ORowSetValue& _rVal); | 
 |  | 
 | 			virtual const ORowSetValue& getValue() const; | 
 |  | 
 | 			sal_uInt32 GetRecord() const		{ return nRecord;	} | 
 | 			void setRecord(sal_uInt32 _nRec)	{ nRecord = _nRec;	} | 
 | 			void   ResetRecord()			{ nRecord = 0;		} | 
 |  | 
 | 			sal_Bool operator == (const ONDXKey& rKey) const; | 
 | 			sal_Bool operator != (const ONDXKey& rKey) const; | 
 | 			sal_Bool operator <	 (const ONDXKey& rKey) const; | 
 | 			sal_Bool operator <= (const ONDXKey& rKey) const; | 
 | 			sal_Bool operator >  (const ONDXKey& rKey) const; | 
 | 			sal_Bool operator >= (const ONDXKey& rKey) const; | 
 |  | 
 | 			sal_Bool Load (SvFileStream& rStream, sal_Bool bText); | 
 | 			sal_Bool Write(SvFileStream& rStream, sal_Bool bText); | 
 |  | 
 | 			static sal_Bool IsText(sal_Int32 eType); | 
 |  | 
 | 		private: | 
 | 			StringCompare Compare(const ONDXKey& rKey) const; | 
 | 		}; | 
 |  | 
 |  | 
 |  | 
 |  | 
 | 		//================================================================== | 
 | 		// Index Seitenverweis | 
 | 		//================================================================== | 
 | 		SV_DECL_REF(ONDXPage) // Basisklasse da weitere Informationen gehalten werden muessen | 
 |  | 
 |  | 
 | 		class ONDXPagePtr : public ONDXPageRef | 
 | 		{ | 
 | 			friend  SvStream& operator << (SvStream &rStream, const ONDXPagePtr&); | 
 | 			friend  SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); | 
 |  | 
 | 			sal_uInt32	nPagePos;		// Position in der Indexdatei | 
 |  | 
 | 		public: | 
 | 			ONDXPagePtr(sal_uInt32 nPos = 0):nPagePos(nPos){} | 
 | 			ONDXPagePtr(const ONDXPagePtr& rRef); | 
 | 			ONDXPagePtr(ONDXPage* pRefPage); | 
 |  | 
 | 			ONDXPagePtr& operator=(const ONDXPagePtr& rRef); | 
 | 			ONDXPagePtr& operator=(ONDXPage* pPageRef); | 
 |  | 
 | 			sal_uInt32 GetPagePos() const {return nPagePos;} | 
 | 			sal_Bool HasPage() const {return nPagePos != 0;} | 
 | 			//	sal_Bool Is() const { return isValid(); } | 
 | 		}; | 
 | 		//================================================================== | 
 | 		// Index Seite | 
 | 		//================================================================== | 
 | 		class ONDXPage : public SvRefBase | 
 | 		{ | 
 | 			friend class ODbaseIndex; | 
 |  | 
 | 			friend  SvStream& operator << (SvStream &rStream, const ONDXPage&); | 
 | 			friend  SvStream& operator >> (SvStream &rStream, ONDXPage&); | 
 |  | 
 | 			sal_uInt32		nPagePos;				// Position in der Indexdatei | 
 | 			sal_Bool		bModified : 1; | 
 | 			sal_uInt16		nCount; | 
 |  | 
 | 			ONDXPagePtr	aParent,			// VaterSeite | 
 | 						aChild;				// Zeiger auf rechte ChildPage | 
 | 			ODbaseIndex& rIndex; | 
 | 			ONDXNode*  ppNodes;				// array von Knoten | 
 |  | 
 | 		public: | 
 | 			// Knoten Operationen | 
 | 			sal_uInt16	Count() const {return nCount;} | 
 |  | 
 | 			sal_Bool	Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft = 0); | 
 | 			sal_Bool	Insert(sal_uInt16 nIndex, ONDXNode& rNode); | 
 | 			sal_Bool	Append(ONDXNode& rNode); | 
 | 			sal_Bool	Delete(sal_uInt16); | 
 | 			void	Remove(sal_uInt16); | 
 | 			void	Release(sal_Bool bSave = sal_True); | 
 | 			void	ReleaseFull(sal_Bool bSave = sal_True); | 
 |  | 
 | 			// Aufteilen und Zerlegen | 
 | 			ONDXNode Split(ONDXPage& rPage); | 
 | 			void Merge(sal_uInt16 nParentNodePos, ONDXPagePtr xPage); | 
 |  | 
 | 			// Zugriffsoperationen | 
 | 			ONDXNode& operator[] (sal_uInt16 nPos); | 
 | 			const ONDXNode& operator[] (sal_uInt16 nPos) const; | 
 |  | 
 | 			sal_Bool IsRoot() const; | 
 | 			sal_Bool IsLeaf() const; | 
 | 			sal_Bool IsModified() const; | 
 | 			sal_Bool HasParent(); | 
 | 			sal_Bool HasChild() const; | 
 |  | 
 | 			sal_Bool IsFull() const; | 
 |  | 
 | 			sal_uInt32 GetPagePos() const {return nPagePos;} | 
 | 			ONDXPagePtr& GetChild(ODbaseIndex* pIndex = 0); | 
 |  | 
 | 			// Parent braucht nicht nachgeladen zu werden | 
 | 			ONDXPagePtr GetParent(); | 
 | 			ODbaseIndex& GetIndex() {return rIndex;} | 
 | 			const ODbaseIndex& GetIndex() const {return rIndex;} | 
 |  | 
 | 			// Setzen des Childs, ueber Referenz, um die PagePos zu erhalten | 
 | 			void SetChild(ONDXPagePtr aCh); | 
 | 			void SetParent(ONDXPagePtr aPa); | 
 |  | 
 | 			sal_uInt16 Search(const ONDXKey& rSearch); | 
 | 			sal_uInt16 Search(const ONDXPage* pPage); | 
 | 			void   SearchAndReplace(const ONDXKey& rSearch, ONDXKey& rReplace); | 
 |  | 
 | 		protected: | 
 | 			ONDXPage(ODbaseIndex& rIndex, sal_uInt32 nPos, ONDXPage* = NULL); | 
 | 			~ONDXPage(); | 
 |  | 
 | 			virtual void QueryDelete(); | 
 |  | 
 | 			void SetModified(sal_Bool bMod) {bModified = bMod;} | 
 | 			void SetPagePos(sal_uInt32 nPage) {nPagePos = nPage;} | 
 |  | 
 | 			sal_Bool Find(const ONDXKey&);	// rek. Abstieg | 
 | 			sal_uInt16 FindPos(const ONDXKey& rKey) const; | 
 |  | 
 | #if OSL_DEBUG_LEVEL > 1 | 
 | 			void PrintPage(); | 
 | #endif | 
 | 		}; | 
 |  | 
 | 		SV_IMPL_REF(ONDXPage); | 
 |  | 
 | 		SvStream& operator << (SvStream &rStream, const ONDXPagePtr&); | 
 | 		SvStream& operator >> (SvStream &rStream, ONDXPagePtr&); | 
 |  | 
 | 		inline sal_Bool ONDXPage::IsRoot() const {return !aParent.Is();} | 
 | 		inline sal_Bool ONDXPage::IsLeaf() const {return !aChild.HasPage();} | 
 | 		inline sal_Bool ONDXPage::IsModified() const {return bModified;} | 
 | 		inline sal_Bool ONDXPage::HasParent() {return aParent.Is();} | 
 | 		inline sal_Bool ONDXPage::HasChild() const {return aChild.HasPage();} | 
 | 		inline ONDXPagePtr ONDXPage::GetParent() {return aParent;} | 
 |  | 
 | 		inline void ONDXPage::SetParent(ONDXPagePtr aPa = ONDXPagePtr()) | 
 | 		{ | 
 | 			aParent = aPa; | 
 | 		} | 
 |  | 
 | 		inline void ONDXPage::SetChild(ONDXPagePtr aCh = ONDXPagePtr()) | 
 | 		{ | 
 | 			aChild = aCh; | 
 | 			if (aChild.Is()) | 
 | 				aChild->SetParent(this); | 
 | 		} | 
 | 		SvStream& operator >> (SvStream &rStream, ONDXPage& rPage); | 
 | 		SvStream& operator << (SvStream &rStream, const ONDXPage& rPage); | 
 |  | 
 |  | 
 | 		typedef ::std::vector<ONDXPage*>	ONDXPageList; | 
 |  | 
 | 		//================================================================== | 
 | 		// Index Knoten | 
 | 		//================================================================== | 
 | 		class ONDXNode | 
 | 		{ | 
 | 			friend class ONDXPage; | 
 | 			ONDXPagePtr aChild;				/* naechster Seitenverweis	*/ | 
 | 			ONDXKey	  aKey; | 
 |  | 
 | 		public: | 
 | 			ONDXNode(){} | 
 | 			ONDXNode(const ONDXKey& rKey, | 
 | 					   ONDXPagePtr aPagePtr = ONDXPagePtr()) | 
 |                        :aChild(aPagePtr),aKey(rKey) {} | 
 |  | 
 | 			// verweist der Knoten auf eine Seite | 
 | 			sal_Bool			HasChild() const {return aChild.HasPage();} | 
 | 			// Ist ein Index angegeben, kann gegebenfalls die Seite nachgeladen werden | 
 | 			ONDXPagePtr&	GetChild(ODbaseIndex* pIndex = NULL, ONDXPage* = NULL); | 
 |  | 
 | 			const ONDXKey& GetKey() const	{ return aKey;} | 
 | 			ONDXKey&	   GetKey()			{ return aKey;} | 
 |  | 
 | 			// Setzen des Childs, ueber Referenz, um die PagePos zu erhalten | 
 | 			void			SetChild(ONDXPagePtr aCh = ONDXPagePtr(), ONDXPage* = NULL); | 
 | 			void			SetKey(ONDXKey& rKey) {aKey = rKey;} | 
 |  | 
 | 			void Write(SvStream &rStream, const ONDXPage& rPage) const; | 
 | 			void Read(SvStream &rStream, ODbaseIndex&); | 
 | 		}; | 
 | 		//================================================================== | 
 | 		// inline implementation | 
 | 		//================================================================== | 
 | //		inline ONDXKey::ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec) | 
 | //			: ONDXKey_BASE(eType) | 
 | //			, nRecord(nRec),xValue(rVal) | 
 | //		{ | 
 | //		} | 
 |  | 
 |  | 
 | //		inline ONDXKey::ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec) | 
 | //					: ONDXKey_BASE(::com::sun::star::sdbc::DataType::VARCHAR) | 
 | //					 ,nRecord(nRec) | 
 | //		{ | 
 | //			if (aStr.len()) | 
 | //				xValue = aStr; | 
 | //		} | 
 |  | 
 | //		inline ONDXKey::ONDXKey(double aVal, sal_uInt32 nRec) | 
 | //					 : ONDXKey_BASE(::com::sun::star::sdbc::DataType::DOUBLE) | 
 | //					 ,nRecord(nRec) | 
 | //					 ,xValue(aVal) | 
 | //		{ | 
 | //		} | 
 |  | 
 | //		inline ONDXKey::ONDXKey(sal_uInt32 nRec) | 
 | //					 :nRecord(nRec) | 
 | //		{ | 
 | //		} | 
 |  | 
 | 		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(); | 
 | 			return *this; | 
 | 		} | 
 |  | 
 | 		inline sal_Bool ONDXKey::operator == (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			if(&rKey == this) | 
 | 				return sal_True; | 
 | 			return Compare(rKey) == COMPARE_EQUAL; | 
 | 		} | 
 | 		inline sal_Bool ONDXKey::operator != (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			return !operator== (rKey); | 
 | 		} | 
 | 		inline sal_Bool ONDXKey::operator <  (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			return Compare(rKey) == COMPARE_LESS; | 
 | 		} | 
 | 		inline sal_Bool ONDXKey::operator >  (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			return Compare(rKey) == COMPARE_GREATER; | 
 | 		} | 
 | 		inline sal_Bool ONDXKey::operator <= (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			return !operator > (rKey); | 
 | 		} | 
 | 		inline sal_Bool ONDXKey::operator >= (const ONDXKey& rKey) const | 
 | 		{ | 
 | 			return !operator< (rKey); | 
 | 		} | 
 |  | 
 | 		inline void ONDXNode::SetChild(ONDXPagePtr aCh, ONDXPage* pParent) | 
 | 		{ | 
 | 			aChild = aCh; | 
 | 			if (aChild.Is()) | 
 | 				aChild->SetParent(pParent); | 
 | 		} | 
 |  | 
 | 	} | 
 |  | 
 | } | 
 |  | 
 |  | 
 |  | 
 |  | 
 | #endif // _CONNECTIVITY_DBASE_INDEXNODE_HXX_ | 
 |  | 
 |  |