org.apache.derby.impl.sql.execute
Class InternalTriggerExecutionContext

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

public class InternalTriggerExecutionContext
extends java.lang.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 Summary
protected  CursorResultSet afterResultSet
           
protected  ExecRow afterRow
          used exclusively for InsertResultSets which have autoincrement columns.
private  java.util.Vector aiCounters
          aiCounters is a vector of AutoincrementCounters used to keep state which might be used by the trigger.
private  java.util.Hashtable aiHT
          aiHT is a hashtable of autincrement pairs.
protected  CursorResultSet beforeResultSet
           
protected  ConnectionContext cc
           
protected  int[] changedColIds
           
protected  java.lang.String[] changedColNames
           
protected  boolean cleanupCalled
           
protected  int dmlType
           
protected  TriggerEvent event
           
protected  LanguageConnectionContext lcc
           
private  java.util.Vector resultSetVector
           
protected  java.lang.String statementText
           
protected  UUID targetTableId
           
protected  java.lang.String targetTableName
           
protected  TriggerDescriptor triggerd
           
 
Fields inherited from interface org.apache.derby.iapi.db.TriggerExecutionContext
DELETE_EVENT, INSERT_EVENT, UPDATE_EVENT
 
Constructor Summary
InternalTriggerExecutionContext(LanguageConnectionContext lcc, ConnectionContext cc, java.lang.String statementText, int dmlType, int[] changedColIds, java.lang.String[] changedColNames, UUID targetTableId, java.lang.String targetTableName, java.util.Vector aiCounters)
          Build me a big old nasty trigger execution context.
 
Method Summary
protected  void cleanup()
          Cleanup the trigger execution context.
(package private)  void clearCurrentTriggerEvent()
           
(package private)  void clearTrigger()
           
 void copyHashtableToAIHT(java.util.Map from)
          Copy a map of autoincrement values into the trigger execution context hashtable of autoincrement values.
private  void ensureProperContext()
          Make sure that the user isn't trying to get a result set after we have cleaned up.
 java.lang.Long getAutoincrementValue(java.lang.String identity)
           
 java.lang.String getEventStatementText()
          Get the text of the statement that caused the trigger to fire.
 int getEventType()
          Get the type for the event that caused the trigger to fire.
 java.lang.String[] getModifiedColumns()
          Get the columns that have been modified by the statement that caused this trigger to fire.
 java.sql.ResultSet getNewRow()
          Like getAfterResultSet(), but returns a result set positioned on the first row of the before result set.
 java.sql.ResultSet getNewRowSet()
          Returns a result set row the new images of the changed rows.
 java.sql.ResultSet getOldRow()
          Like getBeforeResultSet(), but returns a result set positioned on the first row of the before result set.
 java.sql.ResultSet getOldRowSet()
          Returns a result set row the old images of the changed rows.
 UUID getTargetTableId()
          Get the target table UUID upon which the trigger event is declared.
 java.lang.String getTargetTableName()
          Get the target table name upon which the trigger event is declared.
 void resetAICounters(boolean begin)
          Reset Autoincrement counters to the beginning or the end.
(package private)  void setAfterResultSet(CursorResultSet rs)
           
(package private)  void setBeforeResultSet(CursorResultSet rs)
           
(package private)  void setCurrentTriggerEvent(TriggerEvent event)
           
(package private)  void setTrigger(TriggerDescriptor triggerd)
           
 java.lang.String toString()
           
 void updateAICounters()
          Update Autoincrement Counters from the last row inserted.
 void validateStatement(ConstantAction constantAction)
          Make sure that whatever statement is about to be executed is ok from the context of this trigger.
 boolean wasColumnModified(int columnNumber)
          Find out of a column was changed, by column number
 boolean wasColumnModified(java.lang.String columnName)
          Find out of a column was changed, by column name
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

changedColIds

protected int[] changedColIds

changedColNames

protected java.lang.String[] changedColNames

dmlType

protected int dmlType

statementText

protected java.lang.String statementText

cc

protected ConnectionContext cc

targetTableId

protected UUID targetTableId

targetTableName

protected java.lang.String targetTableName

lcc

protected LanguageConnectionContext 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 java.util.Vector resultSetVector

aiCounters

private java.util.Vector 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:
AutoincrementCounter

aiHT

private java.util.Hashtable aiHT
aiHT is a hashtable of autincrement pairs. This is used for ai values generated by the trigger.

Constructor Detail

InternalTriggerExecutionContext

public InternalTriggerExecutionContext(LanguageConnectionContext lcc,
                                       ConnectionContext cc,
                                       java.lang.String statementText,
                                       int dmlType,
                                       int[] changedColIds,
                                       java.lang.String[] changedColNames,
                                       UUID targetTableId,
                                       java.lang.String targetTableName,
                                       java.util.Vector aiCounters)
                                throws StandardException
Build me a big old nasty trigger execution context. Damnit.

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
changedColIds - the list of columns that changed. Null for all columns or INSERT/DELETE.
changedColNames - the names that correspond to changedColIds
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 Detail

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 java.sql.SQLException
Make sure that the user isn't trying to get a result set after we have cleaned up.

Throws:
java.sql.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:
ConstantAction

getTargetTableName

public java.lang.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 java.lang.String getEventStatementText()
Get the text of the statement that caused the trigger to fire.

Specified by:
getEventStatementText in interface TriggerExecutionContext
Returns:
the statement text

getModifiedColumns

public java.lang.String[] getModifiedColumns()
Get the columns that have been modified by the statement that caused this trigger to fire. If all columns are modified, will return null (e.g. for INSERT or DELETE will return null).

Specified by:
getModifiedColumns in interface TriggerExecutionContext
Returns:
an array of Strings

wasColumnModified

public boolean wasColumnModified(java.lang.String columnName)
Find out of a column was changed, by column name

Specified by:
wasColumnModified in interface TriggerExecutionContext
Parameters:
columnName - the column to check
Returns:
true if the column was modified by this statement. Note that this will always return true for INSERT and DELETE regardless of the column name passed in.

wasColumnModified

public boolean wasColumnModified(int columnNumber)
Find out of a column was changed, by column number

Specified by:
wasColumnModified in interface TriggerExecutionContext
Parameters:
columnNumber - the column to check
Returns:
true if the column was modified by this statement. Note that this will always return true for INSERT and DELETE regardless of the column name passed in.

getOldRowSet

public java.sql.ResultSet getOldRowSet()
                                throws java.sql.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:
java.sql.SQLException - if called after the triggering event has completed

getNewRowSet

public java.sql.ResultSet getNewRowSet()
                                throws java.sql.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:
java.sql.SQLException - if called after the triggering event has completed

getOldRow

public java.sql.ResultSet getOldRow()
                             throws java.sql.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:
java.sql.SQLException - if called after the triggering event has completed

getNewRow

public java.sql.ResultSet getNewRow()
                             throws java.sql.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:
java.sql.SQLException - if called after the triggering event has completed

getAutoincrementValue

public java.lang.Long getAutoincrementValue(java.lang.String identity)

copyHashtableToAIHT

public void copyHashtableToAIHT(java.util.Map from)
Copy a map of autoincrement values into the trigger execution context hashtable of autoincrement 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 Autoincrement Counters from the last row inserted.

Throws:
StandardException

toString

public java.lang.String toString()
Overrides:
toString in class java.lang.Object

Built on Thu 2012-03-29 21:53:33+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.