. */ /** * Doctrine_Sequence_Db2 * * @package Doctrine * @subpackage Sequence * @author Konsta Vesterinen * @license http://www.opensource.org/licenses/lgpl-license.php LGPL * @link www.doctrine-project.org * @since 1.0 * @version $Revision: 7490 $ */ class Doctrine_Sequence_Db2 extends Doctrine_Sequence { /** * Returns the next free id of a sequence * * @param string $seqName name of the sequence * @param bool when true missing sequences are automatic created * * @return integer next id in the given sequence * @throws Doctrine_Sequence_Exception */ public function nextId($seqName, $ondemand = true) { $sequenceName = $this->conn->quoteIdentifier($this->conn->formatter->getSequenceName($seqName), true); $query = 'SELECT NEXTVAL FOR ' . $sequenceName . ' AS VAL FROM SYSIBM.SYSDUMMY1'; try { $result = $this->conn->fetchOne($query); $result = ($result) ? $result['VAL'] : null; } catch(Doctrine_Connection_Exception $e) { if ($onDemand && $e->getPortableCode() == Doctrine_Core::ERR_NOSUCHTABLE) { try { $result = $this->conn->export->createSequence($seqName); } catch(Doctrine_Exception $e) { throw new Doctrine_Sequence_Exception('on demand sequence ' . $seqName . ' could not be created'); } return $this->nextId($seqName, false); } else { throw new Doctrine_Sequence_Exception('sequence ' .$seqName . ' does not exist'); } } return $result; } /** * Return the most recent value from the specified sequence in the database. * This is supported only on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2). Other RDBMS brands return null. * * @param string $sequenceName * @return integer * @throws Doctrine_Adapter_Db2_Exception */ public function currId($sequenceName) { $sql = 'SELECT PREVVAL FOR ' . $this->quoteIdentifier($this->conn->formatter->getSequenceName($sequenceName)) . ' AS VAL FROM SYSIBM.SYSDUMMY1'; $stmt = $this->query($sql); $result = $stmt->fetchAll(Doctrine_Core::FETCH_ASSOC); if ($result) { return $result[0]['VAL']; } else { return null; } } /** * Gets the last ID generated automatically by an IDENTITY/AUTOINCREMENT column. * * As a convention, on RDBMS brands that support sequences * (e.g. Oracle, PostgreSQL, DB2), this method forms the name of a sequence * from the arguments and returns the last id generated by that sequence. * On RDBMS brands that support IDENTITY/AUTOINCREMENT columns, this method * returns the last value generated for such a column, and the table name * argument is disregarded. * * The IDENTITY_VAL_LOCAL() function gives the last generated identity value * in the current process, even if it was for a GENERATED column. * * @param string $tableName OPTIONAL * @param string $primaryKey OPTIONAL * @return integer * @throws Doctrine_Adapter_Db2_Exception */ public function lastInsertId($tableName = null, $primaryKey = null) { $this->_connect(); if ($tableName !== null) { $sequenceName = $tableName; if ($primaryKey) { $sequenceName .= "_$primaryKey"; } $sequenceName .= '_seq'; return $this->lastSequenceId($sequenceName); } $sql = 'SELECT IDENTITY_VAL_LOCAL() AS VAL FROM SYSIBM.SYSDUMMY1'; $stmt = $this->query($sql); $result = $stmt->fetchAll(Doctrine_Core::FETCH_ASSOC); if ($result) { return $result[0]['VAL']; } else { return null; } } }