Re: Here's a fix to AbstractJdbc3Statement.getGeneratedKeys
| От | Jeppe Sommer |
|---|---|
| Тема | Re: Here's a fix to AbstractJdbc3Statement.getGeneratedKeys |
| Дата | |
| Msg-id | 49F17616.9030801@trifork.com обсуждение исходный текст |
| Ответ на | Here's a fix to AbstractJdbc3Statement.getGeneratedKeys (Jeppe Sommer <jso@trifork.com>) |
| Список | pgsql-jdbc |
Sorry, I forgot to attach the patch :-(
Here it is.
Jeppe Sommer skrev:
> Frustrations over a 4 hour database script with MySQL forced me into
> this :-)
>
> Porting a project from MySQL to PostgreSQL, I discovered that the jdbc3
> facility of returning the generated keys from an insert statement does
> not work. On a fresh cvs checkout, there is partial support, however,
> all fields are returned, not only the field that are autogenerated.
>
> Here is a patch that fixes this. I hope someone will take a look, and
> consider whether it can be adopted into the project. Or improved. It
> works for me :-)
>
> The strategy of the patch is simply to inspect the metadata of the
> returned (initially full) resultset, and then strip out any fields that
> are not marked as autoincrement.
>
> BTW the 4 hour db script finishes after 2m 19s on PostgreSQL.
>
>
> Best Regards,
> Jeppe
>
>
>
Index: org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
===================================================================
RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v
retrieving revision 1.105
diff -u -r1.105 AbstractJdbc2ResultSet.java
--- org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 30 Sep 2008 04:34:51 -0000 1.105
+++ org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 24 Apr 2009 07:54:23 -0000
@@ -55,7 +55,7 @@
private int fetchdirection = ResultSet.FETCH_UNKNOWN;
protected final BaseConnection connection; // the connection we belong to
protected final BaseStatement statement; // the statement we belong to
- protected final Field fields[]; // Field metadata for this resultset.
+ protected Field fields[]; // Field metadata for this resultset.
protected final Query originalQuery; // Query we originated from
protected final int maxRows; // Maximum rows in this resultset (might be 0).
@@ -2909,6 +2909,18 @@
public String getValue() {
return null;
}
- };
+ }
+
+ public Vector getRows() {
+ return rows;
+ }
+
+ public Field[] getFields() {
+ return fields;
+ }
+
+ public void setFields(Field[] fields) {
+ this.fields = fields;
+ };
}
Index: org/postgresql/jdbc3/AbstractJdbc3Statement.java
===================================================================
RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/jdbc3/AbstractJdbc3Statement.java,v
retrieving revision 1.24
diff -u -r1.24 AbstractJdbc3Statement.java
--- org/postgresql/jdbc3/AbstractJdbc3Statement.java 28 Jan 2009 09:50:21 -0000 1.24
+++ org/postgresql/jdbc3/AbstractJdbc3Statement.java 24 Apr 2009 07:54:23 -0000
@@ -11,16 +11,19 @@
import java.math.BigDecimal;
import java.sql.*;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.HashSet;
import java.util.Vector;
-import org.postgresql.util.PSQLException;
-import org.postgresql.util.PSQLState;
-import org.postgresql.core.Utils;
-import org.postgresql.core.QueryExecutor;
-import org.postgresql.core.Field;
import org.postgresql.core.BaseConnection;
+import org.postgresql.core.Field;
+import org.postgresql.core.QueryExecutor;
+import org.postgresql.core.Utils;
+import org.postgresql.jdbc2.AbstractJdbc2ResultSet;
import org.postgresql.util.GT;
+import org.postgresql.util.PSQLException;
+import org.postgresql.util.PSQLState;
/**
* This class defines methods of the jdbc3 specification. This class extends
@@ -30,6 +33,7 @@
public abstract class AbstractJdbc3Statement extends org.postgresql.jdbc2.AbstractJdbc2Statement
{
private final int rsHoldability;
+ public HashSet<String> specifiedColumns;
public AbstractJdbc3Statement (AbstractJdbc3Connection c, int rsType, int rsConcurrency, int rsHoldability) throws
SQLException
{
@@ -111,7 +115,34 @@
if (generatedKeys == null || generatedKeys.getResultSet() == null)
return createDriverResultSet(new Field[0], new Vector());
- return generatedKeys.getResultSet();
+ AbstractJdbc2ResultSet rs = (AbstractJdbc2ResultSet) generatedKeys.getResultSet();
+
+ ResultSetMetaData metaData = rs.getMetaData();
+
+ final ArrayList<Field> fields = new ArrayList<Field>();
+ ArrayList<byte[]> tuples = new ArrayList<byte[]>();
+ int columnCount = metaData.getColumnCount();
+
+ byte[][] origTuples = (byte[][]) rs.getRows().get(0);
+ Field[] origFields = rs.getFields();
+
+ for (int c = 0; c < columnCount; c++) {
+ if (metaData.isAutoIncrement(c + 1)) {
+ tuples.add(origTuples[c]);
+ fields.add(origFields[c]);
+ }
+ }
+
+ Field[] f = new Field[fields.size()];
+ fields.toArray(f);
+
+ byte[][] t = new byte[tuples.size()][];
+ tuples.toArray(t);
+
+ rs.getRows().set(0, t);
+ rs.setFields(f);
+
+ return rs;
}
/**
В списке pgsql-jdbc по дате отправления: