- <?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;
-
- use Zend\Db\Adapter\AdapterInterface;
- use Zend\Db\ResultSet\ResultSet;
- use Zend\Db\ResultSet\ResultSetInterface;
- use Zend\Db\Sql\Delete;
- use Zend\Db\Sql\Insert;
- use Zend\Db\Sql\Select;
- use Zend\Db\Sql\Sql;
- use Zend\Db\Sql\TableIdentifier;
- use Zend\Db\Sql\Update;
- use Zend\Db\Sql\Where;
-
- /**
- *
- * @property AdapterInterface $adapter
- * @property int $lastInsertValue
- * @property string $table
- */
- abstract class AbstractTableGateway implements TableGatewayInterface
- {
-
- /**
- * @var bool
- */
- protected $isInitialized = false;
-
- /**
- * @var AdapterInterface
- */
- protected $adapter = null;
-
- /**
- * @var string
- */
- protected $table = null;
-
- /**
- * @var array
- */
- protected $columns = array();
-
- /**
- * @var Feature\FeatureSet
- */
- protected $featureSet = null;
-
- /**
- * @var ResultSetInterface
- */
- protected $resultSetPrototype = null;
-
- /**
- * @var Sql
- */
- protected $sql = null;
-
- /**
- *
- * @var int
- */
- protected $lastInsertValue = null;
-
- /**
- * @return bool
- */
- public function isInitialized()
- {
- return $this->isInitialized;
- }
-
- /**
- * Initialize
- *
- * @throws Exception\RuntimeException
- * @return null
- */
- public function initialize()
- {
- if ($this->isInitialized) {
- return;
- }
-
- if (!$this->featureSet instanceof Feature\FeatureSet) {
- $this->featureSet = new Feature\FeatureSet;
- }
-
- $this->featureSet->setTableGateway($this);
- $this->featureSet->apply('preInitialize', array());
-
- if (!$this->adapter instanceof AdapterInterface) {
- throw new Exception\RuntimeException('This table does not have an Adapter setup');
- }
-
- if (!is_string($this->table) && !$this->table instanceof TableIdentifier) {
- throw new Exception\RuntimeException('This table object does not have a valid table set.');
- }
-
- if (!$this->resultSetPrototype instanceof ResultSetInterface) {
- $this->resultSetPrototype = new ResultSet;
- }
-
- if (!$this->sql instanceof Sql) {
- $this->sql = new Sql($this->adapter, $this->table);
- }
-
- $this->featureSet->apply('postInitialize', array());
-
- $this->isInitialized = true;
- }
-
- /**
- * Get table name
- *
- * @return string
- */
- public function getTable()
- {
- return $this->table;
- }
-
- /**
- * Get adapter
- *
- * @return AdapterInterface
- */
- public function getAdapter()
- {
- return $this->adapter;
- }
-
- /**
- * @return array
- */
- public function getColumns()
- {
- return $this->columns;
- }
-
- /**
- * @return Feature\FeatureSet
- */
- public function getFeatureSet()
- {
- return $this->featureSet;
- }
-
- /**
- * Get select result prototype
- *
- * @return ResultSet
- */
- public function getResultSetPrototype()
- {
- return $this->resultSetPrototype;
- }
-
- /**
- * @return Sql
- */
- public function getSql()
- {
- return $this->sql;
- }
-
- /**
- * Select
- *
- * @param Where|\Closure|string|array $where
- * @return ResultSet
- */
- public function select($where = null)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
-
- $select = $this->sql->select();
-
- if ($where instanceof \Closure) {
- $where($select);
- } elseif ($where !== null) {
- $select->where($where);
- }
-
- return $this->selectWith($select);
- }
-
- /**
- * @param Select $select
- * @return null|ResultSetInterface
- * @throws \RuntimeException
- */
- public function selectWith(Select $select)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- return $this->executeSelect($select);
- }
-
- /**
- * @param Select $select
- * @return ResultSet
- * @throws Exception\RuntimeException
- */
- protected function executeSelect(Select $select)
- {
- $selectState = $select->getRawState();
- if ($selectState['table'] != $this->table) {
- throw new Exception\RuntimeException('The table name of the provided select object must match that of the table');
- }
-
- if ($selectState['columns'] == array(Select::SQL_STAR)
- && $this->columns !== array()) {
- $select->columns($this->columns);
- }
-
- // apply preSelect features
- $this->featureSet->apply('preSelect', array($select));
-
- // prepare and execute
- $statement = $this->sql->prepareStatementForSqlObject($select);
- $result = $statement->execute();
-
- // build result set
- $resultSet = clone $this->resultSetPrototype;
- $resultSet->initialize($result);
-
- // apply postSelect features
- $this->featureSet->apply('postSelect', array($statement, $result, $resultSet));
-
- return $resultSet;
- }
-
- /**
- * Insert
- *
- * @param array $set
- * @return int
- */
- public function insert($set)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- $insert = $this->sql->insert();
- $insert->values($set);
- return $this->executeInsert($insert);
- }
-
- /**
- * @param Insert $insert
- * @return mixed
- */
- public function insertWith(Insert $insert)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- return $this->executeInsert($insert);
- }
-
- /**
- * @todo add $columns support
- *
- * @param Insert $insert
- * @return mixed
- * @throws Exception\RuntimeException
- */
- protected function executeInsert(Insert $insert)
- {
- $insertState = $insert->getRawState();
- if ($insertState['table'] != $this->table) {
- throw new Exception\RuntimeException('The table name of the provided Insert object must match that of the table');
- }
-
- // apply preInsert features
- $this->featureSet->apply('preInsert', array($insert));
-
- $statement = $this->sql->prepareStatementForSqlObject($insert);
- $result = $statement->execute();
- $this->lastInsertValue = $this->adapter->getDriver()->getConnection()->getLastGeneratedValue();
-
- // apply postInsert features
- $this->featureSet->apply('postInsert', array($statement, $result));
-
- return $result->getAffectedRows();
- }
-
- /**
- * Update
- *
- * @param array $set
- * @param string|array|closure $where
- * @return int
- */
- public function update($set, $where = null)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- $sql = $this->sql;
- $update = $sql->update();
- $update->set($set);
- if ($where !== null) {
- $update->where($where);
- }
- return $this->executeUpdate($update);
- }
-
- /**
- * @param \Zend\Db\Sql\Update $update
- * @return mixed
- */
- public function updateWith(Update $update)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- return $this->executeUpdate($update);
- }
-
- /**
- * @todo add $columns support
- *
- * @param Update $update
- * @return mixed
- * @throws Exception\RuntimeException
- */
- protected function executeUpdate(Update $update)
- {
- $updateState = $update->getRawState();
- if ($updateState['table'] != $this->table) {
- throw new Exception\RuntimeException('The table name of the provided Update object must match that of the table');
- }
-
- // apply preUpdate features
- $this->featureSet->apply('preUpdate', array($update));
-
- $statement = $this->sql->prepareStatementForSqlObject($update);
- $result = $statement->execute();
-
- // apply postUpdate features
- $this->featureSet->apply('postUpdate', array($statement, $result));
-
- return $result->getAffectedRows();
- }
-
- /**
- * Delete
- *
- * @param Where|\Closure|string|array $where
- * @return int
- */
- public function delete($where)
- {
- if (!$this->isInitialized) {
- $this->initialize();
- }
- $delete = $this->sql->delete();
- if ($where instanceof \Closure) {
- $where($delete);
- } else {
- $delete->where($where);
- }
- return $this->executeDelete($delete);
- }
-
- /**
- * @param Delete $delete
- * @return mixed
- */
- public function deleteWith(Delete $delete)
- {
- $this->initialize();
- return $this->executeDelete($delete);
- }
-
- /**
- * @todo add $columns support
- *
- * @param Delete $delete
- * @return mixed
- * @throws Exception\RuntimeException
- */
- protected function executeDelete(Delete $delete)
- {
- $deleteState = $delete->getRawState();
- if ($deleteState['table'] != $this->table) {
- throw new Exception\RuntimeException('The table name of the provided Update object must match that of the table');
- }
-
- // pre delete update
- $this->featureSet->apply('preDelete', array($delete));
-
- $statement = $this->sql->prepareStatementForSqlObject($delete);
- $result = $statement->execute();
-
- // apply postDelete features
- $this->featureSet->apply('postDelete', array($statement, $result));
-
- return $result->getAffectedRows();
- }
-
- /**
- * Get last insert value
- *
- * @return int
- */
- public function getLastInsertValue()
- {
- return $this->lastInsertValue;
- }
-
- /**
- * __get
- *
- * @param string $property
- * @throws Exception\InvalidArgumentException
- * @return mixed
- */
- public function __get($property)
- {
- switch (strtolower($property)) {
- case 'lastinsertvalue':
- return $this->lastInsertValue;
- case 'adapter':
- return $this->adapter;
- case 'table':
- return $this->table;
- }
- if ($this->featureSet->canCallMagicGet($property)) {
- return $this->featureSet->callMagicGet($property);
- }
- throw new Exception\InvalidArgumentException('Invalid magic property access in ' . __CLASS__ . '::__get()');
- }
-
- /**
- * @param string $property
- * @param mixed $value
- * @return mixed
- * @throws Exception\InvalidArgumentException
- */
- public function __set($property, $value)
- {
- if ($this->featureSet->canCallMagicSet($property)) {
- return $this->featureSet->callMagicSet($property, $value);
- }
- throw new Exception\InvalidArgumentException('Invalid magic property access in ' . __CLASS__ . '::__set()');
- }
-
- /**
- * @param $method
- * @param $arguments
- * @return mixed
- * @throws Exception\InvalidArgumentException
- */
- public function __call($method, $arguments)
- {
- if ($this->featureSet->canCallMagicCall($method)) {
- return $this->featureSet->callMagicCall($method, $arguments);
- }
- throw new Exception\InvalidArgumentException('Invalid method (' . $method . ') called, caught by ' . __CLASS__ . '::__call()');
- }
-
- /**
- * __clone
- */
- public function __clone()
- {
- $this->resultSetPrototype = (isset($this->resultSetPrototype)) ? clone $this->resultSetPrototype : null;
- $this->sql = clone $this->sql;
- if (is_object($this->table)) {
- $this->table = clone $this->table;
- }
- }
-
- }
# |
Change |
User |
Description |
Committed |
|
#1
|
18334 |
Liz Lam |
initial add of jambox |
9 years ago
|
|