public Integer command(final String type, Map<String, Object> params, Connection con) throws ResourceException { Integer result = null; params.put(ServerConstants.RESOURCE_NAME, type); String queryExpression = (String) params.get("commandExpression"); String queryId = (String) params.get("commandId"); if (queryId == null && queryExpression == null) { throw new BadRequestException( "Either " + "commandId" + " or " + "commandExpression" + " to identify/define a query must be passed in the parameters. " + params); } final PreparedStatement foundQuery; try { if (queryExpression != null) { foundQuery = resolveInlineQuery(con, queryExpression, params); } else if (commands.queryIdExists(queryId)) { foundQuery = commands.getQuery(con, queryId, type, params); } else { throw new BadRequestException( "The passed command identifier " + queryId + " does not match any configured commands on the JDBC repository service."); } } catch (SQLException ex) { throw new InternalServerErrorException( "DB reported failure preparing command: " + (queryExpression != null ? queryExpression : commands.getQueryInfo(queryId).getQueryString()) + " with params: " + params + " error code: " + ex.getErrorCode() + " sqlstate: " + ex.getSQLState() + " message: " + ex.getMessage(), ex); } Name eventName = getEventName(queryId); EventEntry measure = Publisher.start(eventName, foundQuery, null); ResultSet rs = null; try { result = foundQuery.executeUpdate(); measure.setResult(result); } catch (SQLException ex) { throw new InternalServerErrorException( "DB reported failure executing query " + foundQuery.toString() + " with params: " + params + " error code: " + ex.getErrorCode() + " sqlstate: " + ex.getSQLState() + " message: " + ex.getMessage(), ex); } finally { CleanupHelper.loggedClose(rs); CleanupHelper.loggedClose(foundQuery); measure.end(); } return result; }
/** * Execute a query, either a pre-configured query by using the query ID, or a query expression * passed as part of the params. * * <p>The keys for the input parameters as well as the return map entries are in QueryConstants. * * @param type the resource component name targeted by the URI * @param params the parameters which include the query id, or the query expression, as well as * the token key/value pairs to replace in the query * @param con a handle to a database connection newBuilder for exclusive use by the query method * whilst it is executing. * @return The query result, which includes meta-data about the query, and the result set itself. * @throws BadRequestException if the passed request parameters are invalid, e.g. missing query id * or query expression or tokens. * @throws InternalServerErrorException if the preparing or executing the query fails because of * configuration or DB issues */ public List<Map<String, Object>> query( final String type, Map<String, Object> params, Connection con) throws ResourceException { List<Map<String, Object>> result = null; params.put(ServerConstants.RESOURCE_NAME, type); // If paged results are requested then decode the cookie in order to determine // the index of the first result to be returned. final int requestPageSize = (Integer) params.get(PAGE_SIZE); final String offsetParam; final String pageSizeParam; if (requestPageSize > 0) { offsetParam = String.valueOf((Integer) params.get(PAGED_RESULTS_OFFSET)); pageSizeParam = String.valueOf(requestPageSize); } else { offsetParam = "0"; pageSizeParam = String.valueOf(Integer.MAX_VALUE); } params.put(PAGED_RESULTS_OFFSET, offsetParam); params.put(PAGE_SIZE, pageSizeParam); QueryFilter queryFilter = (QueryFilter) params.get(QUERY_FILTER); String queryExpression = (String) params.get(QUERY_EXPRESSION); String queryId = (String) params.get(QUERY_ID); if (queryId == null && queryExpression == null && queryFilter == null) { throw new BadRequestException( "Either " + QUERY_ID + ", " + QUERY_EXPRESSION + ", or " + QUERY_FILTER + " to identify/define a query must be passed in the parameters. " + params); } logger.debug("Querying " + params); final PreparedStatement foundQuery; try { if (queryFilter != null) { foundQuery = parseQueryFilter(con, queryFilter, params); } else if (queryExpression != null) { foundQuery = resolveInlineQuery(con, queryExpression, params); } else if (queries.queryIdExists(queryId)) { foundQuery = queries.getQuery(con, queryId, type, params); } else { throw new BadRequestException( "The passed query identifier " + queryId + " does not match any configured queries on the JDBC repository service."); } } catch (SQLException ex) { final String queryDescription; if (queryFilter != null) { queryDescription = queryFilter.toString(); } else if (queryExpression != null) { queryDescription = queryExpression; } else { queryDescription = queries.getQueryInfo(queryId).getQueryString(); } throw new InternalServerErrorException( "DB reported failure preparing query: " + queryDescription + " with params: " + params + " error code: " + ex.getErrorCode() + " sqlstate: " + ex.getSQLState() + " message: " + ex.getMessage(), ex); } Name eventName = getEventName(queryId); EventEntry measure = Publisher.start(eventName, foundQuery, null); ResultSet rs = null; try { rs = foundQuery.executeQuery(); result = resultMapper.mapQueryToObject(rs, queryId, type, params, this); measure.setResult(result); } catch (SQLException ex) { throw new InternalServerErrorException( "DB reported failure executing query " + foundQuery.toString() + " with params: " + params + " error code: " + ex.getErrorCode() + " sqlstate: " + ex.getSQLState() + " message: " + ex.getMessage(), ex); } catch (IOException ex) { throw new InternalServerErrorException( "Failed to convert result objects for query " + foundQuery.toString() + " with params: " + params + " message: " + ex.getMessage(), ex); } finally { CleanupHelper.loggedClose(rs); CleanupHelper.loggedClose(foundQuery); measure.end(); } return result; }