Class InternalTriggerExecutionContext

java.lang.Object
org.apache.derby.impl.sql.execute.InternalTriggerExecutionContext
All Implemented Interfaces:
TriggerExecutionContext, ExecutionStmtValidator

class InternalTriggerExecutionContext extends Object implements TriggerExecutionContext, ExecutionStmtValidator
There is one of these beasts per INSERT/DELETE/UPDATE statement. It fulfills the contract for the externally visible trigger execution context and it validates that a statement that is about to be executed doesn't violate the restrictions placed upon what can be executed from a trigger.

Note that it is crucial that cleanup() is called once the DML has completed, cleanup() makes sure that users can't do something invalid on a tec reference that they were holding from when the trigger fired.

  • Field Details

    • dmlType

      protected int dmlType
    • statementText

      protected String statementText
    • cc

      protected ConnectionContext cc
    • targetTableId

      protected UUID targetTableId
    • targetTableName

      protected String targetTableName
    • lcc

    • beforeResultSet

      protected CursorResultSet beforeResultSet
    • afterResultSet

      protected CursorResultSet afterResultSet
    • afterRow

      protected ExecRow afterRow
      used exclusively for InsertResultSets which have autoincrement columns.
    • cleanupCalled

      protected boolean cleanupCalled
    • event

      protected TriggerEvent event
    • triggerd

      protected TriggerDescriptor triggerd
    • resultSetVector

      private Vector<ResultSet> resultSetVector
    • aiCounters

      private Vector<AutoincrementCounter> aiCounters
      aiCounters is a vector of AutoincrementCounters used to keep state which might be used by the trigger. This is only used by Insert triggers-- Delete and Update triggers do not use this variable.
      See Also:
    • aiHT

      private Hashtable<String,Long> aiHT
      aiHT is a hash table of auto increment (key, value) pairs. This is used for auto increment values generated by the trigger.
  • Constructor Details

    • InternalTriggerExecutionContext

      InternalTriggerExecutionContext(LanguageConnectionContext lcc, ConnectionContext cc, String statementText, int dmlType, UUID targetTableId, String targetTableName, Vector<AutoincrementCounter> aiCounters) throws StandardException
      Build a trigger execution context.

      About the only thing of real interest to outside observers is that it pushes itself as the trigger execution context in the lcc. Be sure to call cleanup() when you are done, or you will be flogged like the reprobate that you are.

      Parameters:
      lcc - the lcc
      statementText - the text of the statement that caused the trigger to fire. may be null if we are replicating
      targetTableId - the UUID of the table upon which the trigger fired
      targetTableName - the name of the table upon which the trigger fired
      aiCounters - A vector of AutoincrementCounters to keep state of the ai columns in this insert trigger.a
      Throws:
      StandardException - on error
  • Method Details

    • setBeforeResultSet

      void setBeforeResultSet(CursorResultSet rs)
    • setAfterResultSet

      void setAfterResultSet(CursorResultSet rs) throws StandardException
      Throws:
      StandardException
    • setCurrentTriggerEvent

      void setCurrentTriggerEvent(TriggerEvent event)
    • clearCurrentTriggerEvent

      void clearCurrentTriggerEvent()
    • setTrigger

      void setTrigger(TriggerDescriptor triggerd)
    • clearTrigger

      void clearTrigger() throws StandardException
      Throws:
      StandardException
    • cleanup

      protected void cleanup() throws StandardException
      Cleanup the trigger execution context. MUST be called when the caller is done with the trigger execution context.

      We go to somewhat exaggerated lengths to free up all our resources here because a user may hold on to a TEC after it is valid, so we clean everything up to be on the safe side.

      Throws:
      StandardException - on unexpected error
    • ensureProperContext

      private void ensureProperContext() throws SQLException
      Make sure that the user isn't trying to get a result set after we have cleaned up.
      Throws:
      SQLException
    • validateStatement

      public void validateStatement(ConstantAction constantAction) throws StandardException
      Make sure that whatever statement is about to be executed is ok from the context of this trigger.

      Note that we are sub classed in replication for checks for replication specific language.

      Specified by:
      validateStatement in interface ExecutionStmtValidator
      Parameters:
      constantAction - the constant action of the action that we are to validate
      Throws:
      StandardException - on error
      See Also:
    • getTargetTableName

      public String getTargetTableName()
      Get the target table name upon which the trigger event is declared.
      Specified by:
      getTargetTableName in interface TriggerExecutionContext
      Returns:
      the target table
    • getTargetTableId

      public UUID getTargetTableId()
      Get the target table UUID upon which the trigger event is declared.
      Specified by:
      getTargetTableId in interface TriggerExecutionContext
      Returns:
      the uuid of the target table
    • getEventType

      public int getEventType()
      Get the type for the event that caused the trigger to fire.
      Specified by:
      getEventType in interface TriggerExecutionContext
      Returns:
      the event type (e.g. UPDATE_EVENT)
    • getEventStatementText

      public String getEventStatementText()
      Get the text of the statement that caused the trigger to fire.
      Specified by:
      getEventStatementText in interface TriggerExecutionContext
      Returns:
      the statement text
    • getOldRowSet

      public ResultSet getOldRowSet() throws SQLException
      Returns a result set row the old images of the changed rows. For a row trigger, the result set will have a single row. For a statement trigger, this result set has every row that has changed or will change. If a statement trigger does not affect a row, then the result set will be empty (i.e. ResultSet.next() will return false).
      Specified by:
      getOldRowSet in interface TriggerExecutionContext
      Returns:
      the ResultSet containing before images of the rows changed by the triggering event.
      Throws:
      SQLException - if called after the triggering event has completed
    • getNewRowSet

      public ResultSet getNewRowSet() throws SQLException
      Returns a result set row the new images of the changed rows. For a row trigger, the result set will have a single row. For a statement trigger, this result set has every row that has changed or will change. If a statement trigger does not affect a row, then the result set will be empty (i.e. ResultSet.next() will return false).
      Specified by:
      getNewRowSet in interface TriggerExecutionContext
      Returns:
      the ResultSet containing after images of the rows changed by the triggering event.
      Throws:
      SQLException - if called after the triggering event has completed
    • getOldRow

      public ResultSet getOldRow() throws SQLException
      Like getBeforeResultSet(), but returns a result set positioned on the first row of the before result set. Used as a convenience to get a column for a row trigger. Equivalent to getBeforeResultSet() followed by next().
      Specified by:
      getOldRow in interface TriggerExecutionContext
      Returns:
      the ResultSet positioned on the old row image.
      Throws:
      SQLException - if called after the triggering event has completed
    • getNewRow

      public ResultSet getNewRow() throws SQLException
      Like getAfterResultSet(), but returns a result set positioned on the first row of the before result set. Used as a convenience to get a column for a row trigger. Equivalent to getAfterResultSet() followed by next().
      Specified by:
      getNewRow in interface TriggerExecutionContext
      Returns:
      the ResultSet positioned on the new row image.
      Throws:
      SQLException - if called after the triggering event has completed
    • getAutoincrementValue

      public Long getAutoincrementValue(String identity)
      Description copied from interface: TriggerExecutionContext
      Get the last auto-increment value for the specified column.
      Specified by:
      getAutoincrementValue in interface TriggerExecutionContext
      Parameters:
      identity - the fully qualified name of the identity column
      Returns:
      the last auto-increment value, or null if not found
    • copyHashtableToAIHT

      public void copyHashtableToAIHT(Map<String,Long> from)
      Copy a map of auto increment values into the trigger execution context hash table of auto increment values.
    • resetAICounters

      public void resetAICounters(boolean begin)
      Reset Autoincrement counters to the beginning or the end.
      Parameters:
      begin - if True, reset the AutoincremnetCounter to the beginning-- used to reset the counters for the next trigger. If false, reset it to the end-- this sets up the counter appropriately for a AFTER STATEMENT trigger.
    • updateAICounters

      public void updateAICounters() throws StandardException
      Update auto increment counters from the last row inserted.
      Throws:
      StandardException
    • toString

      public String toString()
      Overrides:
      toString in class Object