public function execute() { if (!count($this->condition)) { throw new InvalidMergeQueryException(t('Invalid merge query: no conditions')); } // Keep a reference to the blobs. $blobs = array(); // Fetch the list of blobs and sequences used on that table. $columnInformation = $this->connection->schema()->queryColumnInformation($this->table); // Find out if there is an identity field set in this insert. $this->setIdentity = !empty($columnInformation['identity']) && in_array($columnInformation['identity'], array_keys($this->insertFields)); // Initialize placeholder count. $max_placeholder = 0; // Build the query. $stmt = $this->connection->prepareQuery((string)$this); // Build the arguments: 1. condition. $arguments = $this->condition->arguments(); DatabaseUtils::BindArguments($stmt, $arguments); // 2. When matched part. $fields = $this->updateFields; DatabaseUtils::BindExpressions($stmt, $this->expressionFields, $fields); DatabaseUtils::BindValues($stmt, $fields, $blobs, ':db_merge_placeholder_', $columnInformation, $max_placeholder); // 3. When not matched part. DatabaseUtils::BindValues($stmt, $this->insertFields, $blobs, ':db_merge_placeholder_', $columnInformation, $max_placeholder); // 4. Run the query, this will return UPDATE or INSERT $stmt->execute(); $result = NULL; foreach ($stmt as $value) { $result = $value->{'$action'}; } switch($result) { case 'UPDATE': return static::STATUS_UPDATE; case 'INSERT': return static::STATUS_INSERT; default: throw new InvalidMergeQueryException(t('Invalid merge query: no results.')); } }
public function execute() { // Fetch the list of blobs and sequences used on that table. $columnInformation = $this->connection->schema()->queryColumnInformation($this->table); // MySQL is a pretty s**t that swallows everything thrown at it, // like trying to update an identity field... if (isset($columnInformation['identity']) && isset($this->fields[$columnInformation['identity']])) { unset($this->fields[$columnInformation['identity']]); } // Because we filter $fields the same way here and in __toString(), the // placeholders will all match up properly. $stmt = $this->connection->prepareQuery((string)$this); // Expressions take priority over literal fields, so we process those first // and remove any literal fields that conflict. $fields = $this->fields; DatabaseUtils::BindExpressions($stmt, $this->expressionFields, $fields); // We use this array to store references to the blob handles. // This is necessary because the PDO will otherwise messes up with references. $blobs = array(); DatabaseUtils::BindValues($stmt, $fields, $blobs, ':db_update_placeholder_', $columnInformation); // Add conditions. if (count($this->condition)) { $this->condition->compile($this->connection, $this); $arguments = $this->condition->arguments(); DatabaseUtils::BindArguments($stmt, $arguments); } $options = $this->queryOptions; $options['already_prepared'] = TRUE; $stmt->execute(); return $stmt->rowCount(); }