Search in sources :

Example 6 with GeneratedKeys

use of org.h2.engine.GeneratedKeys in project h2database by h2database.

the class CommandRemote method executeUpdate.

@Override
public ResultWithGeneratedKeys executeUpdate(Object generatedKeysRequest) {
    checkParameters();
    boolean supportsGeneratedKeys = session.isSupportsGeneratedKeys();
    boolean readGeneratedKeys = supportsGeneratedKeys && !Boolean.FALSE.equals(generatedKeysRequest);
    int objectId = readGeneratedKeys ? session.getNextId() : 0;
    synchronized (session) {
        int updateCount = 0;
        ResultRemote generatedKeys = null;
        boolean autoCommit = false;
        for (int i = 0, count = 0; i < transferList.size(); i++) {
            prepareIfRequired();
            Transfer transfer = transferList.get(i);
            try {
                session.traceOperation("COMMAND_EXECUTE_UPDATE", id);
                transfer.writeInt(SessionRemote.COMMAND_EXECUTE_UPDATE).writeInt(id);
                sendParameters(transfer);
                if (supportsGeneratedKeys) {
                    int mode = GeneratedKeysMode.valueOf(generatedKeysRequest);
                    transfer.writeInt(mode);
                    switch(mode) {
                        case GeneratedKeysMode.COLUMN_NUMBERS:
                            {
                                int[] keys = (int[]) generatedKeysRequest;
                                transfer.writeInt(keys.length);
                                for (int key : keys) {
                                    transfer.writeInt(key);
                                }
                                break;
                            }
                        case GeneratedKeysMode.COLUMN_NAMES:
                            {
                                String[] keys = (String[]) generatedKeysRequest;
                                transfer.writeInt(keys.length);
                                for (String key : keys) {
                                    transfer.writeString(key);
                                }
                                break;
                            }
                    }
                }
                session.done(transfer);
                updateCount = transfer.readInt();
                autoCommit = transfer.readBoolean();
                if (readGeneratedKeys) {
                    int columnCount = transfer.readInt();
                    if (generatedKeys != null) {
                        generatedKeys.close();
                        generatedKeys = null;
                    }
                    generatedKeys = new ResultRemote(session, transfer, objectId, columnCount, Integer.MAX_VALUE);
                }
            } catch (IOException e) {
                session.removeServer(e, i--, ++count);
            }
        }
        session.setAutoCommitFromServer(autoCommit);
        session.autoCommitIfCluster();
        session.readSessionState();
        if (generatedKeys != null) {
            return new ResultWithGeneratedKeys.WithKeys(updateCount, generatedKeys);
        }
        return ResultWithGeneratedKeys.of(updateCount);
    }
}
Also used : ResultRemote(org.h2.result.ResultRemote) Transfer(org.h2.value.Transfer) IOException(java.io.IOException)

Example 7 with GeneratedKeys

use of org.h2.engine.GeneratedKeys in project h2database by h2database.

the class JdbcPreparedStatement method execute.

/**
 * Executes an arbitrary statement. If another result set exists for this
 * statement, this will be closed (even if this statement fails). If auto
 * commit is on, and the statement is not a select, this statement will be
 * committed.
 *
 * @return true if a result set is available, false if not
 * @throws SQLException if this object is closed or invalid
 */
