예제 #1
0
  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;
  }
예제 #2
0
  /**
   * 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;
  }