You are here

public function Update::execute in Drupal 8

Same name in this branch
  1. 8 core/lib/Drupal/Core/Database/Query/Update.php \Drupal\Core\Database\Query\Update::execute()
  2. 8 core/lib/Drupal/Core/Database/Driver/pgsql/Update.php \Drupal\Core\Database\Driver\pgsql\Update::execute()
Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Database/Driver/pgsql/Update.php \Drupal\Core\Database\Driver\pgsql\Update::execute()

Executes the UPDATE query.

Return value

The number of rows matched by the update query. This includes rows that actually didn't have to be updated because the values didn't change.

Overrides Update::execute

File

core/lib/Drupal/Core/Database/Driver/pgsql/Update.php, line 14

Class

Update
PostgreSQL implementation of \Drupal\Core\Database\Query\Update.

Namespace

Drupal\Core\Database\Driver\pgsql

Code

public function execute() {
  $max_placeholder = 0;
  $blobs = [];
  $blob_count = 0;

  // Because we filter $fields the same way here and in __toString(), the
  // placeholders will all match up properly.
  $stmt = $this->connection
    ->prepareQuery((string) $this);

  // Fetch the list of blobs and sequences used on that table.
  $table_information = $this->connection
    ->schema()
    ->queryTableInformation($this->table);

  // Expressions take priority over literal fields, so we process those first
  // and remove any literal fields that conflict.
  $fields = $this->fields;
  foreach ($this->expressionFields as $field => $data) {
    if (!empty($data['arguments'])) {
      foreach ($data['arguments'] as $placeholder => $argument) {

        // We assume that an expression will never happen on a BLOB field,
        // which is a fairly safe assumption to make since in most cases
        // it would be an invalid query anyway.
        $stmt
          ->bindParam($placeholder, $data['arguments'][$placeholder]);
      }
    }
    if ($data['expression'] instanceof SelectInterface) {
      $data['expression']
        ->compile($this->connection, $this);
      $select_query_arguments = $data['expression']
        ->arguments();
      foreach ($select_query_arguments as $placeholder => $argument) {
        $stmt
          ->bindParam($placeholder, $select_query_arguments[$placeholder]);
      }
    }
    unset($fields[$field]);
  }
  foreach ($fields as $field => $value) {
    $placeholder = ':db_update_placeholder_' . $max_placeholder++;
    if (isset($table_information->blob_fields[$field])) {
      $blobs[$blob_count] = fopen('php://memory', 'a');
      fwrite($blobs[$blob_count], $value);
      rewind($blobs[$blob_count]);
      $stmt
        ->bindParam($placeholder, $blobs[$blob_count], \PDO::PARAM_LOB);
      ++$blob_count;
    }
    else {
      $stmt
        ->bindParam($placeholder, $fields[$field]);
    }
  }
  if (count($this->condition)) {
    $this->condition
      ->compile($this->connection, $this);
    $arguments = $this->condition
      ->arguments();
    foreach ($arguments as $placeholder => $value) {
      $stmt
        ->bindParam($placeholder, $arguments[$placeholder]);
    }
  }
  $options = $this->queryOptions;
  $options['already_prepared'] = TRUE;
  $options['return'] = Database::RETURN_AFFECTED;
  $this->connection
    ->addSavepoint();
  try {
    $result = $this->connection
      ->query($stmt, [], $options);
    $this->connection
      ->releaseSavepoint();
    return $result;
  } catch (\Exception $e) {
    $this->connection
      ->rollbackSavepoint();
    throw $e;
  }
}