Fixed support in jdbc for 7.3 server autocommit. With these changes the

jdbc regression tests pass for both autocommit on and autocommit off

 Modified Files:
 	jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java
 	jdbc/org/postgresql/test/jdbc2/ConnectionTest.java
This commit is contained in:
Barry Lind 2002-10-17 05:33:52 +00:00
parent f789bd3de2
commit c3e7b3cc96
2 changed files with 72 additions and 12 deletions

View File

@ -14,7 +14,7 @@ import org.postgresql.largeobject.LargeObjectManager;
import org.postgresql.util.*;
/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.10 2002/10/01 00:39:01 davec Exp $
/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Attic/AbstractJdbc1Connection.java,v 1.11 2002/10/17 05:33:52 barry Exp $
* This class defines methods of the jdbc1 specification. This class is
* extended by org.postgresql.jdbc2.AbstractJdbc2Connection which adds the jdbc2
* methods. The real Connection class (for jdbc1) is org.postgresql.jdbc1.Jdbc1Connection
@ -362,6 +362,29 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
String dbEncoding = resultSet.getString(2);
encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
//In 7.3 we are forced to do a second roundtrip to handle the case
//where a database may not be running in autocommit mode
//jdbc by default assumes autocommit is on until setAutoCommit(false)
//is called. Therefore we need to ensure a new connection is
//initialized to autocommit on.
if (haveMinimumServerVersion("7.3"))
{
java.sql.ResultSet acRset =
ExecSQL("show autocommit");
if (!acRset.next())
{
throw new PSQLException("postgresql.con.failed", "failed getting autocommit status");
}
//if autocommit is currently off we need to turn it on
//note that we will be in a transaction because the select above
//will have initiated the transaction so we need a commit
//to make the setting permanent
if (acRset.getString(1).equals("off"))
{
ExecSQL("set autocommit = on; commit;");
}
}
// Initialise object handling
initObjectTypes();
@ -896,10 +919,26 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
if (this.autoCommit == autoCommit)
return ;
if (autoCommit)
ExecSQL("end");
{
if (haveMinimumServerVersion("7.3"))
{
//We do the select to ensure a transaction is in process
//before we do the commit to avoid warning messages
//from issuing a commit without a transaction in process
ExecSQL("select 1; commit; set autocommit = on;");
}
else
{
if (haveMinimumServerVersion("7.1"))
ExecSQL("end");
}
}
else
{
if (haveMinimumServerVersion("7.3"))
{
ExecSQL("set autocommit = off; " + getIsolationLevelSQL());
}
else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("begin;" + getIsolationLevelSQL());
}
@ -938,7 +977,11 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
{
if (autoCommit)
return ;
if (haveMinimumServerVersion("7.1"))
if (haveMinimumServerVersion("7.3"))
{
ExecSQL("commit; " + getIsolationLevelSQL());
}
else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("commit;begin;" + getIsolationLevelSQL());
}
@ -962,7 +1005,14 @@ public abstract class AbstractJdbc1Connection implements org.postgresql.PGConnec
{
if (autoCommit)
return ;
if (haveMinimumServerVersion("7.1"))
if (haveMinimumServerVersion("7.3"))
{
//we don't automatically start a transaction
//but let the server functionality automatically start
//one when the first statement is executed
ExecSQL("rollback; " + getIsolationLevelSQL());
}
else if (haveMinimumServerVersion("7.1"))
{
ExecSQL("rollback; begin;" + getIsolationLevelSQL());
}

View File

@ -10,7 +10,7 @@ import java.sql.*;
*
* PS: Do you know how difficult it is to type on a train? ;-)
*
* $Id: ConnectionTest.java,v 1.9 2002/08/14 20:35:40 barry Exp $
* $Id: ConnectionTest.java,v 1.10 2002/10/17 05:33:52 barry Exp $
*/
public class ConnectionTest extends TestCase
@ -244,18 +244,28 @@ public class ConnectionTest extends TestCase
assertEquals(Connection.TRANSACTION_READ_COMMITTED,
con.getTransactionIsolation());
// Note the behavior on when a transaction starts is different
// under 7.3 than previous versions. In 7.3 a transaction
// starts with the first sql command, whereas previously
// you were always in a transaction in autocommit=false
// so we issue a select to ensure we are in a transaction
Statement stmt = con.createStatement();
stmt.executeQuery("select 1");
// Now change the default for future transactions
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
// Since the call to setTransactionIsolation() above was made
// inside the transaction, the isolation level of the current
// transaction did not change. It affects only future transactions.
// transaction did not change. It affects only future ones.
// This behaviour is recommended by the JDBC spec.
assertEquals(Connection.TRANSACTION_READ_COMMITTED,
con.getTransactionIsolation());
// Begin a new transaction
con.commit();
stmt.executeQuery("select 1");
// Now we should see the new isolation level
assertEquals(Connection.TRANSACTION_SERIALIZABLE,