You are here

function services_resource_build_index_query in Services 6.3

Same name and namespace in other branches
  1. 7.3 services.module \services_resource_build_index_query()

Helper function to build index queries.

Parameters

$query: Object database query object.

$page: Integer page number we are requesting.

$fields: Array fields to return.

$service_params: Array parameters to add to the index query.

$page_size: Integer number of items to be returned.

$resource: String name of the resource building the index query

6 calls to services_resource_build_index_query()
_comment_resource_index in resources/comment_resource.inc
Return an array of optionally paged cids baed on a set of criteria.
_file_resource_index in resources/file_resource.inc
Return an array of optionally paged fids baed on a set of criteria.
_node_resource_index in resources/node_resource.inc
Return an array of optionally paged nids baed on a set of criteria.
_taxonomy_term_resource_index in resources/taxonomy_resource.inc
Return an array of optionally paged tids baed on a set of criteria.
_taxonomy_vocabulary_resource_index in resources/taxonomy_resource.inc
Return an array of optionally paged vids baed on a set of criteria.

... See full list

File

./services.module, line 507
Provides a generic but powerful API for web services.

Code

function services_resource_build_index_query($schema, $order, $page, $fields, $service_params = array(), $primary_table, $primary_field, $page_size, $resource) {
  $where = array();
  $query_params = array();
  $fields = db_escape_string($fields);

  // need to append table prefix
  if ($fields_array = explode(',', $fields)) {
    foreach ($fields_array as &$field) {
      $field = $primary_table . '.' . trim($field);
    }
    $fields = implode(',', $fields_array);
  }
  $schema = db_escape_string($schema);
  $table = $schema;
  $schema = drupal_get_schema($schema);

  // Build an array of fields with the appropriate placeholders for use in
  // db_query().
  if (is_array($service_params)) {
    foreach ($service_params as $param_field => $param_value) {
      if (!$schema['fields'][$param_field]) {
        services_error('Parameter "' . $param_field . '" is not valid.');
      }
      $in_placeholders = array();
      foreach (services_str_getcsv($param_value) as $single_value) {
        $in_placeholders[] = db_type_placeholder($schema['fields'][$param_field]['type']);
        $query_params[] = $single_value;
      }
      $where[] = $primary_table . '.' . $param_field . ' IN (' . implode(',', $in_placeholders) . ')';
    }
  }

  // Now implode that array into an actual WHERE clause.
  $where = !empty($where) ? ' WHERE ' . implode(' AND ', $where) : '';

  // Apply page size limits.
  $default_limit = variable_get("services_{$resource}_index_page_size", 20);
  if (!user_access('perform unlimited index queries') && $page_size > $default_limit) {
    $page_size = $default_limit;
  }

  // Run through db_rewrite_sql to make sure proper access checks are applied.
  $sql = "SELECT {$fields} FROM {{$table}} AS {$primary_table} {$where} ORDER BY {$order}";
  $sql = db_rewrite_sql($sql, $primary_table, $primary_field);
  $result = db_query_range($sql, $query_params, $page * $page_size, $page_size);
  return $result;
}