public function MergeQuery::execute

Runs the query against the database.

Overrides Query::execute

Archivo

drupal-7.x/includes/database/query.inc, line 1607
Non-specific Database query code. Used by all engines.

Class

MergeQuery
General class for an abstracted MERGE query operation.

Código

public function execute() {
  // Wrap multiple queries in a transaction, if the database supports it.
  $transaction = $this->connection->startTransaction();
  try {
    if (!count($this->condition)) {
      throw new InvalidMergeQueryException(t('Invalid merge query: no conditions'));
    }
    $select = $this->connection->select($this->conditionTable)->condition($this->condition)->forUpdate();
    $select->addExpression('1');
    if (!$select->execute()->fetchField()) {
      try {
        $insert = $this->connection->insert($this->table)->fields($this->insertFields);
        if ($this->defaultFields) {
          $insert->useDefaults($this->defaultFields);
        }
        $insert->execute();
        return MergeQuery::STATUS_INSERT;
      }
      catch (Exception $e) {
        // The insert query failed, maybe it's because a racing insert query
        // beat us in inserting the same row. Retry the select query, if it
        // returns a row, ignore the error and continue with the update
        // query below.
        if (!$select->execute()->fetchField()) {
          throw $e;
        }
      }
    }
    if ($this->needsUpdate) {
      $update = $this->connection->update($this->table)->fields($this->updateFields)->condition($this->condition);
      if ($this->expressionFields) {
        foreach ($this->expressionFields as $field => $data) {
          $update->expression($field, $data['expression'], $data['arguments']);
        }
      }
      $update->execute();
      return MergeQuery::STATUS_UPDATE;
    }
  }
  catch (Exception $e) {
    // Something really wrong happened here, bubble up the exception to the
    // caller.
    $transaction->rollback();
    throw $e;
  }
  // Transaction commits here where $transaction looses scope.
}