*** src/interfaces/jdbc/org/postgresql/Connection.java.orig Sun Jul 22 00:10:17 2001 --- src/interfaces/jdbc/org/postgresql/Connection.java Sun Jul 22 13:58:41 2001 *************** *** 76,81 **** --- 76,86 ---- // Now handle notices as warnings, so things like "show" now work public SQLWarning firstWarning = null; + /** + * Cache of the current isolation level + */ + private int isolationLevel = java.sql.Connection.TRANSACTION_READ_COMMITTED; + // The PID an cancellation key we get from the backend process public int pid; public int ckey; *************** *** 788,794 **** */ protected abstract java.sql.ResultSet getResultSet(org.postgresql.Connection conn,java.sql.Statement stat, Field[] fields, Vector tuples, String status, int updateCount,int insertOID) throws SQLException; ! public abstract void close() throws SQLException; /** * A sub-space of this Connection's database may be selected by --- 793,1028 ---- */ protected abstract java.sql.ResultSet getResultSet(org.postgresql.Connection conn,java.sql.Statement stat, Field[] fields, Vector tuples, String status, int updateCount,int insertOID) throws SQLException; ! /** ! * In some cases, it is desirable to immediately release a Connection's ! * database and JDBC resources instead of waiting for them to be ! * automatically released (cant think why off the top of my head) ! * ! * Note: A Connection is automatically closed when it is ! * garbage collected. Certain fatal errors also result in a closed ! * connection. ! * ! * @exception SQLException if a database access error occurs ! */ ! public void close() throws SQLException { ! if (pg_stream != null) { ! try { ! pg_stream.SendChar('X'); ! pg_stream.flush(); ! pg_stream.close(); ! } catch (IOException e) {} ! pg_stream = null; ! } ! } ! ! /** ! * A driver may convert the JDBC sql grammar into its system's ! * native SQL grammar prior to sending it; nativeSQL returns the ! * native form of the statement that the driver would have sent. ! * ! * @param sql a SQL statement that may contain one or more '?' ! * parameter placeholders ! * @return the native form of this statement ! * @exception SQLException if a database access error occurs ! */ ! public String nativeSQL(String sql) throws SQLException { ! return sql; ! } ! ! /** ! * The first warning reported by calls on this Connection is ! * returned. ! * ! * Note: Sebsequent warnings will be changed to this ! * SQLWarning ! * ! * @return the first SQLWarning or null ! * @exception SQLException if a database access error occurs ! */ ! public SQLWarning getWarnings() throws SQLException { ! return firstWarning; ! } ! ! /** ! * After this call, getWarnings returns null until a new warning ! * is reported for this connection. ! * ! * @exception SQLException if a database access error occurs ! */ ! public void clearWarnings() throws SQLException { ! firstWarning = null; ! } ! ! ! /** ! * You can put a connection in read-only mode as a hunt to enable ! * database optimizations ! * ! * Note: setReadOnly cannot be called while in the middle ! * of a transaction ! * ! * @param readOnly - true enables read-only mode; false disables it ! * @exception SQLException if a database access error occurs ! */ ! public void setReadOnly(boolean readOnly) throws SQLException { ! this.readOnly = readOnly; ! } ! ! /** ! * Tests to see if the connection is in Read Only Mode. Note that ! * we cannot really put the database in read only mode, but we pretend ! * we can by returning the value of the readOnly flag ! * ! * @return true if the connection is read only ! * @exception SQLException if a database access error occurs ! */ ! public boolean isReadOnly() throws SQLException { ! return readOnly; ! } ! ! /** ! * If a connection is in auto-commit mode, than all its SQL ! * statements will be executed and committed as individual ! * transactions. Otherwise, its SQL statements are grouped ! * into transactions that are terminated by either commit() ! * or rollback(). By default, new connections are in auto- ! * commit mode. The commit occurs when the statement completes ! * or the next execute occurs, whichever comes first. In the ! * case of statements returning a ResultSet, the statement ! * completes when the last row of the ResultSet has been retrieved ! * or the ResultSet has been closed. In advanced cases, a single ! * statement may return multiple results as well as output parameter ! * values. Here the commit occurs when all results and output param ! * values have been retrieved. ! * ! * @param autoCommit - true enables auto-commit; false disables it ! * @exception SQLException if a database access error occurs ! */ ! public void setAutoCommit(boolean autoCommit) throws SQLException { ! if (this.autoCommit == autoCommit) ! return; ! if (autoCommit) ! ExecSQL("end"); ! else { ! ExecSQL("begin"); ! doIsolationLevel(); ! } ! this.autoCommit = autoCommit; ! } ! ! /** ! * gets the current auto-commit state ! * ! * @return Current state of the auto-commit mode ! * @exception SQLException (why?) ! * @see setAutoCommit ! */ ! public boolean getAutoCommit() throws SQLException { ! return this.autoCommit; ! } ! ! /** ! * The method commit() makes all changes made since the previous ! * commit/rollback permanent and releases any database locks currently ! * held by the Connection. This method should only be used when ! * auto-commit has been disabled. (If autoCommit == true, then we ! * just return anyhow) ! * ! * @exception SQLException if a database access error occurs ! * @see setAutoCommit ! */ ! public void commit() throws SQLException { ! if (autoCommit) ! return; ! ExecSQL("commit"); ! autoCommit = true; ! ExecSQL("begin"); ! doIsolationLevel(); ! autoCommit = false; ! } ! ! /** ! * The method rollback() drops all changes made since the previous ! * commit/rollback and releases any database locks currently held by ! * the Connection. ! * ! * @exception SQLException if a database access error occurs ! * @see commit ! */ ! public void rollback() throws SQLException { ! if (autoCommit) ! return; ! ExecSQL("rollback"); ! autoCommit = true; ! ExecSQL("begin"); ! doIsolationLevel(); ! autoCommit = false; ! } ! ! /** ! * Get this Connection's current transaction isolation mode. ! * ! * @return the current TRANSACTION_* mode value ! * @exception SQLException if a database access error occurs ! */ ! public int getTransactionIsolation() throws SQLException { ! clearWarnings(); ! ExecSQL("show xactisolevel"); ! ! SQLWarning warning = getWarnings(); ! if (warning != null) { ! String message = warning.getMessage(); ! clearWarnings(); ! if (message.indexOf("READ COMMITTED") != -1) ! return java.sql.Connection.TRANSACTION_READ_COMMITTED; ! else if (message.indexOf("READ UNCOMMITTED") != -1) ! return java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; ! else if (message.indexOf("REPEATABLE READ") != -1) ! return java.sql.Connection.TRANSACTION_REPEATABLE_READ; ! else if (message.indexOf("SERIALIZABLE") != -1) ! return java.sql.Connection.TRANSACTION_SERIALIZABLE; ! } ! return java.sql.Connection.TRANSACTION_READ_COMMITTED; ! } ! ! /** ! * You can call this method to try to change the transaction ! * isolation level using one of the TRANSACTION_* values. ! * ! * Note: setTransactionIsolation cannot be called while ! * in the middle of a transaction ! * ! * @param level one of the TRANSACTION_* isolation values with ! * the exception of TRANSACTION_NONE; some databases may ! * not support other values ! * @exception SQLException if a database access error occurs ! * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel ! */ ! public void setTransactionIsolation(int level) throws SQLException { ! isolationLevel = level; ! doIsolationLevel(); ! } ! ! /** ! * Helper method used by setTransactionIsolation(), commit(), rollback() ! * and setAutoCommit(). This sets the current isolation level. ! */ ! protected void doIsolationLevel() throws SQLException { ! String q = "SET TRANSACTION ISOLATION LEVEL"; ! ! switch(isolationLevel) { ! case java.sql.Connection.TRANSACTION_READ_COMMITTED: ! ExecSQL(q + " READ COMMITTED"); ! return; ! ! case java.sql.Connection.TRANSACTION_SERIALIZABLE: ! ExecSQL(q + " SERIALIZABLE"); ! return; ! ! default: ! throw new PSQLException("postgresql.con.isolevel",new Integer(isolationLevel)); ! } ! } /** * A sub-space of this Connection's database may be selected by *** src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java.orig Sun Jul 22 00:10:17 2001 --- src/interfaces/jdbc/org/postgresql/jdbc1/Connection.java Sun Jul 22 13:40:04 2001 *************** *** 101,223 **** } /** - * A driver may convert the JDBC sql grammar into its system's - * native SQL grammar prior to sending it; nativeSQL returns the - * native form of the statement that the driver would have sent. - * - * @param sql a SQL statement that may contain one or more '?' - * parameter placeholders - * @return the native form of this statement - * @exception SQLException if a database access error occurs - */ - public String nativeSQL(String sql) throws SQLException - { - return sql; - } - - /** - * If a connection is in auto-commit mode, than all its SQL - * statements will be executed and committed as individual - * transactions. Otherwise, its SQL statements are grouped - * into transactions that are terminated by either commit() - * or rollback(). By default, new connections are in auto- - * commit mode. The commit occurs when the statement completes - * or the next execute occurs, whichever comes first. In the - * case of statements returning a ResultSet, the statement - * completes when the last row of the ResultSet has been retrieved - * or the ResultSet has been closed. In advanced cases, a single - * statement may return multiple results as well as output parameter - * values. Here the commit occurs when all results and output param - * values have been retrieved. - * - * @param autoCommit - true enables auto-commit; false disables it - * @exception SQLException if a database access error occurs - */ - public void setAutoCommit(boolean autoCommit) throws SQLException - { - if (this.autoCommit == autoCommit) - return; - if (autoCommit) - ExecSQL("end"); - else - ExecSQL("begin"); - this.autoCommit = autoCommit; - } - - /** - * gets the current auto-commit state - * - * @return Current state of the auto-commit mode - * @exception SQLException (why?) - * @see setAutoCommit - */ - public boolean getAutoCommit() throws SQLException - { - return this.autoCommit; - } - - /** - * The method commit() makes all changes made since the previous - * commit/rollback permanent and releases any database locks currently - * held by the Connection. This method should only be used when - * auto-commit has been disabled. (If autoCommit == true, then we - * just return anyhow) - * - * @exception SQLException if a database access error occurs - * @see setAutoCommit - */ - public void commit() throws SQLException - { - if (autoCommit) - return; - ExecSQL("commit"); - autoCommit = true; - ExecSQL("begin"); - autoCommit = false; - } - - /** - * The method rollback() drops all changes made since the previous - * commit/rollback and releases any database locks currently held by - * the Connection. - * - * @exception SQLException if a database access error occurs - * @see commit - */ - public void rollback() throws SQLException - { - if (autoCommit) - return; - ExecSQL("rollback"); - autoCommit = true; - ExecSQL("begin"); - autoCommit = false; - } - - /** - * In some cases, it is desirable to immediately release a Connection's - * database and JDBC resources instead of waiting for them to be - * automatically released (cant think why off the top of my head) - * - * Note: A Connection is automatically closed when it is - * garbage collected. Certain fatal errors also result in a closed - * connection. - * - * @exception SQLException if a database access error occurs - */ - public void close() throws SQLException - { - if (pg_stream != null) - { - try - { - pg_stream.close(); - } catch (IOException e) {} - pg_stream = null; - } - } - - /** * Tests to see if a Connection is closed * * @return the status of the connection --- 101,106 ---- *************** *** 242,353 **** if(metadata==null) metadata = new DatabaseMetaData(this); return metadata; - } - - /** - * You can put a connection in read-only mode as a hunt to enable - * database optimizations - * - * Note: setReadOnly cannot be called while in the middle - * of a transaction - * - * @param readOnly - true enables read-only mode; false disables it - * @exception SQLException if a database access error occurs - */ - public void setReadOnly (boolean readOnly) throws SQLException - { - this.readOnly = readOnly; - } - - /** - * Tests to see if the connection is in Read Only Mode. Note that - * we cannot really put the database in read only mode, but we pretend - * we can by returning the value of the readOnly flag - * - * @return true if the connection is read only - * @exception SQLException if a database access error occurs - */ - public boolean isReadOnly() throws SQLException - { - return readOnly; - } - - /** - * You can call this method to try to change the transaction - * isolation level using one of the TRANSACTION_* values. - * - * Note: setTransactionIsolation cannot be called while - * in the middle of a transaction - * - * @param level one of the TRANSACTION_* isolation values with - * the exception of TRANSACTION_NONE; some databases may - * not support other values - * @exception SQLException if a database access error occurs - * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel - */ - public void setTransactionIsolation(int level) throws SQLException - { - String q = "SET TRANSACTION ISOLATION LEVEL"; - - switch(level) { - - case java.sql.Connection.TRANSACTION_READ_COMMITTED: - ExecSQL(q + " READ COMMITTED"); - return; - - case java.sql.Connection.TRANSACTION_SERIALIZABLE: - ExecSQL(q + " SERIALIZABLE"); - return; - - default: - throw new PSQLException("postgresql.con.isolevel",new Integer(level)); - } - } - - /** - * Get this Connection's current transaction isolation mode. - * - * @return the current TRANSACTION_* mode value - * @exception SQLException if a database access error occurs - */ - public int getTransactionIsolation() throws SQLException - { - ExecSQL("show xactisolevel"); - - SQLWarning w = getWarnings(); - if (w != null) { - if (w.getMessage().indexOf("READ COMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_COMMITTED; else - if (w.getMessage().indexOf("READ UNCOMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; else - if (w.getMessage().indexOf("REPEATABLE READ") != -1) return java.sql.Connection.TRANSACTION_REPEATABLE_READ; else - if (w.getMessage().indexOf("SERIALIZABLE") != -1) return java.sql.Connection.TRANSACTION_SERIALIZABLE; - } - return java.sql.Connection.TRANSACTION_READ_COMMITTED; - } - - /** - * The first warning reported by calls on this Connection is - * returned. - * - * Note: Sebsequent warnings will be changed to this - * SQLWarning - * - * @return the first SQLWarning or null - * @exception SQLException if a database access error occurs - */ - public SQLWarning getWarnings() throws SQLException - { - return firstWarning; - } - - /** - * After this call, getWarnings returns null until a new warning - * is reported for this connection. - * - * @exception SQLException if a database access error occurs - */ - public void clearWarnings() throws SQLException - { - firstWarning = null; } /** --- 125,130 ---- *** src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java.orig Sun Jul 22 00:10:17 2001 --- src/interfaces/jdbc/org/postgresql/jdbc2/Connection.java Sun Jul 22 13:39:51 2001 *************** *** 45,55 **** protected java.util.Map typemap; /** - * Cache of the current isolation level - */ - protected int isolationLevel = java.sql.Connection.TRANSACTION_READ_COMMITTED; - - /** * SQL statements without parameters are normally executed using * Statement objects. If the same SQL statement is executed many * times, it is more efficient to use a PreparedStatement --- 45,50 ---- *************** *** 147,274 **** //return s; } - - /** - * A driver may convert the JDBC sql grammar into its system's - * native SQL grammar prior to sending it; nativeSQL returns the - * native form of the statement that the driver would have sent. - * - * @param sql a SQL statement that may contain one or more '?' - * parameter placeholders - * @return the native form of this statement - * @exception SQLException if a database access error occurs - */ - public String nativeSQL(String sql) throws SQLException - { - return sql; - } - - /** - * If a connection is in auto-commit mode, than all its SQL - * statements will be executed and committed as individual - * transactions. Otherwise, its SQL statements are grouped - * into transactions that are terminated by either commit() - * or rollback(). By default, new connections are in auto- - * commit mode. The commit occurs when the statement completes - * or the next execute occurs, whichever comes first. In the - * case of statements returning a ResultSet, the statement - * completes when the last row of the ResultSet has been retrieved - * or the ResultSet has been closed. In advanced cases, a single - * statement may return multiple results as well as output parameter - * values. Here the commit occurs when all results and output param - * values have been retrieved. - * - * @param autoCommit - true enables auto-commit; false disables it - * @exception SQLException if a database access error occurs - */ - public void setAutoCommit(boolean autoCommit) throws SQLException - { - if (this.autoCommit == autoCommit) - return; - if (autoCommit) - ExecSQL("end"); - else { - ExecSQL("begin"); - doIsolationLevel(); - } - this.autoCommit = autoCommit; - } - - /** - * gets the current auto-commit state - * - * @return Current state of the auto-commit mode - * @exception SQLException (why?) - * @see setAutoCommit - */ - public boolean getAutoCommit() throws SQLException - { - return this.autoCommit; - } - - /** - * The method commit() makes all changes made since the previous - * commit/rollback permanent and releases any database locks currently - * held by the Connection. This method should only be used when - * auto-commit has been disabled. (If autoCommit == true, then we - * just return anyhow) - * - * @exception SQLException if a database access error occurs - * @see setAutoCommit - */ - public void commit() throws SQLException - { - if (autoCommit) - return; - ExecSQL("commit"); - autoCommit = true; - ExecSQL("begin"); - doIsolationLevel(); - autoCommit = false; - } - - /** - * The method rollback() drops all changes made since the previous - * commit/rollback and releases any database locks currently held by - * the Connection. - * - * @exception SQLException if a database access error occurs - * @see commit - */ - public void rollback() throws SQLException - { - if (autoCommit) - return; - ExecSQL("rollback"); - autoCommit = true; - ExecSQL("begin"); - doIsolationLevel(); - autoCommit = false; - } - - /** - * In some cases, it is desirable to immediately release a Connection's - * database and JDBC resources instead of waiting for them to be - * automatically released (cant think why off the top of my head) - * - * Note: A Connection is automatically closed when it is - * garbage collected. Certain fatal errors also result in a closed - * connection. - * - * @exception SQLException if a database access error occurs - */ - public void close() throws SQLException - { - if (pg_stream != null) - { - try - { - pg_stream.close(); - } catch (IOException e) {} - pg_stream = null; - } - } - /** * Tests to see if a Connection is closed. * --- 142,147 ---- *************** *** 325,449 **** if(metadata==null) metadata = new DatabaseMetaData(this); return metadata; - } - - /** - * You can put a connection in read-only mode as a hunt to enable - * database optimizations - * - * Note: setReadOnly cannot be called while in the middle - * of a transaction - * - * @param readOnly - true enables read-only mode; false disables it - * @exception SQLException if a database access error occurs - */ - public void setReadOnly (boolean readOnly) throws SQLException - { - this.readOnly = readOnly; - } - - /** - * Tests to see if the connection is in Read Only Mode. Note that - * we cannot really put the database in read only mode, but we pretend - * we can by returning the value of the readOnly flag - * - * @return true if the connection is read only - * @exception SQLException if a database access error occurs - */ - public boolean isReadOnly() throws SQLException - { - return readOnly; - } - - /** - * You can call this method to try to change the transaction - * isolation level using one of the TRANSACTION_* values. - * - * Note: setTransactionIsolation cannot be called while - * in the middle of a transaction - * - * @param level one of the TRANSACTION_* isolation values with - * the exception of TRANSACTION_NONE; some databases may - * not support other values - * @exception SQLException if a database access error occurs - * @see java.sql.DatabaseMetaData#supportsTransactionIsolationLevel - */ - public void setTransactionIsolation(int level) throws SQLException - { - isolationLevel = level; - doIsolationLevel(); - } - - /** - * Helper method used by setTransactionIsolation(), commit(), rollback() - * and setAutoCommit(). This sets the current isolation level. - */ - private void doIsolationLevel() throws SQLException - { - String q = "SET TRANSACTION ISOLATION LEVEL"; - - switch(isolationLevel) { - - case java.sql.Connection.TRANSACTION_READ_COMMITTED: - ExecSQL(q + " READ COMMITTED"); - return; - - case java.sql.Connection.TRANSACTION_SERIALIZABLE: - ExecSQL(q + " SERIALIZABLE"); - return; - - default: - throw new PSQLException("postgresql.con.isolevel",new Integer(isolationLevel)); - } - } - - /** - * Get this Connection's current transaction isolation mode. - * - * @return the current TRANSACTION_* mode value - * @exception SQLException if a database access error occurs - */ - public int getTransactionIsolation() throws SQLException - { - clearWarnings(); - ExecSQL("show xactisolevel"); - - SQLWarning w = getWarnings(); - if (w != null) { - String m = w.getMessage(); - clearWarnings(); - if (m.indexOf("READ COMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_COMMITTED; else - if (m.indexOf("READ UNCOMMITTED") != -1) return java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; else - if (m.indexOf("REPEATABLE READ") != -1) return java.sql.Connection.TRANSACTION_REPEATABLE_READ; else - if (m.indexOf("SERIALIZABLE") != -1) return java.sql.Connection.TRANSACTION_SERIALIZABLE; - } - return java.sql.Connection.TRANSACTION_READ_COMMITTED; - } - - /** - * The first warning reported by calls on this Connection is - * returned. - * - * Note: Sebsequent warnings will be changed to this - * SQLWarning - * - * @return the first SQLWarning or null - * @exception SQLException if a database access error occurs - */ - public SQLWarning getWarnings() throws SQLException - { - return firstWarning; - } - - /** - * After this call, getWarnings returns null until a new warning - * is reported for this connection. - * - * @exception SQLException if a database access error occurs - */ - public void clearWarnings() throws SQLException - { - firstWarning = null; } /** --- 198,203 ---- *** src/interfaces/jdbc/org/postgresql/PG_Stream.java.orig Sun Jul 22 11:32:51 2001 --- src/interfaces/jdbc/org/postgresql/PG_Stream.java Sun Jul 22 11:32:31 2001 *************** *** 346,353 **** */ public void close() throws IOException { - pg_output.write("X".getBytes()); - pg_output.flush(); pg_output.close(); pg_input.close(); connection.close(); --- 346,351 ----