| <?php |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| abstract class Zend_Db_Table_Abstract |
| { |
|
|
| const ADAPTER = 'db'; |
| const DEFINITION = 'definition'; |
| const DEFINITION_CONFIG_NAME = 'definitionConfigName'; |
| const SCHEMA = 'schema'; |
| const NAME = 'name'; |
| const PRIMARY = 'primary'; |
| const COLS = 'cols'; |
| const METADATA = 'metadata'; |
| const METADATA_CACHE = 'metadataCache'; |
| const METADATA_CACHE_IN_CLASS = 'metadataCacheInClass'; |
| const ROW_CLASS = 'rowClass'; |
| const ROWSET_CLASS = 'rowsetClass'; |
| const REFERENCE_MAP = 'referenceMap'; |
| const DEPENDENT_TABLES = 'dependentTables'; |
| const SEQUENCE = 'sequence'; |
|
|
| const COLUMNS = 'columns'; |
| const REF_TABLE_CLASS = 'refTableClass'; |
| const REF_COLUMNS = 'refColumns'; |
| const ON_DELETE = 'onDelete'; |
| const ON_UPDATE = 'onUpdate'; |
|
|
| const CASCADE = 'cascade'; |
| const RESTRICT = 'restrict'; |
| const SET_NULL = 'setNull'; |
|
|
| const DEFAULT_NONE = 'defaultNone'; |
| const DEFAULT_CLASS = 'defaultClass'; |
| const DEFAULT_DB = 'defaultDb'; |
|
|
| const SELECT_WITH_FROM_PART = true; |
| const SELECT_WITHOUT_FROM_PART = false; |
|
|
| |
| |
| |
| |
| |
| protected static $_defaultDb; |
|
|
| |
| |
| |
| |
| |
| protected $_definition = null; |
|
|
| |
| |
| |
| |
| |
| protected $_definitionConfigName = null; |
|
|
| |
| |
| |
| |
| |
| protected static $_defaultMetadataCache = null; |
|
|
| |
| |
| |
| |
| |
| protected $_db; |
|
|
| |
| |
| |
| |
| |
| protected $_schema = null; |
|
|
| |
| |
| |
| |
| |
| protected $_name = null; |
|
|
| |
| |
| |
| |
| |
| protected $_cols; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| protected $_primary = null; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected $_identity = 1; |
|
|
| |
| |
| |
| |
| |
| |
| protected $_sequence = true; |
|
|
| |
| |
| |
| |
| |
| protected $_metadata = array(); |
|
|
| |
| |
| |
| |
| |
| protected $_metadataCache = null; |
|
|
| |
| |
| |
| |
| protected $_metadataCacheInClass = true; |
|
|
| |
| |
| |
| |
| |
| protected $_rowClass = 'Zend_Db_Table_Row'; |
|
|
| |
| |
| |
| |
| |
| protected $_rowsetClass = 'Zend_Db_Table_Rowset'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected $_referenceMap = array(); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| protected $_dependentTables = array(); |
|
|
|
|
| protected $_defaultSource = self::DEFAULT_NONE; |
| protected $_defaultValues = array(); |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function __construct($config = array()) |
| { |
| |
| |
| |
| if (!is_array($config)) { |
| $config = array(self::ADAPTER => $config); |
| } |
|
|
| if ($config) { |
| $this->setOptions($config); |
| } |
|
|
| $this->_setup(); |
| $this->init(); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function setOptions(Array $options) |
| { |
| foreach ($options as $key => $value) { |
| switch ($key) { |
| case self::ADAPTER: |
| $this->_setAdapter($value); |
| break; |
| case self::DEFINITION: |
| $this->setDefinition($value); |
| break; |
| case self::DEFINITION_CONFIG_NAME: |
| $this->setDefinitionConfigName($value); |
| break; |
| case self::SCHEMA: |
| $this->_schema = (string) $value; |
| break; |
| case self::NAME: |
| $this->_name = (string) $value; |
| break; |
| case self::PRIMARY: |
| $this->_primary = (array) $value; |
| break; |
| case self::ROW_CLASS: |
| $this->setRowClass($value); |
| break; |
| case self::ROWSET_CLASS: |
| $this->setRowsetClass($value); |
| break; |
| case self::REFERENCE_MAP: |
| $this->setReferences($value); |
| break; |
| case self::DEPENDENT_TABLES: |
| $this->setDependentTables($value); |
| break; |
| case self::METADATA_CACHE: |
| $this->_setMetadataCache($value); |
| break; |
| case self::METADATA_CACHE_IN_CLASS: |
| $this->setMetadataCacheInClass($value); |
| break; |
| case self::SEQUENCE: |
| $this->_setSequence($value); |
| break; |
| default: |
| |
| break; |
| } |
| } |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function setDefinition(Zend_Db_Table_Definition $definition) |
| { |
| $this->_definition = $definition; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getDefinition() |
| { |
| return $this->_definition; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function setDefinitionConfigName($definitionConfigName) |
| { |
| $this->_definitionConfigName = $definitionConfigName; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getDefinitionConfigName() |
| { |
| return $this->_definitionConfigName; |
| } |
|
|
| |
| |
| |
| |
| public function setRowClass($classname) |
| { |
| $this->_rowClass = (string) $classname; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| public function getRowClass() |
| { |
| return $this->_rowClass; |
| } |
|
|
| |
| |
| |
| |
| public function setRowsetClass($classname) |
| { |
| $this->_rowsetClass = (string) $classname; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| public function getRowsetClass() |
| { |
| return $this->_rowsetClass; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function addReference($ruleKey, $columns, $refTableClass, $refColumns, |
| $onDelete = null, $onUpdate = null) |
| { |
| $reference = array(self::COLUMNS => (array) $columns, |
| self::REF_TABLE_CLASS => $refTableClass, |
| self::REF_COLUMNS => (array) $refColumns); |
|
|
| if (!empty($onDelete)) { |
| $reference[self::ON_DELETE] = $onDelete; |
| } |
|
|
| if (!empty($onUpdate)) { |
| $reference[self::ON_UPDATE] = $onUpdate; |
| } |
|
|
| $this->_referenceMap[$ruleKey] = $reference; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| |
| public function setReferences(array $referenceMap) |
| { |
| $this->_referenceMap = $referenceMap; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function getReference($tableClassname, $ruleKey = null) |
| { |
| $thisClass = get_class($this); |
| if ($thisClass === 'Zend_Db_Table') { |
| $thisClass = $this->_definitionConfigName; |
| } |
| $refMap = $this->_getReferenceMapNormalized(); |
| if ($ruleKey !== null) { |
| if (!isset($refMap[$ruleKey])) { |
| |
| throw new Zend_Db_Table_Exception("No reference rule \"$ruleKey\" from table $thisClass to table $tableClassname"); |
| } |
| if ($refMap[$ruleKey][self::REF_TABLE_CLASS] != $tableClassname) { |
| |
| throw new Zend_Db_Table_Exception("Reference rule \"$ruleKey\" does not reference table $tableClassname"); |
| } |
| return $refMap[$ruleKey]; |
| } |
| foreach ($refMap as $reference) { |
| if ($reference[self::REF_TABLE_CLASS] == $tableClassname) { |
| return $reference; |
| } |
| } |
| |
| throw new Zend_Db_Table_Exception("No reference from table $thisClass to table $tableClassname"); |
| } |
|
|
| |
| |
| |
| |
| public function setDependentTables(array $dependentTables) |
| { |
| $this->_dependentTables = $dependentTables; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| public function getDependentTables() |
| { |
| return $this->_dependentTables; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function setDefaultSource($defaultSource = self::DEFAULT_NONE) |
| { |
| if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { |
| $defaultSource = self::DEFAULT_NONE; |
| } |
|
|
| $this->_defaultSource = $defaultSource; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getDefaultSource() |
| { |
| return $this->_defaultSource; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function setDefaultValues(Array $defaultValues) |
| { |
| foreach ($defaultValues as $defaultName => $defaultValue) { |
| if (array_key_exists($defaultName, $this->_metadata)) { |
| $this->_defaultValues[$defaultName] = $defaultValue; |
| } |
| } |
| return $this; |
| } |
|
|
| public function getDefaultValues() |
| { |
| return $this->_defaultValues; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| public static function setDefaultAdapter($db = null) |
| { |
| self::$_defaultDb = self::_setupAdapter($db); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function getDefaultAdapter() |
| { |
| return self::$_defaultDb; |
| } |
|
|
| |
| |
| |
| |
| protected function _setAdapter($db) |
| { |
| $this->_db = self::_setupAdapter($db); |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getAdapter() |
| { |
| return $this->_db; |
| } |
|
|
| |
| |
| |
| |
| |
| protected static function _setupAdapter($db) |
| { |
| if ($db === null) { |
| return null; |
| } |
| if (is_string($db)) { |
| |
| $db = \Zend_Registry::get($db); |
| } |
| if (!$db instanceof Zend_Db_Adapter_Abstract) { |
| |
| throw new Zend_Db_Table_Exception('Argument must be of type Zend_Db_Adapter_Abstract, or a Registry key where a Zend_Db_Adapter_Abstract object is stored'); |
| } |
| return $db; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public static function setDefaultMetadataCache($metadataCache = null) |
| { |
| self::$_defaultMetadataCache = self::_setupMetadataCache($metadataCache); |
| } |
|
|
| |
| |
| |
| |
| |
| public static function getDefaultMetadataCache() |
| { |
| return self::$_defaultMetadataCache; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected function _setMetadataCache($metadataCache) |
| { |
| $this->_metadataCache = self::_setupMetadataCache($metadataCache); |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| public function getMetadataCache() |
| { |
| return $this->_metadataCache; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function setMetadataCacheInClass($flag) |
| { |
| $this->_metadataCacheInClass = (bool) $flag; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function metadataCacheInClass() |
| { |
| return $this->_metadataCacheInClass; |
| } |
|
|
| |
| |
| |
| |
| |
| protected static function _setupMetadataCache($metadataCache) |
| { |
| if ($metadataCache === null) { |
| return null; |
| } |
| if (is_string($metadataCache)) { |
| |
| $metadataCache = \Zend_Registry::get($metadataCache); |
| } |
| if (!$metadataCache instanceof Zend_Cache_Core) { |
| |
| throw new Zend_Db_Table_Exception('Argument must be of type Zend_Cache_Core, or a Registry key where a Zend_Cache_Core object is stored'); |
| } |
| return $metadataCache; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected function _setSequence($sequence) |
| { |
| $this->_sequence = $sequence; |
|
|
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| protected function _setup() |
| { |
| $this->_setupDatabaseAdapter(); |
| $this->_setupTableName(); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| protected function _setupDatabaseAdapter() |
| { |
| if (! $this->_db) { |
| $this->_db = self::getDefaultAdapter(); |
| if (!$this->_db instanceof Zend_Db_Adapter_Abstract) { |
| |
| throw new Zend_Db_Table_Exception('No adapter found for ' . get_class($this)); |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected function _setupTableName() |
| { |
| if (! $this->_name) { |
| $this->_name = get_class($this); |
| } else if (strpos($this->_name, '.')) { |
| list($this->_schema, $this->_name) = explode('.', $this->_name); |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| protected function _setupMetadata() |
| { |
| if ($this->metadataCacheInClass() && (count($this->_metadata) > 0)) { |
| return true; |
| } |
|
|
| |
| $isMetadataFromCache = true; |
|
|
| |
| if (null === $this->_metadataCache && null !== self::$_defaultMetadataCache) { |
| |
| $this->_setMetadataCache(self::$_defaultMetadataCache); |
| } |
|
|
| |
| if (null !== $this->_metadataCache) { |
| |
|
|
| |
| $dbConfig = $this->_db->getConfig(); |
|
|
| $port = isset($dbConfig['options']['port']) |
| ? ':'.$dbConfig['options']['port'] |
| : (isset($dbConfig['port']) |
| ? ':'.$dbConfig['port'] |
| : null); |
|
|
| $host = isset($dbConfig['options']['host']) |
| ? ':'.$dbConfig['options']['host'] |
| : (isset($dbConfig['host']) |
| ? ':'.$dbConfig['host'] |
| : null); |
|
|
| |
| $cacheId = md5( // port:host/dbname:schema.table (based on availabilty) |
| $port . $host . '/'. $dbConfig['dbname'] . ':' |
| . $this->_schema. '.' . $this->_name |
| ); |
| } |
|
|
| |
| if (null === $this->_metadataCache || !($metadata = $this->_metadataCache->load($cacheId))) { |
| |
| $isMetadataFromCache = false; |
| |
| $metadata = $this->_db->describeTable($this->_name, $this->_schema); |
| |
| if (null !== $this->_metadataCache && !$this->_metadataCache->save($metadata, $cacheId)) { |
| trigger_error('Failed saving metadata to metadataCache', E_USER_NOTICE); |
| } |
| } |
|
|
| |
| $this->_metadata = $metadata; |
|
|
| |
| return $isMetadataFromCache; |
| } |
|
|
| |
| |
| |
| |
| |
| protected function _getCols() |
| { |
| if (null === $this->_cols) { |
| $this->_setupMetadata(); |
| $this->_cols = array_keys($this->_metadata); |
| } |
| return $this->_cols; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| protected function _setupPrimaryKey() |
| { |
| if (!$this->_primary) { |
| $this->_setupMetadata(); |
| $this->_primary = array(); |
| foreach ($this->_metadata as $col) { |
| if ($col['PRIMARY']) { |
| $this->_primary[ $col['PRIMARY_POSITION'] ] = $col['COLUMN_NAME']; |
| if ($col['IDENTITY']) { |
| $this->_identity = $col['PRIMARY_POSITION']; |
| } |
| } |
| } |
| |
| |
| if (empty($this->_primary)) { |
| |
| throw new Zend_Db_Table_Exception('A table must have a primary key, but none was found'); |
| } |
| } else if (!is_array($this->_primary)) { |
| $this->_primary = array(1 => $this->_primary); |
| } else if (isset($this->_primary[0])) { |
| array_unshift($this->_primary, null); |
| unset($this->_primary[0]); |
| } |
|
|
| $cols = $this->_getCols(); |
| if (! array_intersect((array) $this->_primary, $cols) == (array) $this->_primary) { |
| |
| throw new Zend_Db_Table_Exception("Primary key column(s) (" |
| . implode(',', (array) $this->_primary) |
| . ") are not columns in this table (" |
| . implode(',', $cols) |
| . ")"); |
| } |
|
|
| $primary = (array) $this->_primary; |
| $pkIdentity = $primary[(int) $this->_identity]; |
|
|
| |
| |
| |
| |
| if ($this->_sequence === true && $this->_db instanceof Zend_Db_Adapter_Pdo_Pgsql) { |
| $this->_sequence = $this->_db->quoteIdentifier("{$this->_name}_{$pkIdentity}_seq"); |
| if ($this->_schema) { |
| $this->_sequence = $this->_db->quoteIdentifier($this->_schema) . '.' . $this->_sequence; |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| protected function _getReferenceMapNormalized() |
| { |
| $referenceMapNormalized = array(); |
|
|
| foreach ($this->_referenceMap as $rule => $map) { |
|
|
| $referenceMapNormalized[$rule] = array(); |
|
|
| foreach ($map as $key => $value) { |
| switch ($key) { |
|
|
| |
| case self::COLUMNS: |
| case self::REF_COLUMNS: |
| if (!is_array($value)) { |
| $referenceMapNormalized[$rule][$key] = array($value); |
| } else { |
| $referenceMapNormalized[$rule][$key] = $value; |
| } |
| break; |
|
|
| |
| default: |
| $referenceMapNormalized[$rule][$key] = $value; |
| break; |
| } |
| } |
| } |
|
|
| return $referenceMapNormalized; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function init() |
| { |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function info($key = null) |
| { |
| $this->_setupPrimaryKey(); |
|
|
| $info = array( |
| self::SCHEMA => $this->_schema, |
| self::NAME => $this->_name, |
| self::COLS => $this->_getCols(), |
| self::PRIMARY => (array) $this->_primary, |
| self::METADATA => $this->_metadata, |
| self::ROW_CLASS => $this->getRowClass(), |
| self::ROWSET_CLASS => $this->getRowsetClass(), |
| self::REFERENCE_MAP => $this->_referenceMap, |
| self::DEPENDENT_TABLES => $this->_dependentTables, |
| self::SEQUENCE => $this->_sequence |
| ); |
|
|
| if ($key === null) { |
| return $info; |
| } |
|
|
| if (!array_key_exists($key, $info)) { |
| |
| throw new Zend_Db_Table_Exception('There is no table information for the key "' . $key . '"'); |
| } |
|
|
| return $info[$key]; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function select($withFromPart = self::SELECT_WITHOUT_FROM_PART) |
| { |
| |
| $select = new Zend_Db_Table_Select($this); |
| if ($withFromPart == self::SELECT_WITH_FROM_PART) { |
| $select->from($this->info(self::NAME), Zend_Db_Table_Select::SQL_WILDCARD, $this->info(self::SCHEMA)); |
| } |
| return $select; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function insert(array $data) |
| { |
| $this->_setupPrimaryKey(); |
|
|
| |
| |
| |
| |
| |
| $primary = (array) $this->_primary; |
| $pkIdentity = $primary[(int)$this->_identity]; |
|
|
| |
| |
| |
| |
| |
| |
| if (is_string($this->_sequence) && !isset($data[$pkIdentity])) { |
| $data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence); |
| $pkSuppliedBySequence = true; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| if (!isset($pkSuppliedBySequence) && array_key_exists($pkIdentity, $data)) { |
| if ($data[$pkIdentity] === null |
| || $data[$pkIdentity] === '' |
| || is_bool($data[$pkIdentity]) |
| || (is_array($data[$pkIdentity]) && empty($data[$pkIdentity]))) { |
| unset($data[$pkIdentity]); |
| } |
| } |
|
|
| |
| |
| |
| $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; |
| $this->_db->insert($tableSpec, $data); |
|
|
| |
| |
| |
| |
| |
| if ($this->_sequence === true && !isset($data[$pkIdentity])) { |
| $data[$pkIdentity] = $this->_db->lastInsertId(); |
| } |
|
|
| |
| |
| |
| |
| $pkData = array_intersect_key($data, array_flip($primary)); |
| if (count($primary) == 1) { |
| reset($pkData); |
| return current($pkData); |
| } |
|
|
| return $pkData; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function isIdentity($column) |
| { |
| $this->_setupPrimaryKey(); |
|
|
| if (!isset($this->_metadata[$column])) { |
| |
| |
| |
| |
|
|
| throw new Zend_Db_Table_Exception('Column "' . $column . '" not found in table.'); |
| } |
|
|
| return (bool) $this->_metadata[$column]['IDENTITY']; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function update(array $data, $where) |
| { |
| $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; |
| return $this->_db->update($tableSpec, $data, $where); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| public function _cascadeUpdate($parentTableClassname, array $oldPrimaryKey, array $newPrimaryKey) |
| { |
| $this->_setupMetadata(); |
| $rowsAffected = 0; |
| foreach ($this->_getReferenceMapNormalized() as $map) { |
| if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_UPDATE])) { |
| switch ($map[self::ON_UPDATE]) { |
| case self::CASCADE: |
| $newRefs = array(); |
| $where = array(); |
| for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { |
| $col = $this->_db->foldCase($map[self::COLUMNS][$i]); |
| $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); |
| if (array_key_exists($refCol, $newPrimaryKey)) { |
| $newRefs[$col] = $newPrimaryKey[$refCol]; |
| } |
| $type = $this->_metadata[$col]['DATA_TYPE']; |
| $where[] = $this->_db->quoteInto( |
| $this->_db->quoteIdentifier($col, true) . ' = ?', |
| $oldPrimaryKey[$refCol], $type); |
| } |
| $rowsAffected += $this->update($newRefs, $where); |
| break; |
| default: |
| |
| break; |
| } |
| } |
| } |
| return $rowsAffected; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function delete($where) |
| { |
| $tableSpec = ($this->_schema ? $this->_schema . '.' : '') . $this->_name; |
| return $this->_db->delete($tableSpec, $where); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function _cascadeDelete($parentTableClassname, array $primaryKey) |
| { |
| $this->_setupMetadata(); |
| $rowsAffected = 0; |
| foreach ($this->_getReferenceMapNormalized() as $map) { |
| if ($map[self::REF_TABLE_CLASS] == $parentTableClassname && isset($map[self::ON_DELETE])) { |
| switch ($map[self::ON_DELETE]) { |
| case self::CASCADE: |
| $where = array(); |
| for ($i = 0; $i < count($map[self::COLUMNS]); ++$i) { |
| $col = $this->_db->foldCase($map[self::COLUMNS][$i]); |
| $refCol = $this->_db->foldCase($map[self::REF_COLUMNS][$i]); |
| $type = $this->_metadata[$col]['DATA_TYPE']; |
| $where[] = $this->_db->quoteInto( |
| $this->_db->quoteIdentifier($col, true) . ' = ?', |
| $primaryKey[$refCol], $type); |
| } |
| $rowsAffected += $this->delete($where); |
| break; |
| default: |
| |
| break; |
| } |
| } |
| } |
| return $rowsAffected; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function find() |
| { |
| $this->_setupPrimaryKey(); |
| $args = func_get_args(); |
| $keyNames = array_values((array) $this->_primary); |
|
|
| if (count($args) < count($keyNames)) { |
| |
| throw new Zend_Db_Table_Exception("Too few columns for the primary key"); |
| } |
|
|
| if (count($args) > count($keyNames)) { |
| |
| throw new Zend_Db_Table_Exception("Too many columns for the primary key"); |
| } |
|
|
| $whereList = array(); |
| $numberTerms = 0; |
| foreach ($args as $keyPosition => $keyValues) { |
| $keyValuesCount = count($keyValues); |
| |
| |
| |
| if (!is_array($keyValues)) { |
| $keyValues = array($keyValues); |
| } |
| if ($numberTerms == 0) { |
| $numberTerms = $keyValuesCount; |
| } else if ($keyValuesCount != $numberTerms) { |
| |
| throw new Zend_Db_Table_Exception("Missing value(s) for the primary key"); |
| } |
| $keyValues = array_values($keyValues); |
| for ($i = 0; $i < $keyValuesCount; ++$i) { |
| if (!isset($whereList[$i])) { |
| $whereList[$i] = array(); |
| } |
| $whereList[$i][$keyPosition] = $keyValues[$i]; |
| } |
| } |
|
|
| $whereClause = null; |
| if (count($whereList)) { |
| $whereOrTerms = array(); |
| $tableName = $this->_db->quoteTableAs($this->_name, null, true); |
| foreach ($whereList as $keyValueSets) { |
| $whereAndTerms = array(); |
| foreach ($keyValueSets as $keyPosition => $keyValue) { |
| $type = $this->_metadata[$keyNames[$keyPosition]]['DATA_TYPE']; |
| $columnName = $this->_db->quoteIdentifier($keyNames[$keyPosition], true); |
| $whereAndTerms[] = $this->_db->quoteInto( |
| $tableName . '.' . $columnName . ' = ?', |
| $keyValue, $type); |
| } |
| $whereOrTerms[] = '(' . implode(' AND ', $whereAndTerms) . ')'; |
| } |
| $whereClause = '(' . implode(' OR ', $whereOrTerms) . ')'; |
| } |
|
|
| |
| if ($whereClause == null) { |
| $rowsetClass = $this->getRowsetClass(); |
| if (!class_exists($rowsetClass)) { |
| |
| Zend_Loader::loadClass($rowsetClass); |
| } |
| return new $rowsetClass(array('table' => $this, 'rowClass' => $this->getRowClass(), 'stored' => true)); |
| } |
|
|
| return $this->fetchAll($whereClause); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function fetchAll($where = null, $order = null, $count = null, $offset = null) |
| { |
| if (!($where instanceof Zend_Db_Table_Select)) { |
| $select = $this->select(); |
|
|
| if ($where !== null) { |
| $this->_where($select, $where); |
| } |
|
|
| if ($order !== null) { |
| $this->_order($select, $order); |
| } |
|
|
| if ($count !== null || $offset !== null) { |
| $select->limit($count, $offset); |
| } |
|
|
| } else { |
| $select = $where; |
| } |
|
|
| $rows = $this->_fetch($select); |
|
|
| $data = array( |
| 'table' => $this, |
| 'data' => $rows, |
| 'readOnly' => $select->isReadOnly(), |
| 'rowClass' => $this->getRowClass(), |
| 'stored' => true |
| ); |
|
|
| $rowsetClass = $this->getRowsetClass(); |
| if (!class_exists($rowsetClass)) { |
| |
| Zend_Loader::loadClass($rowsetClass); |
| } |
| return new $rowsetClass($data); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function fetchRow($where = null, $order = null, $offset = null) |
| { |
| if (!($where instanceof Zend_Db_Table_Select)) { |
| $select = $this->select(); |
|
|
| if ($where !== null) { |
| $this->_where($select, $where); |
| } |
|
|
| if ($order !== null) { |
| $this->_order($select, $order); |
| } |
|
|
| $select->limit(1, ((is_numeric($offset)) ? (int) $offset : null)); |
|
|
| } else { |
| $select = $where->limit(1, $where->getPart(Zend_Db_Select::LIMIT_OFFSET)); |
| } |
|
|
| $rows = $this->_fetch($select); |
|
|
| if (count($rows) == 0) { |
| return null; |
| } |
|
|
| $data = array( |
| 'table' => $this, |
| 'data' => $rows[0], |
| 'readOnly' => $select->isReadOnly(), |
| 'stored' => true |
| ); |
|
|
| $rowClass = $this->getRowClass(); |
| if (!class_exists($rowClass)) { |
| |
| Zend_Loader::loadClass($rowClass); |
| } |
| return new $rowClass($data); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function fetchNew() |
| { |
| return $this->createRow(); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function createRow(array $data = array(), $defaultSource = null) |
| { |
| $cols = $this->_getCols(); |
| $defaults = array_combine($cols, array_fill(0, count($cols), null)); |
|
|
| |
| if ($defaultSource == null) { |
| $defaultSource = $this->_defaultSource; |
| } |
|
|
| if (!in_array($defaultSource, array(self::DEFAULT_CLASS, self::DEFAULT_DB, self::DEFAULT_NONE))) { |
| $defaultSource = self::DEFAULT_NONE; |
| } |
|
|
| if ($defaultSource == self::DEFAULT_DB) { |
| foreach ($this->_metadata as $metadataName => $metadata) { |
| if (($metadata['DEFAULT'] != null) && |
| ($metadata['NULLABLE'] !== true || ($metadata['NULLABLE'] === true && isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === true)) && |
| (!(isset($this->_defaultValues[$metadataName]) && $this->_defaultValues[$metadataName] === false))) { |
| $defaults[$metadataName] = $metadata['DEFAULT']; |
| } |
| } |
| } elseif ($defaultSource == self::DEFAULT_CLASS && $this->_defaultValues) { |
| foreach ($this->_defaultValues as $defaultName => $defaultValue) { |
| if (array_key_exists($defaultName, $defaults)) { |
| $defaults[$defaultName] = $defaultValue; |
| } |
| } |
| } |
|
|
| $config = array( |
| 'table' => $this, |
| 'data' => $defaults, |
| 'readOnly' => false, |
| 'stored' => false |
| ); |
|
|
| $rowClass = $this->getRowClass(); |
| if (!class_exists($rowClass)) { |
| |
| Zend_Loader::loadClass($rowClass); |
| } |
| $row = new $rowClass($config); |
| $row->setFromArray($data); |
| return $row; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| protected function _where(Zend_Db_Table_Select $select, $where) |
| { |
| $where = (array) $where; |
|
|
| foreach ($where as $key => $val) { |
| |
| if (is_int($key)) { |
| |
| $select->where($val); |
| } else { |
| |
| |
| $select->where($key, $val); |
| } |
| } |
|
|
| return $select; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| protected function _order(Zend_Db_Table_Select $select, $order) |
| { |
| if (!is_array($order)) { |
| $order = array($order); |
| } |
|
|
| foreach ($order as $val) { |
| $select->order($val); |
| } |
|
|
| return $select; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| protected function _fetch(Zend_Db_Table_Select $select) |
| { |
| $stmt = $this->_db->query($select); |
| $data = $stmt->fetchAll(Zend_Db::FETCH_ASSOC); |
| return $data; |
| } |
|
|
| } |
|
|