Search in sources :

Example 1 with StatementContext

use of org.apache.derby.iapi.sql.conn.StatementContext in project derby by apache.

the class EmbedResultSet method updateRow.

/**
 * JDBC 2.0
 *
 * Update the underlying database with the new contents of the
 * current row.  Cannot be called when on the insert row.
 *
 * @exception SQLException if a database-access error occurs, or
 * if called when on the insert row
 */
public void updateRow() throws SQLException {
    synchronized (getConnectionSynchronization()) {
        checksBeforeUpdateOrDelete("updateRow", -1);
        // Check that the cursor is not positioned on insertRow
        checkNotOnInsertRow();
        setupContextStack();
        LanguageConnectionContext lcc = getLanguageConnectionContext(getEmbedConnection());
        StatementContext statementContext = null;
        try {
            if (// nothing got updated on this row
            currentRowHasBeenUpdated == false)
                // nothing to do since no updates were made to this row
                return;
            // now construct the update where current of sql
            boolean foundOneColumnAlready = false;
            StringBuffer updateWhereCurrentOfSQL = new StringBuffer("UPDATE ");
            CursorActivation activation = lcc.lookupCursorActivation(getCursorName());
            ExecCursorTableReference targetTable = activation.getPreparedStatement().getTargetTable();
            // got the underlying (schema.)table name
            updateWhereCurrentOfSQL.append(getFullBaseTableName(targetTable));
            updateWhereCurrentOfSQL.append(" SET ");
            ResultDescription rd = theResults.getResultDescription();
            for (int i = 1; i <= rd.getColumnCount(); i++) {
                // in this for loop we are constructing columnname=?,... part of the update sql
                if (columnGotUpdated[i - 1]) {
                    // if the column got updated, do following
                    if (foundOneColumnAlready)
                        updateWhereCurrentOfSQL.append(",");
                    // using quotes around the column name to preserve case sensitivity
                    updateWhereCurrentOfSQL.append(IdUtil.normalToDelimited(rd.getColumnDescriptor(i).getName()) + "=?");
                    foundOneColumnAlready = true;
                }
            }
            // using quotes around the cursor name to preserve case sensitivity
            updateWhereCurrentOfSQL.append(" WHERE CURRENT OF " + IdUtil.normalToDelimited(getCursorName()));
            StatementContext currSC = lcc.getStatementContext();
            Activation parentAct = null;
            if (currSC != null) {
                parentAct = currSC.getActivation();
            }
            // Context used for preparing, don't set any timeout (use 0)
            statementContext = lcc.pushStatementContext(isAtomic, false, updateWhereCurrentOfSQL.toString(), null, false, 0L);
            // A priori, the new statement context inherits the activation of
            // the existing statementContext, so that that activation ends up
            // as parent of the new activation 'act' created below, which will
            // be the activation of the pushed statement context.
            statementContext.setActivation(parentAct);
            org.apache.derby.iapi.sql.PreparedStatement ps = lcc.prepareInternalStatement(updateWhereCurrentOfSQL.toString());
            Activation act = ps.getActivation(lcc, false);
            statementContext.setActivation(act);
            // in this for loop we are assigning values for parameters in sql constructed earlier with columnname=?,...
            for (int i = 1, paramPosition = 0; i <= rd.getColumnCount(); i++) {
                if (// if the column got updated, do following
                columnGotUpdated[i - 1])
                    act.getParameterValueSet().getParameterForSet(paramPosition++).setValue(updateRow.getColumn(i));
            }
            // Don't set any timeout when updating rows (use 0)
            // Execute the update where current of sql.
            org.apache.derby.iapi.sql.ResultSet rs = ps.executeSubStatement(activation, act, true, 0L);
            SQLWarning w = act.getWarnings();
            if (w != null) {
                addWarning(w);
            }
            act.close();
            // For forward only resultsets, after a update, the ResultSet will be positioned right before the next row.
            if (getType() == TYPE_FORWARD_ONLY) {
                currentRow = null;
            } else {
                movePosition(RELATIVE, 0, "relative");
            }
            lcc.popStatementContext(statementContext, null);
            InterruptStatus.restoreIntrFlagIfSeen(lcc);
        } catch (Throwable t) {
            throw closeOnTransactionError(t);
        } finally {
            if (statementContext != null)
                lcc.popStatementContext(statementContext, null);
            restoreContextStack();
            initializeUpdateRowModifiers();
        }
    }
}
Also used : SQLWarning(java.sql.SQLWarning) CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) Activation(org.apache.derby.iapi.sql.Activation) CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) StatementContext(org.apache.derby.iapi.sql.conn.StatementContext) ExecCursorTableReference(org.apache.derby.iapi.sql.execute.ExecCursorTableReference) LanguageConnectionContext(org.apache.derby.iapi.sql.conn.LanguageConnectionContext) ResultDescription(org.apache.derby.iapi.sql.ResultDescription) ResultSet(org.apache.derby.iapi.sql.ResultSet)

