You are here

public function Connection::nextId in Drupal 10

Same name in this branch
  1. 10 core/tests/fixtures/database_drivers/custom/fake/Connection.php \Drupal\Driver\Database\fake\Connection::nextId()
  2. 10 core/modules/sqlite/src/Driver/Database/sqlite/Connection.php \Drupal\sqlite\Driver\Database\sqlite\Connection::nextId()
  3. 10 core/modules/pgsql/src/Driver/Database/pgsql/Connection.php \Drupal\pgsql\Driver\Database\pgsql\Connection::nextId()
  4. 10 core/modules/mysql/src/Driver/Database/mysql/Connection.php \Drupal\mysql\Driver\Database\mysql\Connection::nextId()

File

core/modules/sqlite/src/Driver/Database/sqlite/Connection.php, line 401

Class

Connection
SQLite implementation of \Drupal\Core\Database\Connection.

Namespace

Drupal\sqlite\Driver\Database\sqlite

Code

public function nextId($existing_id = 0) {
  $this
    ->startTransaction();

  // We can safely use literal queries here instead of the slower query
  // builder because if a given database breaks here then it can simply
  // override nextId. However, this is unlikely as we deal with short strings
  // and integers and no known databases require special handling for those
  // simple cases. If another transaction wants to write the same row, it will
  // wait until this transaction commits.
  $stmt = $this
    ->prepareStatement('UPDATE {sequences} SET [value] = GREATEST([value], :existing_id) + 1', [], TRUE);
  $args = [
    ':existing_id' => $existing_id,
  ];
  try {
    $stmt
      ->execute($args);
  } catch (\Exception $e) {
    $this
      ->exceptionHandler()
      ->handleExecutionException($e, $stmt, $args, []);
  }
  if ($stmt
    ->rowCount() === 0) {
    $this
      ->query('INSERT INTO {sequences} ([value]) VALUES (:existing_id + 1)', $args);
  }

  // The transaction gets committed when the transaction object gets destroyed
  // because it gets out of scope.
  return $this
    ->query('SELECT [value] FROM {sequences}')
    ->fetchField();
}