Author: wisneskid Date: Thu Jan 18 14:21:08 2007 New Revision: 497605 URL: http://svn.apache.org/viewvc?view=rev&rev=497605 Log: Support native queries making stored procedure calls, or insert, update, delete. For native queries returning ResultSet should use getResultList or getSingleResult interfaces on Query. For native queries performing updates without returning any results use executeUpdate interface on Query.
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java?view=diff&rev=497605&r1=497604&r2=497605 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/SQLStoreQuery.java Thu Jan 18 14:21:08 2007 @@ -43,6 +43,7 @@ import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.meta.ClassMetaData; import org.apache.openjpa.util.UserException; +import serp.util.Numbers; /** * A SQL query. @@ -158,6 +159,7 @@ private final ClassMetaData _meta; private final boolean _select; + private final boolean _call; // native call stored procedure private final QueryResultMapping _resultMapping; public SQLExecutor(SQLStoreQuery q, ClassMetaData candidate) { @@ -180,6 +182,63 @@ throw new UserException(_loc.get("no-sql")); _select = sql.length() > 6 && sql.substring(0, 6).equalsIgnoreCase("select"); + _call = sql.length() > 4 + && sql.substring(0, 4).equalsIgnoreCase("call"); + } + + public int getOperation(StoreQuery q) { + return _select ? OP_SELECT : + (q.getContext().getCandidateType() != null + || q.getContext().getResultType() != null + || q.getContext().getResultMappingName() != null + || q.getContext().getResultMappingScope() != null) + ? OP_SELECT : OP_UPDATE; + } + + public Number executeUpdate(StoreQuery q, Object[] params) { + JDBCStore store = ((SQLStoreQuery) q).getStore(); + DBDictionary dict = store.getDBDictionary(); + String sql = q.getContext().getQueryString(); + + List paramList; + if (params.length > 0) { + paramList = new ArrayList(Arrays.asList(params)); + try { + sql = substituteParams(sql, paramList); + } catch (IOException ioe) { + throw new UserException(ioe); + } + } else + paramList = Collections.EMPTY_LIST; + + SQLBuffer buf = new SQLBuffer(dict).append(sql); + Connection conn = store.getConnection(); + JDBCFetchConfiguration fetch = (JDBCFetchConfiguration) + q.getContext().getFetchConfiguration(); + + PreparedStatement stmnt = null; + try { + stmnt = buf.prepareCall(conn); + + int index = 0; + for (Iterator i = paramList.iterator(); i.hasNext();) + dict.setUnknown(stmnt, ++index, i.next(), null); + + int count = 0; + if (_call && stmnt.execute() == false) { + count = stmnt.getUpdateCount(); + } + else { + // native insert, update, delete + count = stmnt.executeUpdate(); + } + return Numbers.valueOf(count); + } catch (SQLException se) { + if (stmnt != null) + try { stmnt.close(); } catch (SQLException se2) {} + try { conn.close(); } catch (SQLException se2) {} + throw SQLExceptions.getStore(se, dict); + } } public ResultObjectProvider executeQuery(StoreQuery q,