All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.foundationdb.sql.jdbc.jdbc3.AbstractJdbc3Connection Maven / Gradle / Ivy

/*-------------------------------------------------------------------------
*
* Copyright (c) 2004-2011, PostgreSQL Global Development Group
*
*
*-------------------------------------------------------------------------
*/
package com.foundationdb.sql.jdbc.jdbc3;

import java.util.Properties;
import java.sql.*;

import com.foundationdb.sql.jdbc.util.GT;
import com.foundationdb.sql.jdbc.util.HostSpec;
import com.foundationdb.sql.jdbc.util.PSQLException;
import com.foundationdb.sql.jdbc.util.PSQLState;

/**
 * This class defines methods of the jdbc3 specification.  This class extends
 * org.postgresql.jdbc2.AbstractJdbc2Connection which provides the jdbc2
 * methods.  The real Connection class (for jdbc3) is org.postgresql.jdbc3.Jdbc3Connection
 */
public abstract class AbstractJdbc3Connection extends com.foundationdb.sql.jdbc.jdbc2.AbstractJdbc2Connection
{
    private int rsHoldability = ResultSet.CLOSE_CURSORS_AT_COMMIT;
    private int savepointId = 0;

    protected AbstractJdbc3Connection(HostSpec[] hostSpec, String user, String database, Properties info, String url) throws SQLException {
        super(hostSpec, user, database, info, url);
    }

    /**
     * Changes the holdability of ResultSet objects
     * created using this Connection object to the given
     * holdability.
     *
     * @param holdability a ResultSet holdability constant; one of
     *    ResultSet.HOLD_CURSORS_OVER_COMMIT or
     *    ResultSet.CLOSE_CURSORS_AT_COMMIT
     * @throws SQLException if a database access occurs, the given parameter
     *     is not a ResultSet constant indicating holdability,
     *     or the given holdability is not supported
     * @see #getHoldability
     * @see ResultSet
     * @since 1.4
     */
    public void setHoldability(int holdability) throws SQLException
    {
        checkClosed();

        switch (holdability)
        {
        case ResultSet.CLOSE_CURSORS_AT_COMMIT:
            rsHoldability = holdability;
            break;
        case ResultSet.HOLD_CURSORS_OVER_COMMIT:
            rsHoldability = holdability;
            break;
        default:
            throw new PSQLException(GT.tr("Unknown ResultSet holdability setting: {0}.", new Integer(holdability)),
                                    PSQLState.INVALID_PARAMETER_VALUE);
        }
    }

    /**
     * Retrieves the current holdability of ResultSet objects
     * created using this Connection object.
     *
     * @return the holdability, one of
     *    ResultSet.HOLD_CURSORS_OVER_COMMIT or
     *    ResultSet.CLOSE_CURSORS_AT_COMMIT
     * @throws SQLException if a database access occurs
     * @see #setHoldability
     * @see ResultSet
     * @since 1.4
     */
    public int getHoldability() throws SQLException
    {
        checkClosed();
        return rsHoldability;
    }

    /**
     * Creates an unnamed savepoint in the current transaction and
     * returns the new Savepoint object that represents it.
     *
     * @return the new Savepoint object
     * @exception SQLException if a database access error occurs
     *     or this Connection object is currently in
     *     auto-commit mode
     * @see Savepoint
     * @since 1.4
     */
    public Savepoint setSavepoint() throws SQLException
    {
        checkClosed();
        if (!haveMinimumServerVersion("8.0"))
            throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."), PSQLState.NOT_IMPLEMENTED);
        if (getAutoCommit())
            throw new PSQLException(GT.tr("Cannot establish a savepoint in auto-commit mode."),
                                    PSQLState.NO_ACTIVE_SQL_TRANSACTION);

        PSQLSavepoint savepoint = new PSQLSavepoint(savepointId++);

        // Note we can't use execSQLUpdate because we don't want
        // to suppress BEGIN.
        Statement stmt = createStatement();
        stmt.executeUpdate("SAVEPOINT " + savepoint.getPGName());
        stmt.close();

        return savepoint;
    }

