Beispiel #1
0
        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();
                }
            }
        }
Beispiel #2
0
        // 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);
        }
Beispiel #3
0
        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();
                }
            }
        }
Beispiel #4
0
        // 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);
            }
        }
Beispiel #5
0
 protected void ExitTableContext(BrowseTableItem tableItem)
 {
     Program.Stack.Pop();
 }
Beispiel #6
0
        /*
         * 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);
        }
Beispiel #7
0
        protected override void InternalFirst()
        {
            BrowseTableItem item = GetTable(null, true, true);

            _tables.Add(item);
        }