/** * $tableName is used by constraint keys. */ protected function loadFromCache($schema, $itemType, $itemName, $tableName = null) { if ($tableName) { if (isset($this->constraintKeys[$schema][$tableName][$itemName])) { return; } } else { $prop = $this->keyToProperty($itemType); if (isset($this->{$prop}[$schema][$itemName])) { return; } } $key = $this->cacheKey($schema . '.' . $itemType . '.' . $itemName); $data = $this->cache()->read($key); if (!$data) { $this->loadAndCache($schema, $itemType, $itemName, $key, $tableName); } else { switch ($itemType) { case 'tb': $object = new ZfObject\TableObject($data['name']); $this->setTableData($object, $data); break; case 'vw': $object = new ZfObject\ViewObject($data['name']); $object->setViewDefinition($data['viewDefinition']); $object->setCheckOption($data['checkPption']); $object->setIsUpdatable($data['isUpdatable']); $this->setTableData($object, $data); break; case 'ck': $object = new ZfObject\TriggerObject(); $object->setOrdinalPosition($data['ordinalPosition']); $object->setReferencedTableSchema($data['referencedTableSchema']); $object->setForeignKeyUpdateRule($data['updateRule']); $object->setForeignKeyDeleteRule($data['deleteRule']); $object->setReferencedTableName($data['referencedTableName']); $object->setReferencedColumnName($data['referencedColumnName']); break; case 'tr': $object = new ZfObject\ConstraintKeyObject(); $object->setName($data['name']); $object->setEventManipulation($data['eventManipulation']); $object->setEventObjectCatalog($data['eventObjectCatalog']); $object->setEventObjectSchema($data['eventObjectSchema']); $object->setEventObjectTable($data['eventObjectTable']); $object->setActionOrder($data['actionOrder']); $object->setActionCondition($data['actionCondition']); $object->setActionStatement($data['actionStatement']); $object->setActionOrientation($data['actionOrientation']); $object->setActionTiming($data['actionTiming']); $object->setActionReferenceOldTable($data['actionReferenceOldTable']); $object->setActionReferenceNewTable($data['actionReferenceNewTable']); $object->setActionReferenceOldRow($data['actionReferenceOldRow']); $object->setActionReferenceNewRow($data['actionReferenceNewRow']); $object->setCreated($data['created']); break; } $this->setItem($object, $schema, $itemType, $itemName, $tableName); } }
/** * Get constraint keys * * @param string $constraint * @param string $table * @param string $schema * @return array */ public function getConstraintKeys($constraint, $table, $schema = null) { if ($schema === null) { $schema = $this->defaultSchema; } $this->loadConstraintData($table, $schema); // organize references first $references = array(); foreach ($this->data['constraint_references'][$schema] as $refKeyInfo) { if ($refKeyInfo['constraint_name'] == $constraint) { $references[$refKeyInfo['constraint_name']] = $refKeyInfo; } } $keys = array(); foreach ($this->data['constraint_keys'][$schema] as $constraintKeyInfo) { if ($constraintKeyInfo['table_name'] == $table && $constraintKeyInfo['constraint_name'] === $constraint) { $keys[] = $key = new Object\ConstraintKeyObject($constraintKeyInfo['column_name']); $key->setOrdinalPosition($constraintKeyInfo['ordinal_position']); if (isset($references[$constraint])) { //$key->setReferencedTableSchema($constraintKeyInfo['referenced_table_schema']); $key->setForeignKeyUpdateRule($references[$constraint]['update_rule']); $key->setForeignKeyDeleteRule($references[$constraint]['delete_rule']); //$key->setReferencedTableSchema($references[$constraint]['referenced_table_schema']); $key->setReferencedTableName($references[$constraint]['referenced_table_name']); $key->setReferencedColumnName($references[$constraint]['referenced_column_name']); } } } return $keys; }
/** * Get constraint keys * * @param string $constraint * @param string $table * @param string $schema * @param string $database * @return Object\ConstraintKeyObject */ public function getConstraintKeys($constraint, $table, $schema = null) { if ($this->constraintData == null) { $this->loadConstraintData(); } $found = false; foreach ($this->constraintData as $tableName => $constraints) { foreach ($constraints as $constraintData) { if ($tableName == $table && $constraintData['name'] == $constraint) { $found = $constraintData; break 2; } } } if (!$found) { throw new \Exception('invalid constraint, or constraint not found'); } $keys = array(); foreach ($found['keys'] as $keyData) { $keys[] = $key = new Object\ConstraintKeyObject($keyData['column']); if ($found['type'] == 'FOREIGN KEY') { $key->setReferencedTableName($keyData['referenced_table']); $key->setReferencedColumnName($keyData['referenced_column']); $key->setForeignKeyUpdateRule($keyData['update_rule']); $key->setForeignKeyDeleteRule($keyData['delete_rule']); } } return $keys; }