Example 2 with StatementContext

use of org.apache.derby.iapi.sql.conn.StatementContext in project derby by apache.

the class EmbedResultSet method insertRow.

/**
 * JDBC 2.0
 *
 * Insert the contents of the insert row into the result set and the
 * database. Must be on the insert row when this method is called.
 *
 * @exception SQLException
 *                if a database-access error occurs, if called when not on
 *                the insert row, or if all non-nullable columns in the
 *                insert row have not been given a value
 */
public void insertRow() throws SQLException {
    synchronized (getConnectionSynchronization()) {
        checksBeforeInsert();
        setupContextStack();
        LanguageConnectionContext lcc = getLanguageConnectionContext(getEmbedConnection());
        StatementContext statementContext = null;
        try {
            /*
                 * construct the insert statement
                 *
                 * If no values have been supplied for a column, it will be set 
                 * to the column's default value, if any. 
                 * If no default value had been defined, the default value of a 
                 * nullable column is set to NULL.
                 */
            boolean foundOneColumnAlready = false;
            StringBuffer insertSQL = new StringBuffer("INSERT INTO ");
            StringBuffer valuesSQL = new StringBuffer("VALUES (");
            CursorActivation activation = lcc.lookupCursorActivation(getCursorName());
            ExecCursorTableReference targetTable = activation.getPreparedStatement().getTargetTable();
            // got the underlying (schema.)table name
            insertSQL.append(getFullBaseTableName(targetTable));
            ResultDescription rd = theResults.getResultDescription();
            insertSQL.append(" (");
            // and values (?) ,... part of the insert sql
            for (int i = 1; i <= rd.getColumnCount(); i++) {
                if (foundOneColumnAlready) {
                    insertSQL.append(",");
                    valuesSQL.append(",");
                }
                // using quotes around the column name
                // to preserve case sensitivity
                insertSQL.append(IdUtil.normalToDelimited(rd.getColumnDescriptor(i).getName()));
                if (columnGotUpdated[i - 1]) {
                    valuesSQL.append("?");
                } else {
                    valuesSQL.append("DEFAULT");
                }
                foundOneColumnAlready = true;
            }
            insertSQL.append(") ");
            valuesSQL.append(") ");
            insertSQL.append(valuesSQL);
            StatementContext currSC = lcc.getStatementContext();
            Activation parentAct = null;
            if (currSC != null) {
                parentAct = currSC.getActivation();
            }
            // Context used for preparing, don't set any timeout (use 0)
            statementContext = lcc.pushStatementContext(isAtomic, false, insertSQL.toString(), null, false, 0L);
            // A priori, the new statement context inherits the activation
            // of the existing statementContext, so that that activation
            // ends up as parent of the new activation 'act' created below,
            // which will be the activation of the pushed statement
            // context.
            statementContext.setActivation(parentAct);
            org.apache.derby.iapi.sql.PreparedStatement ps = lcc.prepareInternalStatement(insertSQL.toString());
            Activation act = ps.getActivation(lcc, false);
            statementContext.setActivation(act);
            // in sql constructed earlier VALUES (?, ..)
            for (int i = 1, paramPosition = 0; i <= rd.getColumnCount(); i++) {
                // if the column got updated, do following
                if (columnGotUpdated[i - 1]) {
                    act.getParameterValueSet().getParameterForSet(paramPosition++).setValue(updateRow.getColumn(i));
                }
            }
            // Don't see any timeout when inserting rows (use 0)
            // execute the insert
            org.apache.derby.iapi.sql.ResultSet rs = ps.executeSubStatement(activation, act, true, 0L);
            act.close();
            lcc.popStatementContext(statementContext, null);
            InterruptStatus.restoreIntrFlagIfSeen(lcc);
        } catch (Throwable t) {
            throw closeOnTransactionError(t);
        } finally {
            if (statementContext != null)
                lcc.popStatementContext(statementContext, null);
            restoreContextStack();
        }
    }
}
Also used : CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) Activation(org.apache.derby.iapi.sql.Activation) CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) StatementContext(org.apache.derby.iapi.sql.conn.StatementContext) ExecCursorTableReference(org.apache.derby.iapi.sql.execute.ExecCursorTableReference) LanguageConnectionContext(org.apache.derby.iapi.sql.conn.LanguageConnectionContext) ResultDescription(org.apache.derby.iapi.sql.ResultDescription) ResultSet(org.apache.derby.iapi.sql.ResultSet)