    /**
     * Creates a savepoint with the given name in the current transaction
     * and returns the new Savepoint object that represents it.
     *
     * @param name a String containing the name of the savepoint
     * @return the new Savepoint object
     * @exception SQLException if a database access error occurs
     *     or this Connection object is currently in
     *     auto-commit mode
     * @see Savepoint
     * @since 1.4
     */
    public Savepoint setSavepoint(String name) throws SQLException
    {
        checkClosed();
        if (!haveMinimumServerVersion("8.0"))
            throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."), PSQLState.NOT_IMPLEMENTED);
        if (getAutoCommit())
            throw new PSQLException(GT.tr("Cannot establish a savepoint in auto-commit mode."),
                                    PSQLState.NO_ACTIVE_SQL_TRANSACTION);

        PSQLSavepoint savepoint = new PSQLSavepoint(name);

        // Note we can't use execSQLUpdate because we don't want
        // to suppress BEGIN.
        Statement stmt = createStatement();
        stmt.executeUpdate("SAVEPOINT " + savepoint.getPGName());
        stmt.close();

        return savepoint;
    }

    /**
     * Undoes all changes made after the given Savepoint object
     * was set.
     * 

* This method should be used only when auto-commit has been disabled. * * @param savepoint the Savepoint object to roll back to * @exception SQLException if a database access error occurs, * the Savepoint object is no longer valid, * or this Connection object is currently in * auto-commit mode * @see Savepoint * @see #rollback * @since 1.4 */ public void rollback(Savepoint savepoint) throws SQLException { checkClosed(); if (!haveMinimumServerVersion("8.0")) throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."), PSQLState.NOT_IMPLEMENTED); PSQLSavepoint pgSavepoint = (PSQLSavepoint)savepoint; execSQLUpdate("ROLLBACK TO SAVEPOINT " + pgSavepoint.getPGName()); } /** * Removes the given Savepoint object from the current * transaction. Any reference to the savepoint after it have been removed * will cause an SQLException to be thrown. * * @param savepoint the Savepoint object to be removed * @exception SQLException if a database access error occurs or * the given Savepoint object is not a valid * savepoint in the current transaction * @since 1.4 */ public void releaseSavepoint(Savepoint savepoint) throws SQLException { checkClosed(); if (!haveMinimumServerVersion("8.0")) throw new PSQLException(GT.tr("Server versions prior to 8.0 do not support savepoints."), PSQLState.NOT_IMPLEMENTED); PSQLSavepoint pgSavepoint = (PSQLSavepoint)savepoint; execSQLUpdate("RELEASE SAVEPOINT " + pgSavepoint.getPGName()); pgSavepoint.invalidate(); } /** * Creates a Statement object that will generate * ResultSet objects with the given type, concurrency, * and holdability. * This method is the same as the createStatement method * above, but it allows the default result set * type, concurrency, and holdability to be overridden. * * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new Statement object that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @see ResultSet * @since 1.4 */ public abstract Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException; public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); return createStatement(resultSetType, resultSetConcurrency, getHoldability()); } /** * Creates a PreparedStatement object that will generate * ResultSet objects with the given type, concurrency, * and holdability. *

* This method is the same as the prepareStatement method * above, but it allows the default result set * type, concurrency, and holdability to be overridden. * * @param sql a String object that is the SQL statement to * be sent to the database; may contain one or more ? IN * parameters * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new PreparedStatement object, containing the * pre-compiled SQL statement, that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @see ResultSet * @since 1.4 */ public abstract PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException; public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); return prepareStatement(sql, resultSetType, resultSetConcurrency, getHoldability()); } /** * Creates a CallableStatement object that will generate * ResultSet objects with the given type and concurrency. * This method is the same as the prepareCall method * above, but it allows the default result set * type, result set concurrency type and holdability to be overridden. * * @param sql a String object that is the SQL statement to * be sent to the database; may contain on or more ? parameters * @param resultSetType one of the following ResultSet * constants: * ResultSet.TYPE_FORWARD_ONLY, * ResultSet.TYPE_SCROLL_INSENSITIVE, or * ResultSet.TYPE_SCROLL_SENSITIVE * @param resultSetConcurrency one of the following ResultSet * constants: * ResultSet.CONCUR_READ_ONLY or * ResultSet.CONCUR_UPDATABLE * @param resultSetHoldability one of the following ResultSet * constants: * ResultSet.HOLD_CURSORS_OVER_COMMIT or * ResultSet.CLOSE_CURSORS_AT_COMMIT * @return a new CallableStatement object, containing the * pre-compiled SQL statement, that will generate * ResultSet objects with the given type, * concurrency, and holdability * @exception SQLException if a database access error occurs * or the given parameters are not ResultSet * constants indicating type, concurrency, and holdability * @see ResultSet * @since 1.4 */ public abstract CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException; public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { checkClosed(); return prepareCall(sql, resultSetType, resultSetConcurrency, getHoldability()); } /** * Creates a default PreparedStatement object that has * the capability to retrieve auto-generated keys. The given constant * tells the driver whether it should make auto-generated keys * available for retrieval. This parameter is ignored if the SQL * statement is not an INSERT statement. *

* Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param autoGeneratedKeys a flag indicating whether auto-generated keys * should be returned; one of the following Statement * constants: * Statement.RETURN_GENERATED_KEYS or * Statement.NO_GENERATED_KEYS. * @return a new PreparedStatement object, containing the * pre-compiled SQL statement, that will have the capability of * returning auto-generated keys * @exception SQLException if a database access error occurs * or the given parameter is not a Statement * constant indicating whether auto-generated keys should be * returned * @since 1.4 */ public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkClosed(); if (autoGeneratedKeys != Statement.NO_GENERATED_KEYS) sql = AbstractJdbc3Statement.addReturning(this, sql, new String[]{"*"}, false); PreparedStatement ps = prepareStatement(sql); if (autoGeneratedKeys != Statement.NO_GENERATED_KEYS) ((AbstractJdbc3Statement)ps).wantsGeneratedKeysAlways = true; return ps; } /** * Creates a default PreparedStatement object capable * of returning the auto-generated keys designated by the given array. * This array contains the indexes of the columns in the target * table that contain the auto-generated keys that should be made * available. This array is ignored if the SQL * statement is not an INSERT statement. *

* An SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. *

* Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param columnIndexes an array of column indexes indicating the columns * that should be returned from the inserted row or rows * @return a new PreparedStatement object, containing the * pre-compiled statement, that is capable of returning the * auto-generated keys designated by the given array of column * indexes * @exception SQLException if a database access error occurs * * @since 1.4 */ public PreparedStatement prepareStatement(String sql, int columnIndexes[]) throws SQLException { if (columnIndexes == null || columnIndexes.length == 0) return prepareStatement(sql); checkClosed(); throw new PSQLException(GT.tr("Returning autogenerated keys is not supported."), PSQLState.NOT_IMPLEMENTED); } /** * Creates a default PreparedStatement object capable * of returning the auto-generated keys designated by the given array. * This array contains the names of the columns in the target * table that contain the auto-generated keys that should be returned. * This array is ignored if the SQL * statement is not an INSERT statement. *

* An SQL statement with or without IN parameters can be * pre-compiled and stored in a PreparedStatement object. This * object can then be used to efficiently execute this statement * multiple times. *

* Note: This method is optimized for handling * parametric SQL statements that benefit from precompilation. If * the driver supports precompilation, * the method prepareStatement will send * the statement to the database for precompilation. Some drivers * may not support precompilation. In this case, the statement may * not be sent to the database until the PreparedStatement * object is executed. This has no direct effect on users; however, it does * affect which methods throw certain SQLExceptions. *

* Result sets created using the returned PreparedStatement * object will by default be type TYPE_FORWARD_ONLY * and have a concurrency level of CONCUR_READ_ONLY. * * @param sql an SQL statement that may contain one or more '?' IN * parameter placeholders * @param columnNames an array of column names indicating the columns * that should be returned from the inserted row or rows * @return a new PreparedStatement object, containing the * pre-compiled statement, that is capable of returning the * auto-generated keys designated by the given array of column * names * @exception SQLException if a database access error occurs * * @since 1.4 */ public PreparedStatement prepareStatement(String sql, String columnNames[]) throws SQLException { if (columnNames != null && columnNames.length != 0) sql = AbstractJdbc3Statement.addReturning(this, sql, columnNames, true); PreparedStatement ps = prepareStatement(sql); if (columnNames != null && columnNames.length != 0) ((AbstractJdbc3Statement)ps).wantsGeneratedKeysAlways = true; return ps; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy