Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : : #ifndef _CONNECTIVITY_DBASE_INDEXNODE_HXX_
20 : : #define _CONNECTIVITY_DBASE_INDEXNODE_HXX_
21 : :
22 : : #include "file/fcode.hxx"
23 : : #include "file/FTable.hxx"
24 : : #include "dbase/DIndexPage.hxx"
25 : : #include "connectivity/FValue.hxx"
26 : : #include <tools/ref.hxx>
27 : :
28 : : #define NODE_NOTFOUND 0xFFFF
29 : : #define PAGE_SIZE 512
30 : :
31 : : namespace connectivity
32 : : {
33 : : namespace dbase
34 : : {
35 : :
36 : : class ONDXNode;
37 : : class ODbaseIndex;
38 : : //==================================================================
39 : : // Index Key
40 : : //==================================================================
41 : : typedef file::OOperand ONDXKey_BASE;
42 [ # # ][ # # ]: 0 : class ONDXKey : public ONDXKey_BASE
43 : : {
44 : : friend class ONDXNode;
45 : : sal_uInt32 nRecord; /* Record pointer */
46 : : ORowSetValue xValue; /* Key values */
47 : :
48 : : public:
49 : : ONDXKey(sal_uInt32 nRec=0);
50 : : ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec);
51 : : ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec = 0);
52 : : ONDXKey(double aVal, sal_uInt32 nRec = 0);
53 : :
54 : : inline ONDXKey(const ONDXKey& rKey);
55 : :
56 : : inline ONDXKey& operator= (const ONDXKey& rKey);
57 : : virtual void setValue(const ORowSetValue& _rVal);
58 : :
59 : : virtual const ORowSetValue& getValue() const;
60 : :
61 : 0 : sal_uInt32 GetRecord() const { return nRecord; }
62 : 0 : void setRecord(sal_uInt32 _nRec) { nRecord = _nRec; }
63 : 0 : void ResetRecord() { nRecord = 0; }
64 : :
65 : : sal_Bool operator == (const ONDXKey& rKey) const;
66 : : sal_Bool operator != (const ONDXKey& rKey) const;
67 : : sal_Bool operator < (const ONDXKey& rKey) const;
68 : : sal_Bool operator <= (const ONDXKey& rKey) const;
69 : : sal_Bool operator > (const ONDXKey& rKey) const;
70 : : sal_Bool operator >= (const ONDXKey& rKey) const;
71 : :
72 : : sal_Bool Load (SvFileStream& rStream, sal_Bool bText);
73 : : sal_Bool Write(SvFileStream& rStream, sal_Bool bText);
74 : :
75 : : static sal_Bool IsText(sal_Int32 eType);
76 : :
77 : : private:
78 : : StringCompare Compare(const ONDXKey& rKey) const;
79 : : };
80 : :
81 : :
82 : :
83 : :
84 : : //==================================================================
85 : : // Index Page Pointer
86 : : //==================================================================
87 : 0 : SV_DECL_REF(ONDXPage) // Base class - because we need to store additional information
88 : :
89 : :
90 : 0 : class ONDXPagePtr : public ONDXPageRef
91 : : {
92 : : friend SvStream& operator << (SvStream &rStream, const ONDXPagePtr&);
93 : : friend SvStream& operator >> (SvStream &rStream, ONDXPagePtr&);
94 : :
95 : : sal_uInt32 nPagePos; // Position in the index file
96 : :
97 : : public:
98 : 0 : ONDXPagePtr(sal_uInt32 nPos = 0):nPagePos(nPos){}
99 : : ONDXPagePtr(const ONDXPagePtr& rRef);
100 : : ONDXPagePtr(ONDXPage* pRefPage);
101 : :
102 : : ONDXPagePtr& operator=(const ONDXPagePtr& rRef);
103 : : ONDXPagePtr& operator=(ONDXPage* pPageRef);
104 : :
105 : 0 : sal_uInt32 GetPagePos() const {return nPagePos;}
106 : 0 : sal_Bool HasPage() const {return nPagePos != 0;}
107 : : // sal_Bool Is() const { return isValid(); }
108 : : };
109 : : //==================================================================
110 : : // Index Page
111 : : //==================================================================
112 : : class ONDXPage : public SvRefBase
113 : : {
114 : : friend class ODbaseIndex;
115 : :
116 : : friend SvStream& operator << (SvStream &rStream, const ONDXPage&);
117 : : friend SvStream& operator >> (SvStream &rStream, ONDXPage&);
118 : :
119 : : sal_uInt32 nPagePos; // Position in the index file
120 : : sal_Bool bModified : 1;
121 : : sal_uInt16 nCount;
122 : :
123 : : ONDXPagePtr aParent, // Parent page
124 : : aChild; // Pointer to the right child page
125 : : ODbaseIndex& rIndex;
126 : : ONDXNode* ppNodes; // Array of nodes
127 : :
128 : : public:
129 : : // Node operations
130 : 0 : sal_uInt16 Count() const {return nCount;}
131 : :
132 : : sal_Bool Insert(ONDXNode& rNode, sal_uInt32 nRowsLeft = 0);
133 : : sal_Bool Insert(sal_uInt16 nIndex, ONDXNode& rNode);
134 : : sal_Bool Append(ONDXNode& rNode);
135 : : sal_Bool Delete(sal_uInt16);
136 : : void Remove(sal_uInt16);
137 : : void Release(sal_Bool bSave = sal_True);
138 : : void ReleaseFull(sal_Bool bSave = sal_True);
139 : :
140 : : // Split and merge
141 : : ONDXNode Split(ONDXPage& rPage);
142 : : void Merge(sal_uInt16 nParentNodePos, ONDXPagePtr xPage);
143 : :
144 : : // Access operators
145 : : ONDXNode& operator[] (sal_uInt16 nPos);
146 : : const ONDXNode& operator[] (sal_uInt16 nPos) const;
147 : :
148 : : sal_Bool IsRoot() const;
149 : : sal_Bool IsLeaf() const;
150 : : sal_Bool IsModified() const;
151 : : sal_Bool HasParent();
152 : : sal_Bool HasChild() const;
153 : :
154 : : sal_Bool IsFull() const;
155 : :
156 : 0 : sal_uInt32 GetPagePos() const {return nPagePos;}
157 : : ONDXPagePtr& GetChild(ODbaseIndex* pIndex = 0);
158 : :
159 : : // Parent does not need to be reloaded
160 : : ONDXPagePtr GetParent();
161 : 0 : ODbaseIndex& GetIndex() {return rIndex;}
162 : 0 : const ODbaseIndex& GetIndex() const {return rIndex;}
163 : :
164 : : // Setting the child, via reference to retain the PagePos
165 : : void SetChild(ONDXPagePtr aCh);
166 : : void SetParent(ONDXPagePtr aPa);
167 : :
168 : : sal_uInt16 Search(const ONDXKey& rSearch);
169 : : sal_uInt16 Search(const ONDXPage* pPage);
170 : : void SearchAndReplace(const ONDXKey& rSearch, ONDXKey& rReplace);
171 : :
172 : : protected:
173 : : ONDXPage(ODbaseIndex& rIndex, sal_uInt32 nPos, ONDXPage* = NULL);
174 : : ~ONDXPage();
175 : :
176 : : virtual void QueryDelete();
177 : :
178 : 0 : void SetModified(sal_Bool bMod) {bModified = bMod;}
179 : 0 : void SetPagePos(sal_uInt32 nPage) {nPagePos = nPage;}
180 : :
181 : : sal_Bool Find(const ONDXKey&); // Descend recursively
182 : : sal_uInt16 FindPos(const ONDXKey& rKey) const;
183 : :
184 : : #if OSL_DEBUG_LEVEL > 1
185 : : void PrintPage();
186 : : #endif
187 : : };
188 : :
189 [ # # # ]: 0 : SV_IMPL_REF(ONDXPage);
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
190 : :
191 : : SvStream& operator << (SvStream &rStream, const ONDXPagePtr&);
192 : : SvStream& operator >> (SvStream &rStream, ONDXPagePtr&);
193 : :
194 : 0 : inline sal_Bool ONDXPage::IsRoot() const {return !aParent.Is();}
195 : 0 : inline sal_Bool ONDXPage::IsLeaf() const {return !aChild.HasPage();}
196 : 0 : inline sal_Bool ONDXPage::IsModified() const {return bModified;}
197 : 0 : inline sal_Bool ONDXPage::HasParent() {return aParent.Is();}
198 : : inline sal_Bool ONDXPage::HasChild() const {return aChild.HasPage();}
199 : 0 : inline ONDXPagePtr ONDXPage::GetParent() {return aParent;}
200 : :
201 : 0 : inline void ONDXPage::SetParent(ONDXPagePtr aPa = ONDXPagePtr())
202 : : {
203 : 0 : aParent = aPa;
204 : 0 : }
205 : :
206 : 0 : inline void ONDXPage::SetChild(ONDXPagePtr aCh = ONDXPagePtr())
207 : : {
208 : 0 : aChild = aCh;
209 [ # # ]: 0 : if (aChild.Is())
210 [ # # ]: 0 : aChild->SetParent(this);
211 : 0 : }
212 : : SvStream& operator >> (SvStream &rStream, ONDXPage& rPage);
213 : : SvStream& operator << (SvStream &rStream, const ONDXPage& rPage);
214 : :
215 : :
216 : : typedef ::std::vector<ONDXPage*> ONDXPageList;
217 : :
218 : : //==================================================================
219 : : // Index Node
220 : : //==================================================================
221 [ # # # ]: 0 : class ONDXNode
[ # # ]
222 : : {
223 : : friend class ONDXPage;
224 : : ONDXPagePtr aChild; /* Next page reference */
225 : : ONDXKey aKey;
226 : :
227 : : public:
228 [ # # ]: 0 : ONDXNode(){}
229 : 0 : ONDXNode(const ONDXKey& rKey,
230 : : ONDXPagePtr aPagePtr = ONDXPagePtr())
231 [ # # ]: 0 : :aChild(aPagePtr),aKey(rKey) {}
232 : :
233 : : // Does the node point to a page?
234 : 0 : sal_Bool HasChild() const {return aChild.HasPage();}
235 : : // If an index is provided, we may be able to retrieve the page
236 : : ONDXPagePtr& GetChild(ODbaseIndex* pIndex = NULL, ONDXPage* = NULL);
237 : :
238 : 0 : const ONDXKey& GetKey() const { return aKey;}
239 : 0 : ONDXKey& GetKey() { return aKey;}
240 : :
241 : : // Setting the child, via reference to retain the PagePos
242 : : void SetChild(ONDXPagePtr aCh = ONDXPagePtr(), ONDXPage* = NULL);
243 : : void SetKey(ONDXKey& rKey) {aKey = rKey;}
244 : :
245 : : void Write(SvStream &rStream, const ONDXPage& rPage) const;
246 : : void Read(SvStream &rStream, ODbaseIndex&);
247 : : };
248 : : //==================================================================
249 : : // inline implementation
250 : : //==================================================================
251 : : // inline ONDXKey::ONDXKey(const ORowSetValue& rVal, sal_Int32 eType, sal_uInt32 nRec)
252 : : // : ONDXKey_BASE(eType)
253 : : // , nRecord(nRec),xValue(rVal)
254 : : // {
255 : : // }
256 : :
257 : :
258 : : // inline ONDXKey::ONDXKey(const rtl::OUString& aStr, sal_uInt32 nRec)
259 : : // : ONDXKey_BASE(::com::sun::star::sdbc::DataType::VARCHAR)
260 : : // ,nRecord(nRec)
261 : : // {
262 : : // if (aStr.len())
263 : : // xValue = aStr;
264 : : // }
265 : :
266 : : // inline ONDXKey::ONDXKey(double aVal, sal_uInt32 nRec)
267 : : // : ONDXKey_BASE(::com::sun::star::sdbc::DataType::DOUBLE)
268 : : // ,nRecord(nRec)
269 : : // ,xValue(aVal)
270 : : // {
271 : : // }
272 : :
273 : : // inline ONDXKey::ONDXKey(sal_uInt32 nRec)
274 : : // :nRecord(nRec)
275 : : // {
276 : : // }
277 : :
278 : 0 : inline ONDXKey::ONDXKey(const ONDXKey& rKey)
279 : 0 : : ONDXKey_BASE(rKey.getDBType())
280 : : ,nRecord(rKey.nRecord)
281 [ # # ][ # # ]: 0 : ,xValue(rKey.xValue)
282 : : {
283 : 0 : }
284 : :
285 : 0 : inline ONDXKey& ONDXKey::operator=(const ONDXKey& rKey)
286 : : {
287 [ # # ]: 0 : if(&rKey == this)
288 : 0 : return *this;
289 : :
290 : 0 : xValue = rKey.xValue;
291 : 0 : nRecord = rKey.nRecord;
292 : 0 : m_eDBType = rKey.getDBType();
293 : 0 : return *this;
294 : : }
295 : :
296 : 0 : inline sal_Bool ONDXKey::operator == (const ONDXKey& rKey) const
297 : : {
298 [ # # ]: 0 : if(&rKey == this)
299 : 0 : return sal_True;
300 : 0 : return Compare(rKey) == COMPARE_EQUAL;
301 : : }
302 : 0 : inline sal_Bool ONDXKey::operator != (const ONDXKey& rKey) const
303 : : {
304 : 0 : return !operator== (rKey);
305 : : }
306 : : inline sal_Bool ONDXKey::operator < (const ONDXKey& rKey) const
307 : : {
308 : : return Compare(rKey) == COMPARE_LESS;
309 : : }
310 : 0 : inline sal_Bool ONDXKey::operator > (const ONDXKey& rKey) const
311 : : {
312 : 0 : return Compare(rKey) == COMPARE_GREATER;
313 : : }
314 : 0 : inline sal_Bool ONDXKey::operator <= (const ONDXKey& rKey) const
315 : : {
316 : 0 : return !operator > (rKey);
317 : : }
318 : : inline sal_Bool ONDXKey::operator >= (const ONDXKey& rKey) const
319 : : {
320 : : return !operator< (rKey);
321 : : }
322 : :
323 : 0 : inline void ONDXNode::SetChild(ONDXPagePtr aCh, ONDXPage* pParent)
324 : : {
325 : 0 : aChild = aCh;
326 [ # # ]: 0 : if (aChild.Is())
327 [ # # ]: 0 : aChild->SetParent(pParent);
328 : 0 : }
329 : :
330 : : }
331 : :
332 : : }
333 : :
334 : :
335 : :
336 : :
337 : : #endif // _CONNECTIVITY_DBASE_INDEXNODE_HXX_
338 : :
339 : :
340 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|