*** jdbc2/CallableStatement.java Wed Feb 20 15:29:23 2002 --- /home/paulb/Development/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/CallableStatement.java Mon Nov 19 17:33:38 2001 *************** *** 7,13 **** import java.sql.*; import java.math.*; ! import org.postgresql.util.*; /* * CallableStatement is used to execute SQL stored procedures. * --- 7,13 ---- import java.sql.*; import java.math.*; ! /* * CallableStatement is used to execute SQL stored procedures. * *************** *** 46,91 **** */ public CallableStatement(Connection c, String q) throws SQLException { ! super(c, q, false); // don't parse yet.. ! modifyJdbcCall (); ! parseSqlStmt (); // now parse the reformed stmt.. ! } ! ! /** ! * this method will turn a string of the form ! * {? = call (?, [?,..]) } ! * into the PostgreSQL format which is ! * select (?, [?, ...]) as result ! * ! */ ! private void modifyJdbcCall () throws SQLException { ! originalSql = sql; // save for error msgs.. ! int index = sql.indexOf ("="); // is implied func or proc? ! if (index != -1) isFunction = true; ! index = sql.indexOf ("call"); ! if (index == -1) ! throw new PSQLException ("postgresql.call.malformed", ! new Object[]{sql, JDBC_SYNTAX}); ! sql = sql.replace ('{', ' '); // replace these characters ! sql = sql.replace ('}', ' '); ! sql = sql.replace (';', ' '); ! ! sql = (isFunction ? "?" : "") + sql.substring (index + 4); ! sql = "select " + sql + " as " + RESULT_COLUMN + ";"; ! } ! ! // internals ! static final String JDBC_SYNTAX = "{[? =] call ([? [,?]*]) }"; ! static final String RESULT_COLUMN = "result"; ! String originalSql = ""; ! boolean isFunction; ! // functionReturnType contains the user supplied value to check ! // testReturn contains a modified version to make it easier to ! // check the getXXX methods.. ! int functionReturnType; ! int testReturn; ! boolean returnTypeSet; ! Object result; /* * Before executing a stored procedure call you must explicitly --- 46,53 ---- */ public CallableStatement(Connection c, String q) throws SQLException { ! super(c, q); ! } /* * Before executing a stored procedure call you must explicitly *************** *** 96,103 **** * the getXXX method whose Java type XXX corresponds to the * parameter's registered SQL type. * - * ONLY 1 RETURN PARAMETER if {?= call ..} syntax is used - * * @param parameterIndex the first parameter is 1, the second is 2,... * @param sqlType SQL type code defined by java.sql.Types; for * parameters of type Numeric or Decimal use the version of --- 58,63 ---- *************** *** 105,160 **** * @exception SQLException if a database-access error occurs. */ public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException ! { ! if (parameterIndex != 1) ! throw new PSQLException ("postgresql.call.noinout"); ! if (!isFunction) ! throw new PSQLException ("postgresql.call.procasfunc", originalSql); ! ! // functionReturnType contains the user supplied value to check ! // testReturn contains a modified version to make it easier to ! // check the getXXX methods.. ! functionReturnType = sqlType; ! testReturn = sqlType; ! if (functionReturnType == Types.CHAR || ! functionReturnType == Types.LONGVARCHAR) ! testReturn = Types.VARCHAR; ! else if (functionReturnType == Types.FLOAT) ! testReturn = Types.REAL; // changes to streamline later error checking ! returnTypeSet = true; ! } ! ! /** ! * allow calls to execute update ! * @return 1 if succesful call otherwise 0 ! */ ! public int executeUpdate() throws SQLException ! { ! // System.out.println ("Executing " + compileQuery()); ! java.sql.ResultSet rs = super.executeQuery (compileQuery()); ! if (isFunction) { ! if (!rs.next ()) ! throw new PSQLException ("postgresql.call.noreturnval"); // TODO-props ! result = rs.getObject (1); ! int columnType = rs.getMetaData().getColumnType (1); ! if (columnType != functionReturnType) ! throw new PSQLException ("postgresql.call.wrongrtntype", ! new Object[]{ ! getSqlTypeName (columnType), getSqlTypeName (functionReturnType) }); ! } ! rs.close (); ! return 1; ! } ! ! ! /** ! * allow calls to execute update ! * @return true if succesful ! */ ! public boolean execute() throws SQLException ! { ! return (executeUpdate() == 1); ! } /* * You must also specify the scale for numeric/decimal types: --- 65,71 ---- * @exception SQLException if a database-access error occurs. */ public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException ! {} /* * You must also specify the scale for numeric/decimal types: *************** *** 171,210 **** */ public void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException ! { ! registerOutParameter (parameterIndex, sqlType); // ignore for now.. ! } ! ! /* ! * override this method to check for set @ 1 when declared function.. ! * ! * @param paramIndex the index into the inString ! * @param s a string to be stored ! * @exception SQLException if something goes wrong ! */ ! protected void set(int paramIndex, String s) throws SQLException ! { ! if (paramIndex == 1 && isFunction) // need to registerOut instead ! throw new PSQLException ("postgresql.call.funcover"); ! super.set (paramIndex, s); // else set as usual.. ! } ! ! /* ! * Helper - this compiles the SQL query from the various parameters ! * This is identical to toString() except it throws an exception if a ! * parameter is unused. ! */ ! protected synchronized String compileQuery() ! throws SQLException ! { ! if (isFunction && !returnTypeSet) ! throw new PSQLException("postgresql.call.noreturntype"); ! if (isFunction) { // set entry 1 to dummy entry.. ! inStrings[0] = ""; // dummy entry which ensured that noone overrode ! // and calls to setXXX (2,..) really went to first arg in a function call.. ! } ! return super.compileQuery (); ! } // Old api? //public boolean isNull(int parameterIndex) throws SQLException { --- 82,88 ---- */ public void registerOutParameter(int parameterIndex, int sqlType, int scale) throws SQLException ! {} // Old api? //public boolean isNull(int parameterIndex) throws SQLException { *************** *** 223,229 **** public boolean wasNull() throws SQLException { // check to see if the last access threw an exception ! return (result == null); } // Old api? --- 101,107 ---- public boolean wasNull() throws SQLException { // check to see if the last access threw an exception ! return false; // fake it for now } // Old api? *************** *** 241,248 **** */ public String getString(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.VARCHAR, "String"); ! return (String)result; } //public String getVarChar(int parameterIndex) throws SQLException { // return null; --- 119,125 ---- */ public String getString(int parameterIndex) throws SQLException { ! return null; } //public String getVarChar(int parameterIndex) throws SQLException { // return null; *************** *** 261,269 **** */ public boolean getBoolean(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.BIT, "Boolean"); ! if (result == null) return false; ! return ((Boolean)result).booleanValue (); } /* --- 138,144 ---- */ public boolean getBoolean(int parameterIndex) throws SQLException { ! return false; } /* *************** *** 275,283 **** */ public byte getByte(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.TINYINT, "Byte"); ! if (result == null) return 0; ! return (byte)((Integer)result).intValue (); } /* --- 150,156 ---- */ public byte getByte(int parameterIndex) throws SQLException { ! return 0; } /* *************** *** 289,299 **** */ public short getShort(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.SMALLINT, "Short"); ! if (result == null) return 0; ! return (short)((Integer)result).intValue (); } - /* * Get the value of an INTEGER parameter as a Java int. --- 162,169 ---- */ public short getShort(int parameterIndex) throws SQLException { ! return 0; } /* * Get the value of an INTEGER parameter as a Java int. *************** *** 304,312 **** */ public int getInt(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.INTEGER, "Int"); ! if (result == null) return 0; ! return ((Integer)result).intValue (); } /* --- 174,180 ---- */ public int getInt(int parameterIndex) throws SQLException { ! return 0; } /* *************** *** 318,326 **** */ public long getLong(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.BIGINT, "Long"); ! if (result == null) return 0; ! return ((Long)result).longValue (); } /* --- 186,192 ---- */ public long getLong(int parameterIndex) throws SQLException { ! return 0; } /* *************** *** 332,340 **** */ public float getFloat(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.REAL, "Float"); ! if (result == null) return 0; ! return ((Float)result).floatValue (); } /* --- 198,204 ---- */ public float getFloat(int parameterIndex) throws SQLException { ! return (float) 0.0; } /* *************** *** 346,354 **** */ public double getDouble(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.DOUBLE, "Double"); ! if (result == null) return 0; ! return ((Double)result).doubleValue (); } /* --- 210,216 ---- */ public double getDouble(int parameterIndex) throws SQLException { ! return 0.0; } /* *************** *** 365,372 **** public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException { ! checkIndex (parameterIndex, Types.NUMERIC, "BigDecimal"); ! return ((BigDecimal)result); } /* --- 227,233 ---- public BigDecimal getBigDecimal(int parameterIndex, int scale) throws SQLException { ! return null; } /* *************** *** 379,386 **** */ public byte[] getBytes(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.VARBINARY, "Bytes"); ! return ((byte [])result); } // New API (JPM) (getLongVarBinary) --- 240,246 ---- */ public byte[] getBytes(int parameterIndex) throws SQLException { ! return null; } // New API (JPM) (getLongVarBinary) *************** *** 397,404 **** */ public java.sql.Date getDate(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.DATE, "Date"); ! return (java.sql.Date)result; } /* --- 257,263 ---- */ public java.sql.Date getDate(int parameterIndex) throws SQLException { ! return null; } /* *************** *** 410,417 **** */ public java.sql.Time getTime(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.TIME, "Time"); ! return (java.sql.Time)result; } /* --- 269,275 ---- */ public java.sql.Time getTime(int parameterIndex) throws SQLException { ! return null; } /* *************** *** 424,431 **** public java.sql.Timestamp getTimestamp(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.TIMESTAMP, "Timestamp"); ! return (java.sql.Timestamp)result; } //---------------------------------------------------------------------- --- 282,288 ---- public java.sql.Timestamp getTimestamp(int parameterIndex) throws SQLException { ! return null; } //---------------------------------------------------------------------- *************** *** 460,467 **** public Object getObject(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex); ! return result; } // ** JDBC 2 Extensions ** --- 317,323 ---- public Object getObject(int parameterIndex) throws SQLException { ! return null; } // ** JDBC 2 Extensions ** *************** *** 471,480 **** throw org.postgresql.Driver.notImplemented(); } ! public java.math.BigDecimal getBigDecimal(int parameterIndex) throws SQLException { ! checkIndex (parameterIndex, Types.NUMERIC, "BigDecimal"); ! return ((BigDecimal)result); } public Blob getBlob(int i) throws SQLException --- 327,335 ---- throw org.postgresql.Driver.notImplemented(); } ! public java.math.BigDecimal getBigDecimal(int i) throws SQLException { ! throw org.postgresql.Driver.notImplemented(); } public Blob getBlob(int i) throws SQLException *************** *** 512,587 **** throw org.postgresql.Driver.notImplemented(); } - // no custom types allowed yet.. public void registerOutParameter(int parameterIndex, int sqlType, String typeName) throws SQLException { throw org.postgresql.Driver.notImplemented(); } - - - /** helperfunction for the getXXX calls to check isFunction and index == 1 - */ - private void checkIndex (int parameterIndex, int type, String getName) - throws SQLException { - checkIndex (parameterIndex); - if (type != this.testReturn) - throw new PSQLException("postgresql.call.wrongget", - new Object[]{getSqlTypeName (testReturn), - getName, - getSqlTypeName (type)}); - } - /** helperfunction for the getXXX calls to check isFunction and index == 1 - * @param parameterIndex index of getXXX (index) - * check to make sure is a function and index == 1 - */ - private void checkIndex (int parameterIndex) throws SQLException { - if (!isFunction) - throw new PSQLException("postgresql.call.noreturntype"); - if (parameterIndex != 1) - throw new PSQLException("postgresql.call.noinout"); - } - - /** helper function for creating msg with type names - * @param sqlType a java.sql.Types.XX constant - * @return String which is the name of the constant.. - */ - private static String getSqlTypeName (int sqlType) { - switch (sqlType) - { - case Types.BIT: - return "BIT"; - case Types.SMALLINT: - return "SMALLINT"; - case Types.INTEGER: - return "INTEGER"; - case Types.BIGINT: - return "BIGINT"; - case Types.NUMERIC: - return "NUMERIC"; - case Types.REAL: - return "REAL"; - case Types.DOUBLE: - return "DOUBLE"; - case Types.FLOAT: - return "FLOAT"; - case Types.CHAR: - return "CHAR"; - case Types.VARCHAR: - return "VARCHAR"; - case Types.DATE: - return "DATE"; - case Types.TIME: - return "TIME"; - case Types.TIMESTAMP: - return "TIMESTAMP"; - case Types.BINARY: - return "BINARY"; - case Types.VARBINARY: - return "VARBINARY"; - default: - return "UNKNOWN"; - } - } } --- 367,376 ----