Example 3 with StatementContext

use of org.apache.derby.iapi.sql.conn.StatementContext in project derby by apache.

the class EmbedResultSet method checkRowPosition.

private boolean checkRowPosition(int position, String positionText) throws SQLException {
    // beforeFirst is only allowed on scroll cursors
    checkScrollCursor(positionText);
    synchronized (getConnectionSynchronization()) {
        setupContextStack();
        LanguageConnectionContext lcc = getLanguageConnectionContext(getEmbedConnection());
        try {
            try {
                /*
					 * Push and pop a StatementContext around a next call so
					 * that the ResultSet will get correctly closed down on an
					 * error. (Cache the LanguageConnectionContext)
					 */
                // No timeout for this operation (use 0)
                StatementContext statementContext = lcc.pushStatementContext(isAtomic, concurrencyOfThisResultSet == java.sql.ResultSet.CONCUR_READ_ONLY, getSQLText(), getParameterValueSet(), false, 0L);
                boolean result = theResults.checkRowPosition(position);
                lcc.popStatementContext(statementContext, null);
                InterruptStatus.restoreIntrFlagIfSeen(lcc);
                return result;
            } catch (Throwable t) {
                /*
					 * Need to close the result set here because the error might
					 * cause us to lose the current connection if this is an XA
					 * connection and we won't be able to do the close later
					 */
                throw closeOnTransactionError(t);
            }
        } finally {
            restoreContextStack();
        }
    }
}
Also used : LanguageConnectionContext(org.apache.derby.iapi.sql.conn.LanguageConnectionContext) StatementContext(org.apache.derby.iapi.sql.conn.StatementContext)

Example 4 with StatementContext

use of org.apache.derby.iapi.sql.conn.StatementContext in project derby by apache.

the class EmbedResultSet method deleteRow.

/**
 * JDBC 2.0
 *
 * Delete the current row from the result set and the underlying
 * database.  Cannot be called when on the insert row.
 *
 * @exception SQLException if a database-access error occurs, or if
 * called when on the insert row.
 */
