/* Connection.java -- Manage a database connection.
   Copyright (C) 1999, 2000 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
 
GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.sql;

import java.util.Map;

/**
  * This interface provides methods for managing a connection to a database.
  *
  * @author Aaron M. Renn (arenn@urbanophile.com)
  */
public interface Connection
{

/**
  * This transaction isolation level indicates that transactions are not
  * supported.
  */
public static final int TRANSACTION_NONE = 0;

/**
  * This transaction isolation level indicates that one transaction can
  * read modifications by other transactions before the other transactions
  * have committed their changes.  This could result in invalid reads.
  */
public static final int TRANSACTION_READ_UNCOMMITTED = 1;

/**
  * This transaction isolation leve indicates that only committed data from
  * other transactions will be read.  If a transaction reads a row, then
  * another transaction commits a change to that row, the first transaction
  * would retrieve the changed row on subsequent reads of the same row.
  */
public static final int TRANSACTION_READ_COMMITTED = 2;

/**
  * This transaction isolation level indicates that only committed data from
  * other transactions will be read.  It also ensures that data read from
  * a row will not be different on a subsequent read even if another
  * transaction commits a change.
  */
public static final int TRANSACTION_REPEATABLE_READ = 4;

/**
  * This transaction isolation level indicates that only committed data from
  * other transactions will be read.  It also ensures that data read from
  * a row will not be different on a subsequent read even if another
  * transaction commits a change.  Additionally, rows modified by other
  * transactions will not affect the result set returned during subsequent
  * executions of the same WHERE clause in this transaction.
  */
public static final int TRANSACTION_SERIALIZABLE = 8;

/*************************************************************************/

/**
  * This method creates a new SQL statement.  The default result set type
  * and concurrency will be used.
  *
  * @return A new <code>Statement</code> object. 
  *
  * @exception SQLException If an error occurs.
  *
  * @see Statement
  */
public abstract Statement
createStatement() throws SQLException;

/*************************************************************************/

/**
  * This method creates a new SQL statement with the specified type and
  * concurrency.  Valid values for these parameters are specified in the
  * <code>ResultSet</code> class.
  *
  * @param resultSetType The type of result set to use for this statement.
  * @param resultSetConcurrency.  The type of concurrency to be used in
  * the result set for this statement.
  *
  * @return A new <code>Statement</code> object.
  *
  * @exception SQLException If an error occurs.
  *
  * @see Statement
  * @see ResultSet
  */
public abstract Statement
createStatement(int resultSetType, int resultSetConcurrency) 
                throws SQLException;

/*************************************************************************/

/**
  * This method creates a new <code>PreparedStatement</code> for the specified
  * SQL string.  This method is designed for use with parameterized
  * statements.  The default result set type and concurrency will be used.
  *
  * @param The SQL statement to use in creating this 
  * <code>PreparedStatement</code>.
  *
  * @return A new <code>PreparedStatement</code>.
  *
  * @exception SQLException If an error occurs.
  *
  * @see PreparedStatement
  */
public abstract PreparedStatement
prepareStatement(String sql) throws SQLException;

/*************************************************************************/

/**
  * This method creates a new <code>PreparedStatement</code> for the specified
  * SQL string.  This method is designed for use with parameterized
  * statements.  The specified result set type and concurrency will be used.
  * Valid values for these parameters are specified in the
  * <code>ResultSet</code> class.
  *
  * @param The SQL statement to use in creating this 
  * <code>PreparedStatement</code>.
  * @param resultSetType The type of result set to use for this statement.
  * @param resultSetConcurrency.  The type of concurrency to be used in
  * the result set for this statement.
  *
  * @return A new <code>PreparedStatement</code>.
  *
  * @exception SQLException If an error occurs.
  *
  * @see PreparedStatement
  * @see ResultSet
  */
public abstract PreparedStatement
prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 
                 throws SQLException;

/*************************************************************************/

/**
  * This method creates a new <code>CallableStatement</code> for the 
  * specified SQL string.  Thie method is designed to be used with
  * stored procedures.  The default result set type and concurrency
  * will be used.
  *
  * @param The SQL statement to use in creating this 
  * <code>CallableStatement</code>.
  *
  * @return A new <code>CallableStatement</code>.
  *
  * @exception SQLException If an error occurs.
  *
  * @see CallableStatement
  */
public abstract CallableStatement
prepareCall(String sql) throws SQLException;

/*************************************************************************/

/**
  * This method creates a new <code>CallableStatement</code> for the 
  * specified SQL string.  Thie method is designed to be used with
  * stored procedures.  The specified result set type and concurrency
  * will be used.  Valid values for these parameters are specified in the
  * <code>ResultSet</code> class.
  *
  * @param The SQL statement to use in creating this 
  * <code>PreparedStatement</code>.
  * @param resultSetType The type of result set to use for this statement.
  * @param resultSetConcurrency.  The type of concurrency to be used in
  * the result set for this statement.
  *
  * @return A new <code>CallableStatement</code>.
  *
  * @exception SQLException If an error occurs.
  *
  * @see CallableStatement
  * @see ResultSet
  */
public abstract CallableStatement
prepareCall(String sql, int resultSetType, int resultSetConcurrency) 
            throws SQLException;

/*************************************************************************/

/**
  * This method converts the specified generic SQL statement into the
  * native grammer of the database this object is connected to.
  *
  * @param The JDBC generic SQL statement.
  *
  * @return The native SQL statement.
  *
  * @exception SQLException If an error occurs.
  */
public abstract String
nativeSQL(String sql) throws SQLException;

/*************************************************************************/

/**
  * This method tests whether or not auto commit mode is currently enabled.
  * In auto commit mode,  every SQL statement is committed its own transaction.
  * Otherwise a transaction must be explicitly committed or rolled back.
  *
  * @return <code>true</code> if auto commit mode is enabled, 
  * <code>false</code> otherwise.
  *
  * @exception SQLException If an error occurs.
  *
  * @see commit
  * @see rollback
  */
public abstract boolean
getAutoCommit() throws SQLException;

/*************************************************************************/

/**
  * This method turns auto commit mode on or off.  In auto commit mode,
  * every SQL statement is committed its own transaction.  Otherwise a
  * transaction must be explicitly committed or rolled back.
  *
  * @param autoCommit <code>true</code> to enable auto commit mode,
  * <code>false</code> to disable it.
  *
  * @exception SQLException If an error occurs.
  *
  * @see commit
  * @see rollback
  */
public abstract void
setAutoCommit(boolean autoCommit) throws SQLException;

/*************************************************************************/

/**
  * This method commits any SQL statements executed on this connection since 
  * the last commit or rollback.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
commit() throws SQLException;

/*************************************************************************/

/**
  * This method rolls back any SQL statements executed on this connection
  * since the last commit or rollback.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
rollback() throws SQLException;

/*************************************************************************/

/**
  * This method immediately closes this database connection.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
close() throws SQLException;

/*************************************************************************/

/**
  * This method tests whether or not this connection has been closed. 
  *
  * @return <code>true</code> if the connection is closed, <code>false</code>
  * otherwise.
  *
  * @exception SQLException If an error occurs.
  */
public abstract boolean
isClosed() throws SQLException;

/*************************************************************************/

/**
  * This method returns the meta data for this database connection.
  *
  * @return The meta data for this database.
  *
  * @exception SQLException If an error occurs.
  *
  * @see DatabaseMetaData
  */
public abstract DatabaseMetaData
getMetaData() throws SQLException;

/*************************************************************************/

/**
  * This method tests whether or not this connection is in read only mode.
  *
  * @return <code>true</code> if the connection is read only <code>false</code>
  * otherwise.
  *
  * @exception SQLException If an error occurs.
  */
public abstract boolean
isReadOnly() throws SQLException;

/*************************************************************************/

/**
  * This method turns read only mode on or off.  It may not be called while
  * a transaction is in progress.
  *
  * @param readOnly <code>true</code> if this connection is read only,
  * <code>false</code> otherwise.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
setReadOnly(boolean readOnly) throws SQLException;

/*************************************************************************/

/**
  * This method returns the name of the catalog in use by this connection,
  * if any.
  *
  * @return The name of the catalog, or <code>null</code> if one does not
  * exist or catalogs are not supported by this database.
  *
  * @exception SQLException If an error occurs.
  */
public abstract String
getCatalog() throws SQLException;

/*************************************************************************/

/**
  * This method sets the name of the catalog in use by this connection.
  * Note that this method does nothing if catalogs are not supported by
  * this database.
  *
  * @param catalog The name of the catalog to use for this connection.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
setCatalog(String catalog) throws SQLException;

/*************************************************************************/

/**
  * This method returns the current transaction isolation mode.  This will
  * be one of the constants defined in this interface.
  *
  * @return The transaction isolation level.
  *
  * @exception SQLException If an error occurs.
  */
public abstract int
getTransactionIsolation() throws SQLException;

/*************************************************************************/

/**
  * This method sets the current transaction isolation mode.  This must
  * be one of the constants defined in this interface.
  *
  * @param level The transaction isolation level.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
setTransactionIsolation(int level) throws SQLException;

/*************************************************************************/

/**
  * This method returns the first warning that occurred on this connection,
  * if any.  If there were any subsequence warnings, they will be chained
  * to the first one.
  *
  * @return The first <code>SQLWarning</code> that occurred, or 
  * <code>null</code> if there have been no warnings.
  *
  * @exception SQLException If an error occurs.
  */
public abstract SQLWarning
getWarnings() throws SQLException;

/*************************************************************************/

/**
  * This method clears all warnings that have occurred on this connection.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
clearWarnings() throws SQLException;

/*************************************************************************/

/**
  * This method returns the mapping of SQL types to Java classes
  * currently in use by this connection.  This mapping will have no
  * entries unless they have been manually added.
  *
  * @return The SQL type to Java class mapping.
  *
  * @exception SQLException If an error occurs.
  */
public abstract Map
getTypeMap() throws SQLException;

/*************************************************************************/

/**
  * This method sets the mapping table for SQL types to Java classes.
  * Any entries in this map override the defaults.
  *
  * @param map The new SQL mapping table.
  *
  * @exception SQLException If an error occurs.
  */
public abstract void
setTypeMap(Map map) throws SQLException;

} // interface Connection

