public void Fire(TableEvent tableEvent, IRequest context) { var oldState = GetOldState(context); try { var triggerType = TriggerInfo.TriggerType; var tableName = tableEvent.Table.TableInfo.TableName; context.Context.OnEvent(new TriggerEvent(triggerType, Name, tableName, tableEvent.EventTime, tableEvent.EventType, tableEvent.OldRowId, tableEvent.NewRow)); var newState = new OldNewTableState(tableName, tableEvent.OldRowId.RowNumber, tableEvent.NewRow, tableEvent.EventTime == TriggerEventTime.Before); SetState(context, newState); using (var block = context.CreateBlock()) { FireTrigger(tableEvent, block); } } catch (TriggerException) { throw; } catch (Exception ex) { throw new TriggerException(String.Format("An unknown error occurred while executing trigger '{0}'.", Name), ex); } finally { SetState(context, oldState); } }
public void Invoke(IQuery context, TableEvent tableEvent) { var isBefore = (tableEvent.EventType & TriggerEventType.Before) != 0; var transaction = context.Session.Transaction; if (transaction is ITableStateHandler) { var stateHandler = (ITableStateHandler)transaction; var oldState = stateHandler.TableState; var newState = new OldNewTableState(tableEvent.Table.FullName, tableEvent.OldRowId.RowNumber, tableEvent.NewRow, isBefore); stateHandler.SetTableState(newState); try { FireTrigger(context, tableEvent); } finally { stateHandler.SetTableState(oldState); } } else { FireTrigger(context, tableEvent); } }
internal Transaction(ITransactionContext context, Database database, int commitId, IsolationLevel isolation, IEnumerable<TableSource> committedTables, IEnumerable<IIndexSet> indexSets) { CommitId = commitId; Database = database; Isolation = isolation; Context = context; context.RegisterInstance<ITransaction>(this); Registry = new TransactionRegistry(this); TableManager.AddVisibleTables(committedTables, indexSets); AddInternalTables(); TableState = new OldNewTableState(); IsClosed = false; Database.TransactionFactory.OpenTransactions.AddTransaction(this); this.CurrentSchema(database.Context.DefaultSchema()); this.ReadOnly(database.Context.ReadOnly()); this.AutoCommit(database.Context.AutoCommit()); this.IgnoreIdentifiersCase(database.Context.IgnoreIdentifiersCase()); this.ParameterStyle(QueryParameterStyle.Marker); }
private static void SetState(IRequest request, OldNewTableState newState) { if (request.Query.Session is ITableStateHandler) { ((ITableStateHandler)request.Query.Session).SetTableState(newState); } else if (request.Query.Session.Transaction is ITableStateHandler) { ((ITableStateHandler)request.Query.Session.Transaction).SetTableState(newState); } }
internal Transaction(Database database, int commitId, IsolationLevel isolation, IEnumerable<TableSource> committedTables, IEnumerable<IIndexSet> indexSets) { CommitId = commitId; Database = database; Isolation = isolation; InitManagers(); Registry = new TransactionRegistry(this); tableManager.AddVisibleTables(committedTables, indexSets); AddInternalTables(); TableState = new OldNewTableState(); IsClosed = false; Database.TransactionFactory.OpenTransactions.AddTransaction(this); currentSchema = database.DatabaseContext.DefaultSchema(); readOnly = dbReadOnly = database.DatabaseContext.ReadOnly(); autoCommit = database.DatabaseContext.AutoCommit(); ignoreCase = database.DatabaseContext.IgnoreIdentifiersCase(); }
public void SetTableState(OldNewTableState tableState) { TableState = tableState; }
public void Invoke(IQueryContext context, TableEventContext tableEvent) { var isBefore = (tableEvent.EventType & TriggerEventType.Before) != 0; var transaction = context.Session.Transaction; if (transaction is ITableStateHandler) { var stateHandler = (ITableStateHandler) transaction; var oldState = stateHandler.TableState; var newState = new OldNewTableState(tableEvent.Table.FullName, tableEvent.OldRowId.RowNumber, tableEvent.NewRow, isBefore); stateHandler.SetTableState(newState); try { FireTrigger(context, tableEvent); } finally { stateHandler.SetTableState(oldState); } } else { FireTrigger(context, tableEvent); } }