This is an automated email from the git hooks/post-receive script. ebourg-guest pushed a commit to annotated tag REL9_3_1102 in repository libpostgresql-jdbc-java.
commit 5776be398ccffa3b9e6a5dde830677458a8ca22a Author: Dave Cramer <[email protected]> Date: Mon Apr 14 19:55:26 2014 -0400 Merge pull request #128 from TomonariKatsumata/myFeature2 revising prepareThreshold and binaryTransfer behavior. --- doc/pgjdbc.xml | 3 +++ org/postgresql/jdbc2/AbstractJdbc2Connection.java | 16 ++++++++++-- org/postgresql/jdbc2/AbstractJdbc2Statement.java | 19 ++++++++------ org/postgresql/test/jdbc4/BinaryTest.java | 30 +++++++++++++++++++++-- 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/doc/pgjdbc.xml b/doc/pgjdbc.xml index 4c7bb7b..7ca92cc 100644 --- a/doc/pgjdbc.xml +++ b/doc/pgjdbc.xml @@ -711,6 +711,9 @@ openssl pkcs8 -topk8 -in client.key -out client.pk8 -outform DER -v1 PBE-SHA1-3D <classname>PreparedStatement</classname> object. More information on server side prepared statements is available in <xref linkend="server-prepare" />. + Negative number is regarded as zero, but -1 has special meaning + that allows the first query of a<classname>PreparedStatement</classname> + to use binary encoding. </para> </listitem> </varlistentry> diff --git a/org/postgresql/jdbc2/AbstractJdbc2Connection.java b/org/postgresql/jdbc2/AbstractJdbc2Connection.java index c84de44..d9ef7c3 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2Connection.java +++ b/org/postgresql/jdbc2/AbstractJdbc2Connection.java @@ -63,6 +63,10 @@ public abstract class AbstractJdbc2Connection implements BaseConnection // Default statement prepare threshold. protected int prepareThreshold; + + // Default forcebinary option. + protected boolean forcebinary = false; + // Connection's autocommit state. public boolean autoCommit = true; // Connection's readonly state. @@ -116,7 +120,7 @@ public abstract class AbstractJdbc2Connection implements BaseConnection { prepareThreshold = Integer.parseInt(info.getProperty("prepareThreshold", "5")); if (prepareThreshold < 0) - prepareThreshold = 0; + forcebinary = true; } catch (Exception e) { @@ -1197,7 +1201,15 @@ public abstract class AbstractJdbc2Connection implements BaseConnection } public void setPrepareThreshold(int newThreshold) { - this.prepareThreshold = (newThreshold <= 0 ? 0 : newThreshold); + this.prepareThreshold = newThreshold; + } + + public boolean getForceBinary() { + return forcebinary; + } + + public void setForceBinary(boolean newValue) { + this.forcebinary = newValue; } diff --git a/org/postgresql/jdbc2/AbstractJdbc2Statement.java b/org/postgresql/jdbc2/AbstractJdbc2Statement.java index bbc1937..3580257 100644 --- a/org/postgresql/jdbc2/AbstractJdbc2Statement.java +++ b/org/postgresql/jdbc2/AbstractJdbc2Statement.java @@ -39,7 +39,7 @@ import org.postgresql.util.GT; public abstract class AbstractJdbc2Statement implements BaseStatement { // only for testing purposes. even single shot statements will use binary transfers - public static final boolean ForceBinaryTransfers = Boolean.getBoolean("org.postgresql.forcebinary"); + public static boolean ForceBinaryTransfers = Boolean.getBoolean("org.postgresql.forcebinary"); protected ArrayList batchStatements = null; protected ArrayList batchParameters = null; @@ -145,6 +145,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement this.preparedQuery = null; this.preparedParameters = null; this.lastSimpleQuery = null; + ForceBinaryTransfers |= c.getForceBinary(); resultsettype = rsType; concurrency = rsConcurrency; } @@ -165,6 +166,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement this.testReturn = new int[inParamCount]; this.functionReturnType = new int[inParamCount]; + ForceBinaryTransfers |= connection.getForceBinary(); resultsettype = rsType; concurrency = rsConcurrency; @@ -530,7 +532,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement if (preparedQuery != null) { ++m_useCount; // We used this statement once more. - if (m_prepareThreshold == 0 || m_useCount < m_prepareThreshold) + if ((m_prepareThreshold == 0 || m_useCount < m_prepareThreshold) && !ForceBinaryTransfers) flags |= QueryExecutor.QUERY_ONESHOT; } @@ -541,7 +543,7 @@ public abstract class AbstractJdbc2Statement implements BaseStatement if (concurrency != ResultSet.CONCUR_READ_ONLY) flags |= QueryExecutor.QUERY_NO_BINARY_TRANSFER; - if (ForceBinaryTransfers || (flags & QueryExecutor.QUERY_ONESHOT) == 0) { + if (!queryToExecute.isStatementDescribed() && ForceBinaryTransfers) { int flags2 = flags | QueryExecutor.QUERY_DESCRIBE_ONLY; StatementResultHandler handler2 = new StatementResultHandler(); connection.getQueryExecutor().execute(queryToExecute, queryParameters, handler2, 0, 0, flags2); @@ -2603,12 +2605,13 @@ public abstract class AbstractJdbc2Statement implements BaseStatement public void setPrepareThreshold(int newThreshold) throws SQLException { checkClosed(); - - if (ForceBinaryTransfers) + + if (newThreshold < 0) { + ForceBinaryTransfers = true; newThreshold = 1; - - if (newThreshold < 0) - newThreshold = 0; + } + else + ForceBinaryTransfers = false; this.m_prepareThreshold = newThreshold; } diff --git a/org/postgresql/test/jdbc4/BinaryTest.java b/org/postgresql/test/jdbc4/BinaryTest.java index fddfa75..2344914 100644 --- a/org/postgresql/test/jdbc4/BinaryTest.java +++ b/org/postgresql/test/jdbc4/BinaryTest.java @@ -33,6 +33,8 @@ public class BinaryTest extends TestCase { protected void setUp() throws Exception { connection = TestUtil.openDB(); statement = connection.prepareStatement("select 1"); + + ((PGStatement) statement).setPrepareThreshold(5); } @Override @@ -50,17 +52,19 @@ public class BinaryTest extends TestCase { assertEquals(Field.TEXT_FORMAT, getFormat(results)); results = statement.executeQuery(); - assertEquals(Field.BINARY_FORMAT, getFormat(results)); + assertEquals(Field.TEXT_FORMAT, getFormat(results)); results = statement.executeQuery(); assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + ((PGStatement) statement).setPrepareThreshold(5); } public void testPreparedStatement_1() throws Exception { ((PGStatement) statement).setPrepareThreshold(1); results = statement.executeQuery(); - assertEquals(Field.BINARY_FORMAT, getFormat(results)); + assertEquals(Field.TEXT_FORMAT, getFormat(results)); results = statement.executeQuery(); assertEquals(Field.BINARY_FORMAT, getFormat(results)); @@ -70,6 +74,8 @@ public class BinaryTest extends TestCase { results = statement.executeQuery(); assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + ((PGStatement) statement).setPrepareThreshold(5); } public void testPreparedStatement_0() throws Exception { @@ -86,6 +92,26 @@ public class BinaryTest extends TestCase { results = statement.executeQuery(); assertEquals(Field.TEXT_FORMAT, getFormat(results)); + + ((PGStatement) statement).setPrepareThreshold(5); + } + + public void testPreparedStatement_negative1() throws Exception { + ((PGStatement) statement).setPrepareThreshold(-1); + + results = statement.executeQuery(); + assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + results = statement.executeQuery(); + assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + results = statement.executeQuery(); + assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + results = statement.executeQuery(); + assertEquals(Field.BINARY_FORMAT, getFormat(results)); + + ((PGStatement) statement).setPrepareThreshold(5); } private int getFormat(ResultSet results) throws SQLException { -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