public void deleteRow() throws SQLException {
    synchronized (getConnectionSynchronization()) {
        checksBeforeUpdateOrDelete("deleteRow", -1);
        // Check that the cursor is not positioned on insertRow
        checkNotOnInsertRow();
        setupContextStack();
        LanguageConnectionContext lcc = getLanguageConnectionContext(getEmbedConnection());
        StatementContext statementContext = null;
        // now construct the delete where current of sql
        try {
            StringBuffer deleteWhereCurrentOfSQL = new StringBuffer("DELETE FROM ");
            CursorActivation activation = lcc.lookupCursorActivation(getCursorName());
            // get the underlying (schema.)table name
            deleteWhereCurrentOfSQL.append(getFullBaseTableName(activation.getPreparedStatement().getTargetTable()));
            // using quotes around the cursor name to preserve case sensitivity
            deleteWhereCurrentOfSQL.append(" WHERE CURRENT OF " + IdUtil.normalToDelimited(getCursorName()));
            StatementContext currSC = lcc.getStatementContext();
            Activation parentAct = null;
            if (currSC != null) {
                parentAct = currSC.getActivation();
            }
            // Context used for preparing, don't set any timeout (use 0)
            statementContext = lcc.pushStatementContext(isAtomic, false, deleteWhereCurrentOfSQL.toString(), null, false, 0L);
            // A priori, the new statement context inherits the activation
            // of the existing statementContext, so that that activation
            // ends up as parent of the new activation 'act' created below,
            // which will be the activation of the pushed statement
            // context.
            statementContext.setActivation(parentAct);
            org.apache.derby.iapi.sql.PreparedStatement ps = lcc.prepareInternalStatement(deleteWhereCurrentOfSQL.toString());
            // Get activation, so that we can get the warning from it
            Activation act = ps.getActivation(lcc, false);
            statementContext.setActivation(act);
            // Don't set any timeout when deleting rows (use 0)
            // execute delete where current of sql
            org.apache.derby.iapi.sql.ResultSet rs = ps.executeSubStatement(activation, act, true, 0L);
            SQLWarning w = act.getWarnings();
            if (w != null) {
                addWarning(w);
            }
            act.close();
            // After a delete, the ResultSet will be positioned right before
            // the next row.
            currentRow = null;
            lcc.popStatementContext(statementContext, null);
            InterruptStatus.restoreIntrFlagIfSeen(lcc);
        } catch (Throwable t) {
            throw closeOnTransactionError(t);
        } finally {
            if (statementContext != null)
                lcc.popStatementContext(statementContext, null);
            restoreContextStack();
            initializeUpdateRowModifiers();
        }
    }
}
Also used : SQLWarning(java.sql.SQLWarning) CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) LanguageConnectionContext(org.apache.derby.iapi.sql.conn.LanguageConnectionContext) Activation(org.apache.derby.iapi.sql.Activation) CursorActivation(org.apache.derby.iapi.sql.execute.CursorActivation) ResultSet(org.apache.derby.iapi.sql.ResultSet) StatementContext(org.apache.derby.iapi.sql.conn.StatementContext)

Example 5 with StatementContext

use of org.apache.derby.iapi.sql.conn.StatementContext in project derby by apache.

the class EmbedResultSet method movePosition.

