protected override void InternalFindNearest(IRow row) { IRow localRow = EnsurePartialKeyRow(row); try { if (localRow != null) { BrowseTableItem item = GetTable(localRow, true, true); _tables.Add(item); EnterTableContext(item); try { TopTable.MoveCrack(); } finally { ExitTableContext(item); } } else { _tables.Add(GetTable()); } } finally { if ((localRow != null) && !Object.ReferenceEquals(row, localRow)) { localRow.Dispose(); } } }
// Must be called with the original stack protected BrowseTableItem GetTable(IRow origin, bool forward, bool inclusive) { BrowseTableItem result = FindTable(origin, forward, inclusive); if (result == null) { result = CreateTable(origin, forward, inclusive); } return(result); }
protected override bool InternalFindKey(IRow row, bool forward) { IRow localRow = EnsureKeyRow(row); try { bool tableCreated = false; BrowseTableItem table = FindTable(localRow, forward, true); if (table == null) { table = CreateTable(localRow, forward, true); tableCreated = true; } try { EnterTableContext(table); try { table.MoveCrack(); bool result = (table.UniqueKey != null) && (CompareKeys(localRow, table.UniqueKey) == 0); if (result) { _tables.Add(table); } else if (tableCreated) { table.Dispose(); } return(result); } finally { ExitTableContext(table); } } catch { if (tableCreated) { table.Dispose(); } throw; } } finally { if (!Object.ReferenceEquals(row, localRow)) { localRow.Dispose(); } } }
// Must be called with the original stack protected void SwapReader(IRow origin, bool forward, bool inclusive) { BrowseTableItem item = GetTable(origin, forward, inclusive); _tables.Add(item); EnterTableContext(TopTable); try { TopTable.MoveCrack(); } finally { ExitTableContext(TopTable); } }
protected void ExitTableContext(BrowseTableItem tableItem) { Program.Stack.Pop(); }
/* * for each column in the order descending * if the current order column is also in the origin * [or] * for each column in the origin less than the current order column * [and] current origin column = current origin value * * [and] * if the current order column is ascending xor the requested set is forward * if the current order column includes nulls * current order column is null or * if requested set is inclusive and current order column is the last origin column * current order column <= current origin value * else * current order column < current origin value * else * if requested set is inclusive and the current order column is the last origin column * current order column >= current origin value * else * current order column > current origin value * * for each column in the order greater than the current order column * if the current order column does not include nulls * and current order column is not null * else * if the current order column does not include nulls * [and] current order column is not null */ protected void EnterTableContext(BrowseTableItem tableItem) { Program.Stack.Push(tableItem.ContextVar); }
protected override void InternalFirst() { BrowseTableItem item = GetTable(null, true, true); _tables.Add(item); }