From e4955c2ec365daaae6e3eab730e0686ebbf009cc Mon Sep 17 00:00:00 2001 From: Dave Cramer Date: Wed, 17 Dec 2003 15:38:42 +0000 Subject: [PATCH] patch from Kris Jurka to fix large object 7.1 compatible protocol issues modified test case from Alexey Yudichev to be part of the testsuite --- .../org/postgresql/fastpath/Fastpath.java | 21 ++-- .../largeobject/LargeObjectManager.java | 8 +- .../postgresql/test/jdbc2/Jdbc2TestSuite.java | 1 + .../org/postgresql/test/jdbc2/OID74Test.java | 99 +++++++++++++++++++ 4 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java diff --git a/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java b/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java index e69529fc05..44243f7b8e 100644 --- a/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java +++ b/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java @@ -6,7 +6,7 @@ * Copyright (c) 2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v 1.17 2003/11/29 19:52:09 pgsql Exp $ + * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v 1.18 2003/12/17 15:38:42 davec Exp $ * *------------------------------------------------------------------------- */ @@ -63,7 +63,7 @@ public class Fastpath */ public Object fastpath(int fnid, boolean resulttype, FastpathArg[] args) throws SQLException { - if (conn.haveMinimumServerVersion("7.4")) { + if (conn.haveMinimumCompatibleVersion("7.4")) { return fastpathV3(fnid, resulttype, args); } else { return fastpathV2(fnid, resulttype, args); @@ -78,19 +78,22 @@ public class Fastpath // send the function call try { - int l_msgLen = 0; - l_msgLen += 16; - for (int i=0;i < args.length;i++) + int l_msgLen = 14; + for (int i=0; i < args.length; i++) { + l_msgLen += 2; l_msgLen += args[i].sendSize(); + } stream.SendChar('F'); stream.SendInteger(l_msgLen,4); stream.SendInteger(fnid, 4); - stream.SendInteger(1,2); - stream.SendInteger(1,2); - stream.SendInteger(args.length,2); - for (int i = 0;i < args.length;i++) + stream.SendInteger(args.length,2); + for (int i=0; i < args.length; i++) + stream.SendInteger(1,2); + + stream.SendInteger(args.length,2); + for (int i = 0; i < args.length; i++) args[i].send(stream); stream.SendInteger(1,2); diff --git a/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java b/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java index 4895f1b614..2958fb0498 100644 --- a/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java +++ b/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java @@ -11,7 +11,7 @@ * Copyright (c) 2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java,v 1.11 2003/11/29 19:52:11 pgsql Exp $ + * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/largeobject/LargeObjectManager.java,v 1.12 2003/12/17 15:38:42 davec Exp $ * *------------------------------------------------------------------------- */ @@ -116,7 +116,7 @@ public class LargeObjectManager if (conn.getMetaData().supportsSchemasInTableDefinitions()) { sql = "SELECT p.proname,p.oid "+ " FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n "+ - " WHERE p.pronamespace=n.oid AND n.nspname='pg_catalog' AND "; + " WHERE p.pronamespace=n.oid AND n.nspname='pg_catalog' AND ("; } else { sql = "SELECT proname,oid FROM pg_proc WHERE "; } @@ -129,6 +129,10 @@ public class LargeObjectManager " or proname = 'loread'" + " or proname = 'lowrite'"; + if (conn.getMetaData().supportsSchemasInTableDefinitions()) { + sql += ")"; + } + ResultSet res = conn.createStatement().executeQuery(sql); if (res == null) diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java index 31af0c520b..7a5acab8e2 100644 --- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/Jdbc2TestSuite.java @@ -57,6 +57,7 @@ public class Jdbc2TestSuite extends TestSuite // Fastpath/LargeObject suite.addTestSuite(BlobTest.class); + suite.addTestSuite(OID74Test.class); suite.addTestSuite(UpdateableResultTest.class ); diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java new file mode 100644 index 0000000000..ae80ce4286 --- /dev/null +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/OID74Test.java @@ -0,0 +1,99 @@ +package org.postgresql.test.jdbc2; + +import org.postgresql.test.TestUtil; +import junit.framework.TestCase; +import java.io.*; +import java.sql.*; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.sql.*; + +/** + * User: alexei + * Date: 17-Dec-2003 + * Time: 11:01:44 + * @version $Id: OID74Test.java,v 1.1 2003/12/17 15:38:42 davec Exp $ + */ +public class OID74Test extends TestCase +{ + private Connection con; + + + public OID74Test( String name ) + { + super(name); + } + public void setUp() throws Exception + { + } + public void tearDown() throws Exception + { + } + public void testBinaryStream() + { + //set up conection here + Connection c = null; + + Statement st = null; + try + { + c = DriverManager.getConnection("jdbc:postgresql://localhost/test?compatible=7.1&user=test"); + c.setAutoCommit(false); + st = c.createStatement(); + st.execute("CREATE TABLE temp (col oid)"); + } + catch (SQLException e) + { + //another issue: when connecting to 7.3 database and this exception occurs because the table already exists, + //st.setBinaryStream throws internal error in LargeObjectManager initialisation code + fail("table creating error, probably already exists, code=" + e.getErrorCode()); + } + finally + { + try{ if (st != null) st.close(); }catch(SQLException ex){}; + } + + PreparedStatement pstmt = null; + try + { + + pstmt = c.prepareStatement("INSERT INTO temp VALUES (?)"); + //in case of 7.4 server, should block here + pstmt.setBinaryStream(1, new ByteArrayInputStream(new byte[]{1, 2, 3, 4, 5}), 5); + assertTrue( (pstmt.executeUpdate() == 1) ); + pstmt.close(); + + pstmt = c.prepareStatement("SELECT col FROM temp LIMIT 1"); + ResultSet rs = pstmt.executeQuery(); + + assertTrue("No results from query", rs.next() ); + + //in case of 7.4 server, should block here + InputStream in = rs.getBinaryStream(1); + int data; + while ((data = in.read()) != -1) + System.out.println(data); + rs.close(); + st.close(); + c.createStatement().executeUpdate("DELETE FROM temp"); + c.commit(); + } + catch ( IOException ioex ) + { + fail( ioex.getMessage() ); + } + catch (SQLException ex) + { + fail( ex.getMessage() ); + } + finally + { + try + { + if ( c!=null) c.close(); + } + catch( SQLException e1){} + } + } +}