Class GenericActivationHolder

  • All Implemented Interfaces:
    Dependable, Activation, Dependent

    public final class GenericActivationHolder
    extends java.lang.Object
    implements Activation
    This class holds an Activation, and passes through most of the calls to the activation. The purpose of this class is to allow a PreparedStatement to be recompiled without the caller having to detect this and get a new activation. In addition to the Activation, this class holds a reference to the PreparedStatement that created it, along with a reference to the GeneratedClass that was associated with the PreparedStatement at the time this holder was created. These references are used to validate the Activation, to ensure that an activation is used only with the PreparedStatement that created it, and to detect when recompilation has happened. We detect recompilation by checking whether the GeneratedClass has changed. If it has, we try to let the caller continue to use this ActivationHolder. We create a new instance of the new GeneratedClass (that is, we create a new Activation), and we compare the number and type of parameters. If these are compatible, we copy the parameters from the old to the new Activation. If they are not compatible, we throw an exception telling the user that the Activation is out of date, and they need to get a new one.
    • Method Detail

      • reset

        public void reset()
                   throws StandardException
        Description copied from interface: Activation
        Resets the activation to the "pre-execution" state - that is, the state where it can be used to begin a new execution. Frees local buffers, stops scans, resets counters to zero, sets current date and time to an unitialized state, etc.
        Specified by:
        reset in interface Activation
        Throws:
        StandardException - thrown on failure
        See Also:
        Activation.reset()
      • checkIfThisActivationHasHoldCursor

        public boolean checkIfThisActivationHasHoldCursor​(java.lang.String tableName)
        Temporary tables can be declared with ON COMMIT DELETE ROWS. But if the table has a held curosr open at commit time, data should not be deleted from the table. This method, (gets called at commit time) checks if this activation held cursor and if so, does that cursor reference the passed temp table name.
        Specified by:
        checkIfThisActivationHasHoldCursor in interface Activation
        Returns:
        true if this activation has held cursor and if it references the passed temp table name
      • setCursorName

        public void setCursorName​(java.lang.String cursorName)
        Description copied from interface: Activation
        JDBC requires that all select statements be converted into cursors, and that the cursor name be settable for each execution of a select statement. The Language Module will support this, so that the JDBC driver will not have to parse JSQL text. This method will have no effect when called on non-select statements.

        There will be a JSQL statement to disable the "cursorization" of all select statements. For non-cursorized select statements, this method will have no effect.

        This has no effect if the activation has been closed.

        Specified by:
        setCursorName in interface Activation
        Parameters:
        cursorName - The cursor name to use.
        See Also:
        Activation.setCursorName(java.lang.String)
      • getCursorName

        public java.lang.String getCursorName()
        Description copied from interface: Activation
        Return the cursor name of this activation. This will differ from its ResultSet's cursor name if it has been altered with setCursorName. Thus this always returns the cursor name of the next execution of this activation. The cursor name of the current execution must be obtained from the ResultSet. or this.getResultSet.getCursorName() [with null checking].

        Statements that do not support cursors will return a null.

        Specified by:
        getCursorName in interface Activation
        Returns:
        The cursor name.
        See Also:
        Activation.getCursorName()
      • setAutoGeneratedKeysResultsetInfo

        public void setAutoGeneratedKeysResultsetInfo​(int[] columnIndexes,
                                                      java.lang.String[] columnNames)
        Description copied from interface: Activation
        Set the auto-generated keys resultset mode to true for this activation. The specific columns for auto-generated keys resultset can be requested by passing column positions array The specific columns for auto-generated keys resultset can be requested by passing column names array Both the parameters would be null if user didn't request specific keys. Otherwise, the user could request specific columns by passing column positions or names array but not both.
        Specified by:
        setAutoGeneratedKeysResultsetInfo in interface Activation
        Parameters:
        columnIndexes - Request specific columns in auto-generated keys resultset by passing column positions. null means no specific columns requested by position
        columnNames - Request specific columns in auto-generated keys resultset by passing column names. null means no specific columns requested by position
        See Also:
        Activation.setAutoGeneratedKeysResultsetInfo(int[], java.lang.String[])
      • getAutoGeneratedKeysColumnNames

        public java.lang.String[] getAutoGeneratedKeysColumnNames()
        Description copied from interface: Activation
        Returns the column names array of columns requested in auto-generated keys resultset for this avtivation. Returns null if no specific column requested by names

        Specified by:
        getAutoGeneratedKeysColumnNames in interface Activation
        Returns:
        column names array of columns requested.
        See Also:
        Activation.getAutoGeneratedKeysColumnNames()
      • getResultSet

        public ResultSet getResultSet()
        Description copied from interface: Activation
        Returns the current result set for this activation, i.e. the one returned by the last execute() call. If there has been no execute call or the activation has been reset or closed, a null is returned.
        Specified by:
        getResultSet in interface Activation
        Returns:
        the current ResultSet of this activation.
        See Also:
        Activation.getResultSet()
      • setCurrentRow

        public void setCurrentRow​(ExecRow currentRow,
                                  int resultSetNumber)
        Description copied from interface: Activation
        Generated plans have a current row field for ease in defining the methods and finding them dynamically. The interface is used to set the row before a dynamic method that uses it is invoked.

        When all processing on the currentRow has been completed, callers should call activation.clearCurrentRow(resultSetNumber) to ensure that no unnecessary references are retained to rows. This will allow the rows no longer in use to be collected by the garbage collecter.

        Specified by:
        setCurrentRow in interface Activation
        Parameters:
        currentRow - The row to be operated upon.
        resultSetNumber - The resultSetNumber for the current ResultSet
        See Also:
        Activation.setCurrentRow(org.apache.derby.iapi.sql.execute.ExecRow, int)
      • clearCurrentRow

        public void clearCurrentRow​(int resultSetNumber)
        Description copied from interface: Activation
        Generated plans have a current row field for ease in defining the methods and finding them dynamically. The interface is used to set the row before a dynamic method that uses it is invoked.

        When all processing on the currentRow has been completed, callers should call activation.clearCurrentRow(resultSetNumber) to ensure that no unnecessary references are retained to rows. This will allow the rows no longer in use to be collected by the garbage collecter.

        Specified by:
        clearCurrentRow in interface Activation
        Parameters:
        resultSetNumber - The resultSetNumber for the current ResultSet
        See Also:
        Activation.clearCurrentRow(int)
      • getIndexConglomerateNumber

        public long getIndexConglomerateNumber()
        Description copied from interface: Activation
        Get the conglomerate number of the index, if any, that has already been opened for scaning for an update or delete. (Saves opening the ScanController twice.)
        Specified by:
        getIndexConglomerateNumber in interface Activation
        Returns:
        The conglomerate number, if available, to use for the update.
        See Also:
        Activation.getIndexConglomerateNumber()
      • setIndexConglomerateNumber

        public void setIndexConglomerateNumber​(long indexConglomerateNumber)
        Description copied from interface: Activation
        Set the conglomerate number of the index to be used for an update or delete, when scanning an index that will also be updated (Saves opening the ScanController twice.)
        Specified by:
        setIndexConglomerateNumber in interface Activation
        Parameters:
        indexConglomerateNumber - The conglomerate number of the index to reuse for the update or delete.
        See Also:
        Activation.setIndexConglomerateNumber(long)
      • close

        public void close()
                   throws StandardException
        Description copied from interface: Activation
        Closing an activation statement marks it as unusable. Any other requests made on it will fail. An activation should be marked closed when it is expected to not be used any longer, i.e. when the connection for it is closed, or it has suffered some sort of severe error. This will also close its result set and release any resources it holds e.g. for parameters.

        Any class that implements this must be prepared to be executed from garbage collection, ie. there is no matching context stack.

        Specified by:
        close in interface Activation
        Throws:
        StandardException - Thrown on error
        See Also:
        Activation.close()
      • isClosed

        public boolean isClosed()
        Description copied from interface: Activation
        Find out if the activation is closed or not.
        Specified by:
        isClosed in interface Activation
        Returns:
        true if the Activation has been closed.
        See Also:
        Activation.isClosed()
      • getNumSubqueries

        public int getNumSubqueries()
        Get the number of subqueries in the entire query.
        Specified by:
        getNumSubqueries in interface Activation
        Returns:
        int The number of subqueries in the entire query.
      • setForCreateTable

        public void setForCreateTable()
        Description copied from interface: Activation
        Mark the Activation as being for create table. (NOTE: We can do certain optimizations for create table that we can't do for other DDL.)
        Specified by:
        setForCreateTable in interface Activation
        See Also:
        Activation.setForCreateTable()
      • getForCreateTable

        public boolean getForCreateTable()
        Description copied from interface: Activation
        Get whether or not this activation is for create table. (NOTE: We can do certain optimizations for create table that we can't do for other DDL.)
        Specified by:
        getForCreateTable in interface Activation
        Returns:
        Whether or not this activation is for create table.
        See Also:
        Activation.getForCreateTable()
      • setMaxRows

        public void setMaxRows​(long maxRows)
        Description copied from interface: Activation
        Set the maximum # of rows. (# of rows that can be returned by a ResultSet. 0 means no limit.)
        Specified by:
        setMaxRows in interface Activation
        Parameters:
        maxRows - Maximum # of rows. (0 means no limit.)
        See Also:
        Activation.setMaxRows(long)
      • getMaxRows

        public long getMaxRows()
        Description copied from interface: Activation
        Get the maximum # of rows. (# of rows that can be returned by a ResultSet. 0 means no limit.)
        Specified by:
        getMaxRows in interface Activation
        Returns:
        Maximum # of rows. (0 means no limit.)
        See Also:
        Activation.getMaxRows()
      • setTargetVTI

        public void setTargetVTI​(java.sql.ResultSet targetVTI)
        Description copied from interface: Activation
        Save the ResultSet for the target of an update/delete to a VTI.
        Specified by:
        setTargetVTI in interface Activation
      • getTargetVTI

        public java.sql.ResultSet getTargetVTI()
        Description copied from interface: Activation
        Get the ResultSet for the target of an update/delete to a VTI.
        Specified by:
        getTargetVTI in interface Activation
        Returns:
        The ResultSet for the target of an update/delete to a VTI.
      • setupSQLSessionContextForChildren

        public SQLSessionContext setupSQLSessionContextForChildren​(boolean push)
        Description copied from interface: Activation
        Set up and return the current SQL session context for all immediately nested connections stemming from the call or function invocation of the statement corresponding to this activation (push=true) or for a substatement, which shares the parents statement's session context (push=false).
        Specified by:
        setupSQLSessionContextForChildren in interface Activation
        Parameters:
        push - true if used to push a new connection context
      • setParentActivation

        public void setParentActivation​(Activation a)
        Description copied from interface: Activation
        This activation is created in a dynamic call context or a substatement execution context, chain its parent statements activation..
        Specified by:
        setParentActivation in interface Activation
      • getParentActivation

        public Activation getParentActivation()
        Description copied from interface: Activation
        This activation is created in a dynamic call context, or substatement execution context; get its caller's or superstatement's activation.
        Specified by:
        getParentActivation in interface Activation
        Returns:
        The caller's activation
      • getDependableFinder

        public DependableFinder getDependableFinder()
        Description copied from interface: Dependable
        Get an object which can be written to disk and which, when read from disk, will find or reconstruct this in-memory Dependable.
        Specified by:
        getDependableFinder in interface Dependable
        Returns:
        A Finder object that can be written to disk if this is a Persistent Dependable. Null if this is not a persistent dependable.
        See Also:
        Dependable.getDependableFinder()
      • getObjectName

        public java.lang.String getObjectName()
        Description copied from interface: Dependable
        Get the name of this Dependable OBJECT. This is useful for diagnostic messages.
        Specified by:
        getObjectName in interface Dependable
        Returns:
        Name of Dependable OBJECT.
        See Also:
        Dependable.getObjectName()
      • getClassType

        public java.lang.String getClassType()
        Description copied from interface: Dependable
        Get the unique class id for the Dependable. Every Dependable belongs to a class of Dependables.
        Specified by:
        getClassType in interface Dependable
        Returns:
        type of this Dependable.
        See Also:
        Dependable.getClassType()
      • isPersistent

        public boolean isPersistent()
        Description copied from interface: Dependable
        Return whether or not this Dependable is persistent. Persistent dependencies are stored in SYS.SYSDEPENDS.
        Specified by:
        isPersistent in interface Dependable
        Returns:
        true if this Dependable is persistent.
        See Also:
        Dependable.isPersistent()
      • isValid

        public boolean isValid()
        Description copied from interface: Dependent
        Check that all of the dependent's dependencies are valid.
        Specified by:
        isValid in interface Dependent
        Returns:
        true if the dependent is currently valid
        See Also:
        Dependent.isValid()
      • markUnused

        public void markUnused()
        Mark the activation as unused.
        Specified by:
        markUnused in interface Activation
      • isInUse

        public boolean isInUse()
        Is the activation in use?
        Specified by:
        isInUse in interface Activation
        Returns:
        true/false
      • informOfRowCount

        public void informOfRowCount​(NoPutResultSet resultSet,
                                     long rowCount)
                              throws StandardException
        Description copied from interface: Activation
        Tell this activation that the given ResultSet was found to have the given number of rows. This is used during execution to determine whether a table has grown or shrunk. If a table's size changes significantly, the activation may invalidate its PreparedStatement to force recompilation. Note that the association of row counts with ResultSets is kept in the activation class, not in the activation itself. This means that this method must be synchronized. This method is not required to check the number of rows on each call. Because of synchronization, this check is likely to be expensive, so it may only check every hundred calls or so.
        Specified by:
        informOfRowCount in interface Activation
        Throws:
        StandardException - Thrown on error
        See Also:
        Activation.informOfRowCount(org.apache.derby.iapi.sql.execute.NoPutResultSet, long)
      • popConstantAction

        public ConstantAction popConstantAction()
        Description copied from interface: Activation
        Pop the ConstantAction stack, returning the element which was just popped off the stack.
        Specified by:
        popConstantAction in interface Activation
      • getParentResultSet

        public java.util.Vector<TemporaryRowHolder> getParentResultSet​(java.lang.String resultSetId)
        Description copied from interface: Activation
        get the reference to parent table ResultSets, that will be needed by the referential action dependent table scans.
        Specified by:
        getParentResultSet in interface Activation
      • getParentResultSetKeys

        public java.util.Enumeration<java.lang.String> getParentResultSetKeys()
        Specified by:
        getParentResultSetKeys in interface Activation
      • setForUpdateIndexScan

        public void setForUpdateIndexScan​(CursorResultSet forUpdateResultSet)
        Description copied from interface: Activation
        beetle 3865: updateable cursor using index. A way of communication between cursor activation and update activation.
        Specified by:
        setForUpdateIndexScan in interface Activation
      • getDynamicResults

        public java.sql.ResultSet[][] getDynamicResults()
        Description copied from interface: Activation
        Return the set of dynamical created result sets, for procedures. Base implementation returns null, a generated class for a procedure overwrites this with a real implementation.
        Specified by:
        getDynamicResults in interface Activation
        Returns:
        null if no dynamic results exists. Otherwise an array of ResultSet arrays, each of length one containing null or a reference to a ResultSet.
      • getMaxDynamicResults

        public int getMaxDynamicResults()
        Description copied from interface: Activation
        Return the maximum number of dynamical created result sets from the procedure definition. Base implementation returns 0, a generated class for a procedure overwrites this with a real implementation.
        Specified by:
        getMaxDynamicResults in interface Activation
      • getCurrentValueAndAdvance

        public NumberDataValue getCurrentValueAndAdvance​(java.lang.String sequenceUUIDstring,
                                                         int typeFormatID)
                                                  throws StandardException
        Description copied from interface: Activation
        Called by generated code to get the next number in an ANSI/ISO sequence and advance the sequence. Raises an exception if the sequence was declared NO CYCLE and its range is exhausted.
        Specified by:
        getCurrentValueAndAdvance in interface Activation
        Parameters:
        sequenceUUIDstring - The string value of the sequence's UUID
        typeFormatID - The format id of the data type to be returned. E.g., StoredFormatIds.SQL_INTEGER_ID.
        Returns:
        The next number in the sequence
        Throws:
        StandardException