Re: Synthesize support for Statement.getGeneratedKeys()? - Mailing list pgsql-jdbc
From | Ken Johanson |
---|---|
Subject | Re: Synthesize support for Statement.getGeneratedKeys()? |
Date | |
Msg-id | 45D3E22F.9050009@kensystem.com Whole thread Raw |
In response to | Re: Synthesize support for Statement.getGeneratedKeys()? (Kris Jurka <books@ejurka.com>) |
Responses |
Re: Synthesize support for Statement.getGeneratedKeys()?
|
List | pgsql-jdbc |
Kris Jurka wrote: > > > On Tue, 13 Feb 2007, Ken Johanson wrote: > >> I have not tested this exhaustively, nor given though about the >> correctness of the null-normalization below; is this enough for you or >> someone to commit the changes? >> > > No, you've provided the sketch of a solution, but it's not appropriate > for the driver until you've resolved things like quoting column names, > putting in a version check for a server that supports RETURNING, and > added some test cases. Some or all of this can be done by the > committer, but the more work the committer must do the less likely it's > going to happen. > > Kris Jurka > This patch adds server version checking and only basic quoting to AbstractJdbc3Statement. No test cases. It only checks for server version 8 or newer as I couldn't easily find the threshold for the RETURNING support. It also only quotes the key array if it contains spaces. Doe anyone know if there is a scanner method to check for quotable identifiers? Did server 8 first implement RETURNING? What other concerns should I apply to this? Thanks, ken # This patch file was generated by NetBeans IDE # Following Index: paths are relative to: C:\dev\java\proj\pgjdbc\pgjdbc\org\postgresql\jdbc3 # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: AbstractJdbc3Statement.java *** C:\dev\java\proj\pgjdbc\pgjdbc\org\postgresql\jdbc3\AbstractJdbc3Statement.java Base (1.21) --- C:\dev\java\proj\pgjdbc\pgjdbc\org\postgresql\jdbc3\AbstractJdbc3Statement.java Locally Modified (Based On 1.21) *************** *** 19,24 **** --- 19,26 ---- import org.postgresql.core.QueryExecutor; import org.postgresql.core.Field; import org.postgresql.core.BaseConnection; + import org.postgresql.jdbc2.AbstractJdbc2Connection; + import org.postgresql.jdbc2.AbstractJdbc2Statement.StatementResultHandler; import org.postgresql.util.GT; /** *************** *** 106,112 **** */ public ResultSet getGeneratedKeys() throws SQLException { ! return createDriverResultSet(new Field[0], new Vector()); } /** --- 108,116 ---- */ public ResultSet getGeneratedKeys() throws SQLException { ! return result==null ? ! createDriverResultSet(new Field[0], new Vector()) ! : result.getResultSet(); } /** *************** *** 135,141 **** { if (autoGeneratedKeys == Statement.NO_GENERATED_KEYS) return executeUpdate(sql); ! throw new PSQLException(GT.tr("Returning autogenerated keys is not supported."), PSQLState.NOT_IMPLEMENTED); } --- 139,145 ---- { if (autoGeneratedKeys == Statement.NO_GENERATED_KEYS) return executeUpdate(sql); ! //fix me : impl NO_GENERATED_KEYS & RETURN_GENERATED_KEYS throw new PSQLException(GT.tr("Returning autogenerated keys is not supported."), PSQLState.NOT_IMPLEMENTED); } *************** *** 184,198 **** */ public int executeUpdate(String sql, String columnNames[]) throws SQLException { ! if (columnNames.length == 0) return executeUpdate(sql); ! ! throw new PSQLException(GT.tr("Returning autogenerated keys is not supported."), PSQLState.NOT_IMPLEMENTED); } /** * Executes the given SQL statement, which may return multiple results, --- 188,230 ---- */ public int executeUpdate(String sql, String columnNames[]) throws SQLException { ! //fix me : columnNames only quoted if contain 0x20 ! //fix me : if super changes, will break (need interface to get server verion): ! String prefix = sql.substring(0,10).toLowerCase(); ! if (prefix.indexOf("insert")==-1) ! return executeUpdateGetResults(sql); ! if (!(connection instanceof AbstractJdbc2Connection)) ! { ! throw new PSQLException(GT.tr("Driver version does not support returning generated keys.")+" "+connection.getClass().getName(),PSQLState.NOT_IMPLEMENTED); ! } ! AbstractJdbc2Connection con = (AbstractJdbc2Connection)connection; ! int major = con.getServerMajorVersion(); ! if (major<8) ! throw new PSQLException(GT.tr("Server version does not support returning generated keys.")+" ("+major+" < "+8+")",PSQLState.NOT_IMPLEMENTED); ! if (columnNames==null || columnNames.length==0) return executeUpdate(sql); ! StringBuffer s = new StringBuffer(sql.length()+(columnNames.length*32)); ! s.append(sql); ! s.append('\n'); ! s.append("RETURNING"); ! s.append(' '); ! boolean needsQuote; ! for (int i=0; i<columnNames.length; i++) ! { ! if (i!=0) ! s.append(','); ! needsQuote = columnNames[i].indexOf(' ')!=-1; ! if (needsQuote) ! s.append('"'); ! s.append(columnNames[i]); ! if (needsQuote) ! s.append('"'); } + return executeUpdateGetResults(s.toString()); + //throw new PSQLException(GT.tr("Returning autogenerated keys is not supported."), PSQLState.NOT_IMPLEMENTED); + } + /** * Executes the given SQL statement, which may return multiple results, * and signals the driver that any
pgsql-jdbc by date: