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
File
- core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php, line 320
Class
- Connection
- PostgreSQL implementation of \Drupal\Core\Database\Connection.
Namespace
Drupal\Core\Database\Driver\pgsql
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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 ; } |
Please login to continue.