From 5295fffc26d9bb02fc3b51cbb4f7de744ee50046 Mon Sep 17 00:00:00 2001 From: Barry Lind Date: Sat, 3 May 2003 20:40:45 +0000 Subject: Patch to fix up LONGVARBINARY support submitted by Amit Gollapudi (agollapudi@demandsolutions.com). Also applied the RefCursor support patch by Nic Ferrier. This patch allows you too return a get a result set from a function that returns a refcursor. For example: call.registerOutParameter(1, Types.OTHER); call.execute(); ResultSet rs = (ResultSet) call.getObject(1); Modified Files: jdbc/org/postgresql/core/BaseStatement.java jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java jdbc/org/postgresql/jdbc1/AbstractJdbc1Statement.java jdbc/org/postgresql/jdbc1/Jdbc1CallableStatement.java jdbc/org/postgresql/jdbc1/Jdbc1PreparedStatement.java jdbc/org/postgresql/jdbc1/Jdbc1Statement.java jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java jdbc/org/postgresql/jdbc2/Jdbc2CallableStatement.java jdbc/org/postgresql/jdbc2/Jdbc2PreparedStatement.java jdbc/org/postgresql/jdbc2/Jdbc2Statement.java jdbc/org/postgresql/jdbc3/Jdbc3CallableStatement.java jdbc/org/postgresql/jdbc3/Jdbc3PreparedStatement.java jdbc/org/postgresql/jdbc3/Jdbc3Statement.java Added Files: jdbc/org/postgresql/PGRefCursorResultSet.java jdbc/org/postgresql/jdbc1/Jdbc1RefCursorResultSet.java jdbc/org/postgresql/jdbc2/Jdbc2RefCursorResultSet.java jdbc/org/postgresql/jdbc3/Jdbc3RefCursorResultSet.java jdbc/org/postgresql/test/jdbc2/RefCursorTest.java --- .../postgresql/jdbc2/AbstractJdbc2ResultSet.java | 9 ++++- .../postgresql/jdbc2/Jdbc2CallableStatement.java | 6 +++ .../postgresql/jdbc2/Jdbc2PreparedStatement.java | 7 ++++ .../postgresql/jdbc2/Jdbc2RefCursorResultSet.java | 43 ++++++++++++++++++++++ .../jdbc/org/postgresql/jdbc2/Jdbc2Statement.java | 8 +++- 5 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2RefCursorResultSet.java (limited to 'src/interfaces/jdbc/org/postgresql/jdbc2') diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java index 46ebdb47cec..21514235027 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java @@ -9,7 +9,7 @@ * Copyright (c) 2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.18 2003/03/25 02:24:07 davec Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.19 2003/05/03 20:40:45 barry Exp $ * *------------------------------------------------------------------------- */ @@ -148,11 +148,18 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra default: String type = field.getPGType(); + // if the backend doesn't know the type then coerce to String if (type.equals("unknown")) { return getString(columnIndex); } + // Specialized support for ref cursors is neater. + else if (type.equals("refcursor")) + { + String cursorName = getString(columnIndex); + return statement.createRefCursorResultSet(cursorName); + } else { return connection.getObject(field.getPGType(), getString(columnIndex)); diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2CallableStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2CallableStatement.java index 5b8e76e122d..e10223e975c 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2CallableStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2CallableStatement.java @@ -3,6 +3,7 @@ package org.postgresql.jdbc2; import java.sql.*; import java.util.Vector; +import org.postgresql.PGRefCursorResultSet; import org.postgresql.core.BaseResultSet; import org.postgresql.core.Field; @@ -18,5 +19,10 @@ public class Jdbc2CallableStatement extends org.postgresql.jdbc2.AbstractJdbc2St { return new Jdbc2ResultSet(this, fields, tuples, status, updateCount, insertOID, binaryCursor); } + + public PGRefCursorResultSet createRefCursorResultSet (String cursorName) throws SQLException + { + return new Jdbc2RefCursorResultSet(this, cursorName); + } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2PreparedStatement.java index 4eeded05fdc..83023f05f44 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2PreparedStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2PreparedStatement.java @@ -3,6 +3,7 @@ package org.postgresql.jdbc2; import java.sql.*; import java.util.Vector; +import org.postgresql.PGRefCursorResultSet; import org.postgresql.core.BaseResultSet; import org.postgresql.core.Field; @@ -18,5 +19,11 @@ public class Jdbc2PreparedStatement extends org.postgresql.jdbc2.AbstractJdbc2St { return new Jdbc2ResultSet(this, fields, tuples, status, updateCount, insertOID, binaryCursor); } + + + public PGRefCursorResultSet createRefCursorResultSet (String cursorName) throws SQLException + { + return new Jdbc2RefCursorResultSet(this, cursorName); + } } diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2RefCursorResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2RefCursorResultSet.java new file mode 100644 index 00000000000..08ec33d752f --- /dev/null +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2RefCursorResultSet.java @@ -0,0 +1,43 @@ +package org.postgresql.jdbc2; + + +import org.postgresql.core.QueryExecutor; +import org.postgresql.core.BaseStatement; +import org.postgresql.PGRefCursorResultSet; + + +/** A real result set based on a ref cursor. + * + * @author Nic Ferrier + */ +public class Jdbc2RefCursorResultSet extends Jdbc2ResultSet + implements PGRefCursorResultSet +{ + + String refCursorHandle; + + // Indicates when the result set has activaly bound to the cursor. + boolean isInitialized = false; + + Jdbc2RefCursorResultSet(BaseStatement statement, String refCursorName) throws java.sql.SQLException + { + super(statement, null, null, null, -1, 0L, false); + this.refCursorHandle = refCursorName; + } + + public String getRefCursor () + { + return refCursorHandle; + } + + public boolean next () throws java.sql.SQLException + { + if (isInitialized) + return super.next(); + // Initialize this res set with the rows from the cursor. + String[] toExec = { "FETCH ALL IN \"" + refCursorHandle + "\";" }; + QueryExecutor.execute(toExec, new String[0], this); + isInitialized = true; + return super.next(); + } +} diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2Statement.java index a1328dd3fba..eb78a889b36 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2Statement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Jdbc2Statement.java @@ -3,10 +3,11 @@ package org.postgresql.jdbc2; import java.sql.*; import java.util.Vector; +import org.postgresql.PGRefCursorResultSet; import org.postgresql.core.BaseResultSet; import org.postgresql.core.Field; -/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/Jdbc2Statement.java,v 1.5 2003/03/07 18:39:45 barry Exp $ +/* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/Jdbc2Statement.java,v 1.6 2003/05/03 20:40:45 barry Exp $ * This class implements the java.sql.Statement interface for JDBC2. * However most of the implementation is really done in * org.postgresql.jdbc2.AbstractJdbc2Statement or one of it's parents @@ -23,4 +24,9 @@ public class Jdbc2Statement extends org.postgresql.jdbc2.AbstractJdbc2Statement { return new Jdbc2ResultSet(this, fields, tuples, status, updateCount, insertOID, binaryCursor); } + + public PGRefCursorResultSet createRefCursorResultSet (String cursorName) throws SQLException + { + return new Jdbc2RefCursorResultSet(this, cursorName); + } } -- cgit v1.2.3