protected override object InternalExecute(Program program, PlanNode planNode) { if (planNode is BaseTableVarNode) { MemoryScan scan = new MemoryScan(program, this, (BaseTableVarNode)planNode); try { scan.NativeTable = EnsureNativeTable(((BaseTableVarNode)planNode).TableVar); scan.Key = scan.NativeTable.ClusteredIndex.Key; scan.Open(); return(scan); } catch { scan.Dispose(); throw; } } else if (planNode is OrderNode) { MemoryScan scan = new MemoryScan(program, this, (BaseTableVarNode)planNode.Nodes[0]); try { scan.NativeTable = EnsureNativeTable(((BaseTableVarNode)planNode.Nodes[0]).TableVar); scan.Key = ((OrderNode)planNode).PhysicalOrder; scan.Direction = ((OrderNode)planNode).ScanDirection; scan.Node.Order = ((OrderNode)planNode).Order; scan.Open(); return(scan); } catch { scan.Dispose(); throw; } } else if (planNode is CreateTableVarBaseNode) { EnsureNativeTable(((CreateTableVarBaseNode)planNode).GetTableVar()); return(null); } else if (planNode is AlterTableNode) { // TODO: Memory device alter table support return(null); } else if (planNode is DropTableNode) { Schema.TableVar tableVar = ((DropTableNode)planNode).Table; NativeTables tables = GetTables(tableVar.Scope); lock (tables) { int tableIndex = tables.IndexOf(tableVar); if (tableIndex >= 0) { NativeTable nativeTable = tables[tableIndex]; #if USEMEMORYDEVICETRANSACTIONS RemoveTransactionReferences(nativeTable.TableVar); #endif nativeTable.Drop(program.ValueManager); tables.RemoveAt(tableIndex); } } return(null); } else { throw new DeviceException(DeviceException.Codes.InvalidExecuteRequest, Device.Name, planNode.ToString()); } }
//Execute is what actually returns a value? Plan is executed which return a scan. protected override object InternalExecute(Program program, PlanNode planNode) { if (planNode is BaseTableVarNode) { FastoreCursor scan = new FastoreCursor(program, _db, (BaseTableVarNode)planNode); try { scan.Open(); return(scan); } catch { scan.Dispose(); throw; } } else if (planNode is OrderNode) { OrderNode orderNode = (OrderNode)planNode; if (orderNode.Order.Columns.Count == 1) { FastoreCursor scan = new FastoreCursor(program, _db, (BaseTableVarNode)planNode.Nodes[0]); try { scan.Key = orderNode.PhysicalOrder; scan.Direction = orderNode.ScanDirection; scan.Node.Order = orderNode.Order; scan.Open(); return(scan); } catch { scan.Dispose(); throw; } } else { FastoreStackedCursor scan = new FastoreStackedCursor(program, _db, orderNode.Order, orderNode.PhysicalOrder, (BaseTableVarNode)planNode.Nodes[0]); try { scan.Open(); return(scan); } catch { scan.Dispose(); throw; } } } else if (planNode is CreateTableVarBaseNode) { EnsureFastoreTable(((CreateTableVarBaseNode)planNode).GetTableVar()); return(null); } else if (planNode is AlterTableNode) { // TODO: Memory device alter table support return(null); } else if (planNode is DropTableNode) { Schema.TableVar tableVar = ((DropTableNode)planNode).Table; FastoreTables tables = GetTables(tableVar.Scope); lock (tables) { int tableIndex = tables.IndexOf(tableVar); if (tableIndex >= 0) { FastoreTable nativeTable = tables[tableIndex]; nativeTable.Drop(program.ValueManager); tables.RemoveAt(tableIndex); } } return(null); } else { throw new DeviceException(DeviceException.Codes.InvalidExecuteRequest, Device.Name, planNode.ToString()); } }