public Connection::nextId($existing= 0)
Retrieve a the next id in a sequence.
PostgreSQL has built in sequences. We'll use these instead of inserting and updating a sequences table.
Overrides Connection::nextId
public function nextId($existing = 0) { // Retrieve the name of the sequence. This information cannot be cached // because the prefix may change, for example, like it does in simpletests. $sequence_name = $this->makeSequenceName('sequences', 'value'); // When PostgreSQL gets a value too small then it will lock the table, // retry the INSERT and if it's still too small then alter the sequence. $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField(); if ($id > $existing) { return $id; } // PostgreSQL advisory locks are simply locks to be used by an // application such as Drupal. This will prevent other Drupal processes // from altering the sequence while we are. $this->query("SELECT pg_advisory_lock(" . self::POSTGRESQL_NEXTID_LOCK . ")"); // While waiting to obtain the lock, the sequence may have been altered // so lets try again to obtain an adequate value. $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField(); if ($id > $existing) { $this->query("SELECT pg_advisory_unlock(" . self::POSTGRESQL_NEXTID_LOCK . ")"); return $id; } // Reset the sequence to a higher value than the existing id. $this->query("ALTER SEQUENCE " . $sequence_name . " RESTART WITH " . ($existing + 1)); // Retrieve the next id. We know this will be as high as we want it. $id = $this->query("SELECT nextval('" . $sequence_name . "')")->fetchField(); $this->query("SELECT pg_advisory_unlock(" . self::POSTGRESQL_NEXTID_LOCK . ")"); return $id; }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Database!Driver!pgsql!Connection.php/function/Connection::nextId/8.1.x