<?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Db\TableGateway\Feature; use Zend\Db\Sql\Insert; use Zend\Db\Adapter\Driver\ResultInterface; use Zend\Db\Adapter\Driver\StatementInterface; class SequenceFeature extends AbstractFeature { /** * @var string */ protected $primaryKeyField; /** * @var string */ protected $sequenceName; /** * @var int */ protected $sequenceValue; /** * @param string $primaryKeyField * @param string $sequenceName */ public function __construct($primaryKeyField, $sequenceName) { $this->primaryKeyField = $primaryKeyField; $this->sequenceName = $sequenceName; } /** * @param Insert $insert */ public function preInsert(Insert $insert) { $columns = $insert->getRawState('columns'); $values = $insert->getRawState('values'); $key = array_search($this->primaryKeyField, $columns); if ($key !== false) { $this->sequenceValue = $values[$key]; return $insert; } $this->sequenceValue = $this->nextSequenceId(); if ($this->sequenceValue === null) { return $insert; } $insert->values(array($this->primaryKeyField => $this->sequenceValue), Insert::VALUES_MERGE); return $insert; } public function postInsert(StatementInterface $statement, ResultInterface $result) { if ($this->sequenceValue !== null) { $this->tableGateway->lastInsertValue = $this->sequenceValue; } } /** * Generate a new value from the specified sequence in the database, and return it. * @return int */ public function nextSequenceId() { $platform = $this->tableGateway->adapter->getPlatform(); $platformName = $platform->getName(); switch ($platformName) { case 'Oracle': $sql = 'SELECT ' . $platform->quoteIdentifier($this->sequenceName) . '.NEXTVAL FROM dual'; break; case 'PostgreSQL': $sql = 'SELECT NEXTVAL(\'' . $this->sequenceName . '\')'; break; default : return null; } $statement = $this->tableGateway->adapter->createStatement(); $statement->prepare($sql); $result = $statement->execute(); $sequence = $result->current(); unset($statement, $result); return $sequence['nextval']; } /** * Return the most recent value from the specified sequence in the database. * @return int */ public function lastSequenceId() { $platform = $this->tableGateway->adapter->getPlatform(); $platformName = $platform->getName(); switch ($platformName) { case 'Oracle': $sql = 'SELECT ' . $platform->quoteIdentifier($this->sequenceName) . '.CURRVAL FROM dual'; break; case 'PostgreSQL': $sql = 'SELECT CURRVAL(\'' . $this->sequenceName . '\')'; break; default : return null; } $statement = $this->tableGateway->adapter->createStatement(); $statement->prepare($sql); $result = $statement->execute(); $sequence = $result->current(); unset($statement, $result); return $sequence['currval']; } }