@Override
public boolean execute() throws SQLException {
    try {
        int id = getNextId(TraceObject.RESULT_SET);
        if (isDebugEnabled()) {
            debugCodeCall("execute");
        }
        checkClosedForWrite();
        try {
            boolean returnsResultSet;
            synchronized (conn.getSession()) {
                closeOldResultSet();
                boolean lazy = false;
                try {
                    setExecutingStatement(command);
                    if (command.isQuery()) {
                        returnsResultSet = true;
                        boolean scrollable = resultSetType != ResultSet.TYPE_FORWARD_ONLY;
                        boolean updatable = resultSetConcurrency == ResultSet.CONCUR_UPDATABLE;
                        ResultInterface result = command.executeQuery(maxRows, scrollable);
                        lazy = result.isLazy();
                        resultSet = new JdbcResultSet(conn, this, command, result, id, closedByResultSet, scrollable, updatable, cachedColumnLabelMap);
                    } else {
                        returnsResultSet = false;
                        ResultWithGeneratedKeys result = command.executeUpdate(generatedKeysRequest);
                        updateCount = result.getUpdateCount();
                        ResultInterface gk = result.getGeneratedKeys();
                        if (gk != null) {
                            generatedKeys = new JdbcResultSet(conn, this, command, gk, id, false, true, false);
                        }
                    }
                } finally {
                    if (!lazy) {
                        setExecutingStatement(null);
                    }
                }
            }
            return returnsResultSet;
        } finally {
            afterWriting();
        }
    } catch (Throwable e) {
        throw logAndConvert(e);
    }
}
Also used : ResultInterface(org.h2.result.ResultInterface) ResultWithGeneratedKeys(org.h2.result.ResultWithGeneratedKeys)

Example 8 with GeneratedKeys

use of org.h2.engine.GeneratedKeys in project h2database by h2database.

the class JdbcStatement method executeInternal.

private boolean executeInternal(String sql, Object generatedKeysRequest) throws SQLException {
    int id = getNextId(TraceObject.RESULT_SET);
    checkClosedForWrite();
    try {
        closeOldResultSet();
        sql = JdbcConnection.translateSQL(sql, escapeProcessing);
        CommandInterface command = conn.prepareCommand(sql, fetchSize);
        boolean lazy = false;
        boolean returnsResultSet;
        synchronized (session) {
            setExecutingStatement(command);
            try {
                if (command.isQuery()) {
                    returnsResultSet = true;
                    boolean scrollable = resultSetType != ResultSet.TYPE_FORWARD_ONLY;
                    boolean updatable = resultSetConcurrency == ResultSet.CONCUR_UPDATABLE;
                    ResultInterface result = command.executeQuery(maxRows, scrollable);
                    lazy = result.isLazy();
                    resultSet = new JdbcResultSet(conn, this, command, result, id, closedByResultSet, scrollable, updatable);
                } else {
                    returnsResultSet = false;
                    ResultWithGeneratedKeys result = command.executeUpdate(conn.scopeGeneratedKeys() ? false : generatedKeysRequest);
                    updateCount = result.getUpdateCount();
                    ResultInterface gk = result.getGeneratedKeys();
                    if (gk != null) {
                        generatedKeys = new JdbcResultSet(conn, this, command, gk, id, false, true, false);
                    }
                }
            } finally {
                if (!lazy) {
                    setExecutingStatement(null);
                }
            }
        }
        if (!lazy) {
            command.close();
        }
        return returnsResultSet;
    } finally {
        afterWriting();
    }
}
Also used : ResultInterface(org.h2.result.ResultInterface) CommandInterface(org.h2.command.CommandInterface) ResultWithGeneratedKeys(org.h2.result.ResultWithGeneratedKeys)

Aggregations

ResultInterface (org.h2.result.ResultInterface)6 ResultWithGeneratedKeys (org.h2.result.ResultWithGeneratedKeys)4 CommandInterface (org.h2.command.CommandInterface)2 GeneratedKeys (org.h2.engine.GeneratedKeys)2 Expression (org.h2.expression.Expression)2 SequenceValue (org.h2.expression.SequenceValue)2 DbException (org.h2.message.DbException)2 Row (org.h2.result.Row)2 Column (org.h2.table.Column)2 Value (org.h2.value.Value)2 IOException (java.io.IOException)1 PreparedStatement (java.sql.PreparedStatement)1 ResultSet (java.sql.ResultSet)1 Statement (java.sql.Statement)1 DbContents (org.h2.bnf.context.DbContents)1 ExpressionColumn (org.h2.expression.ExpressionColumn)1 ResultRemote (org.h2.result.ResultRemote)1 SimpleResultSet (org.h2.tools.SimpleResultSet)1 Profiler (org.h2.util.Profiler)1 Transfer (org.h2.value.Transfer)1