summaryrefslogtreecommitdiff
path: root/connectivity/source/inc/dbase/dindexnode.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/inc/dbase/dindexnode.hxx')
-rw-r--r--connectivity/source/inc/dbase/dindexnode.hxx410
1 files changed, 410 insertions, 0 deletions
diff --git a/connectivity/source/inc/dbase/dindexnode.hxx b/connectivity/source/inc/dbase/dindexnode.hxx
new file mode 100644
index 000000000000..8f93ea1bce28
--- /dev/null
+++ b/connectivity/source/inc/dbase/dindexnode.hxx
@@ -0,0 +1,410 @@
+/*************************************************************************
+ *
+ * $RCSfile: dindexnode.hxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:26 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (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.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+#ifndef _CONNECTIVITY_DBASE_INDEXNODE_HXX_
+#define _CONNECTIVITY_DBASE_INDEXNODE_HXX_
+
+#ifndef _CONNECTIVITY_FILE_FCODE_HXX_
+#include "file/fcode.hxx"
+#endif
+#ifndef _CONNECTIVITY_FILE_TABLE_HXX_
+#include "file/FTable.hxx"
+#endif
+#ifndef _CONNECTIVITY_DBASE_INDEXPAGE_HXX_
+#include "dbase/DIndexPage.hxx"
+#endif
+#ifndef _CONNECTIVITY_FILE_VALUE_HXX_
+#include "file/FValue.hxx"
+#endif
+
+namespace connectivity
+{
+ namespace dbase
+ {
+
+ class ONDXNode;
+ class ODbaseIndex;
+ typedef file::OFileValue OFileValue_BASE;
+ //==================================================================
+ // Index Key
+ //==================================================================
+ typedef file::OOperand ONDXKey_BASE;
+ class ONDXKey : public ONDXKey_BASE
+ {
+ friend class ONDXNode;
+ UINT32 nRecord; /* Satzzeiger */
+ OFileValue_BASE xValue; /* Schluesselwert */
+
+ public:
+ ONDXKey():nRecord(0){}
+ inline ONDXKey(const OFileValue_BASE& rVal, sal_Int32 eType, UINT32 nRec)
+ : ONDXKey_BASE(eType)
+ , nRecord(nRec)
+ , xValue(rVal)
+ {}
+ ONDXKey(const rtl::OUString& aStr, UINT32 nRec = 0)
+ : ONDXKey_BASE(::com::sun::star::sdbc::DataType::VARCHAR)
+ ,nRecord(nRec)
+ {
+ if (aStr.len())
+ xValue = aStr;
+ }
+ ONDXKey(double aVal, UINT32 nRec = 0)
+ : ONDXKey_BASE(::com::sun::star::sdbc::DataType::DOUBLE)
+ ,nRecord(nRec)
+ ,xValue(aVal)
+ {
+ }
+ ONDXKey(UINT32 nRec)
+ : nRecord(nRec){}
+ inline ONDXKey(const ONDXKey& rKey);
+
+ inline ONDXKey& operator= (const ONDXKey& rKey);
+ virtual void setValue(const ::com::sun::star::uno::Any& _rVal)
+ {
+ xValue = _rVal;
+ }
+
+ virtual ::com::sun::star::uno::Any getValue() const
+ {
+ return xValue;
+ }
+
+ UINT32 GetRecord() const {return nRecord;}
+ 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;
+ BOOL operator >= (const ONDXKey& rKey) const;
+
+ BOOL Load (SvFileStream& rStream, BOOL bText);
+ BOOL Write(SvFileStream& rStream, BOOL bText);
+
+ static BOOL IsText(sal_Int32 eType);
+
+ private:
+ StringCompare Compare(const ONDXKey& rKey) const;
+ };
+
+ #define NODE_NOTFOUND 0xFFFF
+
+ class ONDXPagePtr;
+ //==================================================================
+ // Index Seite
+ //==================================================================
+ class ONDXPage //: public SvRefBase
+ {
+ friend class ODbaseIndex;
+
+ friend SvStream& operator << (SvStream &rStream, const ONDXPage&);
+ friend SvStream& operator >> (SvStream &rStream, ONDXPage&);
+
+ UINT32 nPagePos; // Position in der Indexdatei
+ BOOL bModified : 1;
+ USHORT nCount;
+
+ ONDXPagePtr *aParent, // VaterSeite
+ *aChild; // Zeiger auf rechte ChildPage
+ ODbaseIndex& rIndex;
+ ONDXNode* ppNodes; // array von Knoten
+
+ oslInterlockedCount m_refCount;
+
+ public:
+ void acquire()
+ {
+ osl_incrementInterlockedCount( &m_refCount );
+ }
+ void release();
+
+ // Knoten Operationen
+ USHORT Count() const {return nCount;}
+
+ BOOL Insert(ONDXNode& rNode, ULONG nRowsLeft = 0);
+ BOOL Insert(USHORT nIndex, ONDXNode& rNode);
+ BOOL Append(ONDXNode& rNode);
+ BOOL Delete(USHORT);
+ void Remove(USHORT);
+ void Release(BOOL bSave = TRUE);
+ void ReleaseFull(BOOL bSave = TRUE);
+
+ // Aufteilen und Zerlegen
+ ONDXNode Split(ONDXPage& rPage);
+ void Merge(USHORT nParentNodePos, ONDXPagePtr xPage);
+
+ // Zugriffsoperationen
+ ONDXNode& operator[] (USHORT nPos);
+ const ONDXNode& operator[] (USHORT nPos) const;
+
+ BOOL IsRoot() const;
+ BOOL IsLeaf() const;
+ BOOL IsModified() const;
+ BOOL HasParent();
+ BOOL HasChild() const;
+
+ BOOL IsFull() const;
+
+ 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);
+
+ USHORT Search(const ONDXKey& rSearch);
+ USHORT Search(const ONDXPage* pPage);
+ void SearchAndReplace(const ONDXKey& rSearch, ONDXKey& rReplace);
+
+ protected:
+ ONDXPage(ODbaseIndex& rIndex, ULONG nPos, ONDXPage* = NULL);
+ ~ONDXPage();
+
+ virtual void QueryDelete();
+
+ void SetModified(BOOL bMod) {bModified = bMod;}
+ void SetPagePos(UINT32 nPage) {nPagePos = nPage;}
+
+ BOOL Find(const ONDXKey&); // rek. Abstieg
+ USHORT FindPos(const ONDXKey& rKey) const;
+
+ #ifdef DEBUG
+ void PrintPage();
+ #endif
+ };
+
+ //==================================================================
+ // Index Seitenverweis
+ //==================================================================
+ // SV_DECL_REF(ONDXPage); // Basisklasse da weitere Informationen gehalten werden muessen
+ typedef vos::ORef<ONDXPage> ONDXPagePtr_BASE;
+
+ class ONDXPagePtr : public ONDXPagePtr_BASE //ONDXPageRef
+ {
+ friend SvStream& operator << (SvStream &rStream, const ONDXPagePtr&);
+ friend SvStream& operator >> (SvStream &rStream, ONDXPagePtr&);
+
+ UINT32 nPagePos; // Position in der Indexdatei
+
+ public:
+ ONDXPagePtr(UINT32 nPos = 0):nPagePos(nPos){}
+ ONDXPagePtr(const ONDXPagePtr& rRef);
+ ONDXPagePtr(ONDXPage* pRefPage);
+
+ ONDXPagePtr& operator=(const ONDXPagePtr& rRef);
+ ONDXPagePtr& operator=(ONDXPage* pPageRef);
+
+ UINT32 GetPagePos() const {return nPagePos;}
+ BOOL HasPage() const {return nPagePos != 0;}
+ sal_Bool Is() const { return isValid(); }
+ void Clear()
+ {
+ unbind();
+ }
+ };
+
+ SvStream& operator << (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() {return aParent->Is();}
+ inline 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())
+ :aKey(rKey), aChild(aPagePtr) {}
+
+ // verweist der Knoten auf eine Seite
+ 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 OFileValue_BASE& rVal, sal_Int32 eType, UINT32 nRec)
+// : ONDXKey_BASE(eType)
+// , nRecord(nRec),xValue(rVal)
+// {
+// }
+
+
+// inline ONDXKey::ONDXKey(const rtl::OUString& aStr, UINT32 nRec)
+// : ONDXKey_BASE(::com::sun::star::sdbc::DataType::VARCHAR)
+// ,nRecord(nRec)
+// {
+// if (aStr.len())
+// xValue = aStr;
+// }
+
+// inline ONDXKey::ONDXKey(double aVal, UINT32 nRec)
+// : ONDXKey_BASE(::com::sun::star::sdbc::DataType::DOUBLE)
+// ,nRecord(nRec)
+// ,xValue(aVal)
+// {
+// }
+
+// inline ONDXKey::ONDXKey(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)
+ {
+ xValue = rKey.xValue;
+ nRecord = rKey.nRecord;
+ m_eDBType = rKey.getDBType();
+ return *this;
+ }
+
+ inline BOOL ONDXKey::operator == (const ONDXKey& rKey) const
+ {
+ return Compare(rKey) == COMPARE_EQUAL;
+ }
+ inline BOOL ONDXKey::operator != (const ONDXKey& rKey) const
+ {
+ return !operator== (rKey);
+ }
+ inline BOOL ONDXKey::operator < (const ONDXKey& rKey) const
+ {
+ return Compare(rKey) == COMPARE_LESS;
+ }
+ inline BOOL ONDXKey::operator > (const ONDXKey& rKey) const
+ {
+ return Compare(rKey) == COMPARE_GREATER;
+ }
+ inline BOOL ONDXKey::operator <= (const ONDXKey& rKey) const
+ {
+ return !operator > (rKey);
+ }
+ inline 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_
+
+