protected boolean movePosition(int position, int row, String positionText) throws SQLException {
    // closing currentStream does not depend on the
    closeCurrentStream();
    // underlying connection.  Do this outside of
    // the connection synchronization.
    // checking result set closure does not depend
    checkExecIfClosed(positionText);
    if (isOnInsertRow) {
        moveToCurrentRow();
    }
    synchronized (getConnectionSynchronization()) {
        setupContextStack();
        try {
            LanguageConnectionContext lcc = getLanguageConnectionContext(getEmbedConnection());
            final ExecRow newRow;
            try {
                /* Push and pop a StatementContext around a next call
				 * so that the ResultSet will get correctly closed down
				 * on an error.
				 * (Cache the LanguageConnectionContext)
				 */
                StatementContext statementContext = lcc.pushStatementContext(isAtomic, concurrencyOfThisResultSet == java.sql.ResultSet.CONCUR_READ_ONLY, getSQLText(), getParameterValueSet(), false, timeoutMillis);
                switch(position) {
                    case BEFOREFIRST:
                        newRow = theResults.setBeforeFirstRow();
                        break;
                    case FIRST:
                        newRow = theResults.getFirstRow();
                        break;
                    case NEXT:
                        newRow = theResults.getNextRow();
                        break;
                    case LAST:
                        newRow = theResults.getLastRow();
                        break;
                    case AFTERLAST:
                        newRow = theResults.setAfterLastRow();
                        break;
                    case PREVIOUS:
                        newRow = theResults.getPreviousRow();
                        break;
                    case ABSOLUTE:
                        newRow = theResults.getAbsoluteRow(row);
                        break;
                    case RELATIVE:
                        newRow = theResults.getRelativeRow(row);
                        break;
                    default:
                        newRow = null;
                        if (SanityManager.DEBUG) {
                            SanityManager.THROWASSERT("Unexpected value for position - " + position);
                        }
                }
                lcc.popStatementContext(statementContext, null);
                InterruptStatus.restoreIntrFlagIfSeen(lcc);
            } catch (Throwable t) {
                /*
				 * Need to close the result set here because the error might
				 * cause us to lose the current connection if this is an XA
				 * connection and we won't be able to do the close later
				 */
                throw closeOnTransactionError(t);
            }
            SQLWarning w = theResults.getWarnings();
            if (w != null) {
                addWarning(w);
            }
            boolean onRow = (currentRow = newRow) != null;
            // false. This will cause a commit if autocommit = true.
            if (!onRow && (position == NEXT)) {
                // LanguageConnectionContext lcc = getEmbedConnection().getLanguageConnection();
                if (forMetaData && (lcc.getActivationCount() > 1)) {
                // we do not want to commit here as there seems to be other
                // statements/resultSets currently opened for this connection.
                } else if (owningStmt != null && owningStmt.getResultSetType() == TYPE_FORWARD_ONLY) {
                    // allow the satement to commit if required.
                    owningStmt.resultSetClosing(this);
                }
            }
            // Clear the indication of which columns were fetched as streams.
            if (columnUsedFlags != null)
                Arrays.fill(columnUsedFlags, false);
            if (columnGotUpdated != null && currentRowHasBeenUpdated) {
                initializeUpdateRowModifiers();
            }
            return onRow;
        } finally {
            restoreContextStack();
        }
    }
}
Also used : SQLWarning(java.sql.SQLWarning) LanguageConnectionContext(org.apache.derby.iapi.sql.conn.LanguageConnectionContext) ExecRow(org.apache.derby.iapi.sql.execute.ExecRow) StatementContext(org.apache.derby.iapi.sql.conn.StatementContext)

Aggregations

StatementContext (org.apache.derby.iapi.sql.conn.StatementContext)26 LanguageConnectionContext (org.apache.derby.iapi.sql.conn.LanguageConnectionContext)9 Activation (org.apache.derby.iapi.sql.Activation)5 ExecRow (org.apache.derby.iapi.sql.execute.ExecRow)5 ResultSet (org.apache.derby.iapi.sql.ResultSet)4 DataValueDescriptor (org.apache.derby.iapi.types.DataValueDescriptor)4 SQLWarning (java.sql.SQLWarning)3 CompilerContext (org.apache.derby.iapi.sql.compile.CompilerContext)3 SQLSessionContext (org.apache.derby.iapi.sql.conn.SQLSessionContext)3 CursorActivation (org.apache.derby.iapi.sql.execute.CursorActivation)3 TransactionController (org.apache.derby.iapi.store.access.TransactionController)3 XATransactionController (org.apache.derby.iapi.store.access.XATransactionController)3 StandardException (org.apache.derby.shared.common.error.StandardException)3 DataTruncation (java.sql.DataTruncation)2 GeneratedClass (org.apache.derby.iapi.services.loader.GeneratedClass)2 ResultDescription (org.apache.derby.iapi.sql.ResultDescription)2 ExecCursorTableReference (org.apache.derby.iapi.sql.execute.ExecCursorTableReference)2 Timestamp (java.sql.Timestamp)1 List (java.util.List)1 UUID (org.apache.derby.catalog.UUID)1