📄 btree.cs
字号:
if (BtreePage.compare(from, pg, posStack[sp-1]) >= from.inclusion)
{
sp = 0;
}
db.pool.unfix(pg);
}
}
}
}
public void Dispose() {}
public bool MoveNext()
{
if (updateCounter != tree.updateCounter)
{
if (db.concurrentIterator)
{
refresh();
}
else
{
throw new InvalidOperationException("B-Tree was modified");
}
}
if (sp != 0)
{
int pos = posStack[sp-1];
Page pg = db.getPage(pageStack[sp-1]);
hasCurrent = true;
getCurrent(pg, pos);
gotoNextItem(pg, pos);
return true;
}
hasCurrent = false;
return false;
}
private BtreeKey getCurrentKey(Page pg, int pos)
{
BtreeKey key;
switch (type)
{
case ClassDescriptor.FieldType.tpString:
key = new BtreeKey(null, BtreePage.getKeyStrOid(pg, pos));
key.getStr(pg, pos);
break;
case ClassDescriptor.FieldType.tpArrayOfByte:
key = new BtreeKey(null, BtreePage.getKeyStrOid(pg, pos));
key.getByteArray(pg, pos);
break;
default:
key = new BtreeKey(null, BtreePage.getReference(pg, BtreePage.maxItems-1-pos));
key.extract(pg, BtreePage.firstKeyOffs + pos*ClassDescriptor.Sizeof[(int)type], type);
break;
}
return key;
}
private void refresh()
{
if (sp != 0)
{
if (nextKey == null)
{
Reset();
}
else
{
Key saveFrom = from;
Key saveTill = till;
int next = nextKey.oid;
if (order == IterationOrder.AscentOrder)
{
from = nextKey.key;
}
else
{
till = nextKey.key;
}
Reset();
from = saveFrom;
till = saveTill;
while (true)
{
int pos = posStack[sp-1];
Page pg = db.getPage(pageStack[sp-1]);
int oid = type == ClassDescriptor.FieldType.tpString || type == ClassDescriptor.FieldType.tpArrayOfByte
? BtreePage.getKeyStrOid(pg, pos)
: BtreePage.getReference(pg, BtreePage.maxItems-1-pos);
if (oid != next)
{
gotoNextItem(pg, pos);
}
else
{
db.pool.unfix(pg);
break;
}
}
}
}
updateCounter = tree.updateCounter;
}
protected virtual void getCurrent(Page pg, int pos)
{
oid = (type == ClassDescriptor.FieldType.tpString || type == ClassDescriptor.FieldType.tpArrayOfByte)
? BtreePage.getKeyStrOid(pg, pos)
: BtreePage.getReference(pg, BtreePage.maxItems-1-pos);
}
public int CurrentOid
{
get
{
return oid;
}
}
#if USE_GENERICS
object IEnumerator.Current
{
get
{
return getCurrent();
}
}
public virtual V Current
#else
public virtual object Current
#endif
{
get
{
#if USE_GENERICS
return (V)getCurrent();
#else
return getCurrent();
#endif
}
}
private object getCurrent()
{
if (!hasCurrent)
{
throw new InvalidOperationException();
}
return db.lookupObject(oid, null);
}
protected void gotoNextItem(Page pg, int pos)
{
if (type == ClassDescriptor.FieldType.tpString)
{
if (order == IterationOrder.AscentOrder)
{
if (++pos == end)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (++pos <= BtreePage.getnItems(pg))
{
posStack[sp-1] = pos;
do
{
int pageId = BtreePage.getKeyStrOid(pg, pos);
db.pool.unfix(pg);
pg = db.getPage(pageId);
end = BtreePage.getnItems(pg);
pageStack[sp] = pageId;
posStack[sp] = pos = 0;
} while (++sp < pageStack.Length);
break;
}
}
}
else
{
posStack[sp-1] = pos;
}
if (sp != 0 && till != null && -BtreePage.compareStr(till, pg, pos) >= till.inclusion)
{
sp = 0;
}
}
else
{ // descent order
if (--pos < 0)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (--pos >= 0)
{
posStack[sp-1] = pos;
do
{
int pageId = BtreePage.getKeyStrOid(pg, pos);
db.pool.unfix(pg);
pg = db.getPage(pageId);
pageStack[sp] = pageId;
posStack[sp] = pos = BtreePage.getnItems(pg);
} while (++sp < pageStack.Length);
posStack[sp-1] = --pos;
break;
}
}
}
else
{
posStack[sp-1] = pos;
}
if (sp != 0 && from != null && BtreePage.compareStr(from, pg, pos) >= from.inclusion)
{
sp = 0;
}
}
}
else if (type == ClassDescriptor.FieldType.tpArrayOfByte)
{
if (order == IterationOrder.AscentOrder)
{
if (++pos == end)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (++pos <= BtreePage.getnItems(pg))
{
posStack[sp-1] = pos;
do
{
int pageId = BtreePage.getKeyStrOid(pg, pos);
db.pool.unfix(pg);
pg = db.getPage(pageId);
end = BtreePage.getnItems(pg);
pageStack[sp] = pageId;
posStack[sp] = pos = 0;
} while (++sp < pageStack.Length);
break;
}
}
}
else
{
posStack[sp-1] = pos;
}
if (sp != 0 && till != null && -tree.compareByteArrays(till, pg, pos) >= till.inclusion)
{
sp = 0;
}
}
else
{ // descent order
if (--pos < 0)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (--pos >= 0)
{
posStack[sp-1] = pos;
do
{
int pageId = BtreePage.getKeyStrOid(pg, pos);
db.pool.unfix(pg);
pg = db.getPage(pageId);
pageStack[sp] = pageId;
posStack[sp] = pos = BtreePage.getnItems(pg);
} while (++sp < pageStack.Length);
posStack[sp-1] = --pos;
break;
}
}
}
else
{
posStack[sp-1] = pos;
}
if (sp != 0 && from != null && tree.compareByteArrays(from, pg, pos) >= from.inclusion)
{
sp = 0;
}
}
}
else
{ // scalar type
if (order == IterationOrder.AscentOrder)
{
if (++pos == end)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (++pos <= BtreePage.getnItems(pg))
{
posStack[sp-1] = pos;
do
{
int pageId = BtreePage.getReference(pg, BtreePage.maxItems-1-pos);
db.pool.unfix(pg);
pg = db.getPage(pageId);
end = BtreePage.getnItems(pg);
pageStack[sp] = pageId;
posStack[sp] = pos = 0;
} while (++sp < pageStack.Length);
break;
}
}
}
else
{
posStack[sp-1] = pos;
}
if (sp != 0 && till != null && -BtreePage.compare(till, pg, pos) >= till.inclusion)
{
sp = 0;
}
}
else
{ // descent order
if (--pos < 0)
{
while (--sp != 0)
{
db.pool.unfix(pg);
pos = posStack[sp-1];
pg = db.getPage(pageStack[sp-1]);
if (--pos >= 0)
{
posStack[sp-1] = pos;
do
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -