You are here

public function Connection::nextId in Drupal driver for SQL Server and SQL Azure 8

Same name and namespace in other branches
  1. 8.2 drivers/lib/Drupal/Driver/Database/sqlsrv/Connection.php \Drupal\Driver\Database\sqlsrv\Connection::nextId()
  2. 3.0.x drivers/lib/Drupal/Driver/Database/sqlsrv/Connection.php \Drupal\Driver\Database\sqlsrv\Connection::nextId()

Override of DatabaseConnection::nextId().

@status tested

Overrides Connection::nextId

File

drivers/lib/Drupal/Driver/Database/sqlsrv/Connection.php, line 759
Definition of Drupal\Driver\Database\sqlsrv\Connection

Class

Connection
Temporary tables: temporary table support is done by means of global temporary tables (#) to avoid the use of DIRECT QUERIES. You can enable and disable the use of direct queries with $this->driver_settings->defaultDirectQuery =…

Namespace

Drupal\Driver\Database\sqlsrv

Code

public function nextId($existing = 0) {

  // If an exiting value is passed, for its insertion into the sequence table.
  if ($existing > 0) {
    try {
      $this
        ->query_direct('SET IDENTITY_INSERT {sequences} ON; INSERT INTO {sequences} (value) VALUES(:existing); SET IDENTITY_INSERT {sequences} OFF', array(
        ':existing' => $existing,
      ));
    } catch (Exception $e) {

      // Doesn't matter if this fails, it just means that this value is already
      // present in the table.
    }
  }

  // Refactored to use OUTPUT because under high concurrency LAST_INSERTED_ID does not work properly.
  return $this
    ->query_direct('INSERT INTO {sequences} OUTPUT (Inserted.[value]) DEFAULT VALUES')
    ->fetchField();
}