mirror of
https://github.com/torrentpier/torrentpier-lts.git
synced 2025-03-01 15:21:02 +03:00
134 lines
3.8 KiB
PHP
134 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* Zend Framework (http://framework.zend.com/)
|
|
*
|
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
|
* @copyright Copyright (c) 2005-2015 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
|
|
* @return 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;
|
|
}
|
|
|
|
/**
|
|
* @param StatementInterface $statement
|
|
* @param ResultInterface $result
|
|
*/
|
|
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 as "nextval" FROM dual';
|
|
break;
|
|
case 'PostgreSQL':
|
|
$sql = 'SELECT NEXTVAL(\'"' . $this->sequenceName . '"\')';
|
|
break;
|
|
default :
|
|
return;
|
|
}
|
|
|
|
$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 as "currval" FROM dual';
|
|
break;
|
|
case 'PostgreSQL':
|
|
$sql = 'SELECT CURRVAL(\'' . $this->sequenceName . '\')';
|
|
break;
|
|
default :
|
|
return;
|
|
}
|
|
|
|
$statement = $this->tableGateway->adapter->createStatement();
|
|
$statement->prepare($sql);
|
|
$result = $statement->execute();
|
|
$sequence = $result->current();
|
|
unset($statement, $result);
|
|
return $sequence['currval'];
|
|
}
|
|
}
|