1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 ***************************************************************************/
19 void* TreeIter::prev()
28 if (NULL
== iter
) return NULL
;
29 nodeOffset
= iter
->noElements_
;
31 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
32 rec
= (char**)((char *)rec
+ ((nodeOffset
) * sizeof(void **)));
35 void* TreeIter::next()
38 if (recordsOver
) return NULL
;
39 if (NULL
== iter
) return NULL
;
42 if (OpLessThan
==op
|| OpLessThanEquals
== op
)
50 char **rec
= (char**)((char*) iter
+ sizeof(TreeNode
));
51 //iter->displayAll(fldOffset);
54 else if (OpGreaterThan
== op
|| OpGreaterThanEquals
== op
||
57 void *rec
= locateNode();
59 //iter->displayAll(fldOffset);
65 if (nodeOffset
== iter
->noElements_
)
67 if (NULL
== iter
->next_
) {recordsOver
= true; return NULL
;}
68 char* record
= ((char*)iter
->next_
->min_
)+ fldOffset
;
69 bool result
= AllDataType::compareVal(searchKey
, record
,
72 if (!result
&& (OpLessThan
==op
|| OpLessThanEquals
== op
))
74 recordsOver
= true; return NULL
;
75 }else if (result
&& (OpGreaterThan
== op
||
76 OpGreaterThanEquals
== op
))
78 recordsOver
= true; return NULL
;
81 if (NULL
== iter
) return NULL
;
84 //TODO::take node mutex here
85 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
86 rec
= (char**)((char *)rec
+ ((nodeOffset
) * sizeof(void **)));
88 //TODO::release node mutex here
93 void* TreeIter::locateNode()
97 char *record
= ((char*)iter
->max_
)+ fldOffset
;
98 bool result
= AllDataType::compareVal(searchKey
, record
,
107 record
= ((char*)iter
->min_
)+ fldOffset
;
108 result
= AllDataType::compareVal(searchKey
, record
,
112 //current node contains the key
113 void *rec
= locateElement();
125 void* TreeIter::locateElement()
127 //do binary search and locate the element
128 int loc
=0, middle
=0, start
=0, end
=iter
->noElements_
-1;
129 char **rec
= (char**)((char*)iter
+ sizeof(TreeNode
));
130 //TODO::take node mutex
131 for(middle
= (start
+ end
) / 2; start
<= end
; middle
= (start
+end
)/2)
134 char *record
= ((char*)*(rec
+middle
)) + fldOffset
;
135 bool res
= AllDataType::compareVal(searchKey
, record
, OpEquals
,
142 res
= AllDataType::compareVal(searchKey
, record
, OpLessThan
,
155 char **tuple
= (char**)((char*)rec
+ (loc
* sizeof(void *)));
157 //TODO::release node mutex here