/** * @param $paramArray * @param Column $column * * @return array */ public function prepareValidatorParams($paramArray, Column $column) { if (!is_array($paramArray)) { return $paramArray; } foreach ($paramArray as $k => $value) { switch ((string) $value) { case 'COLUMN_CHAR_LENGTH': $value = $column->getCharacterMaximumLength(); break; case 'COLUMN_ENUM_VALUES': $value = $column->getEnumValuesAsArray(); break; case 'MAX_VALUE': $value = $column->getMaxValue(); break; case 'MIN_VALUE': $value = $column->getMinValue(); break; } $paramArray[$k] = $value; } return $paramArray; }
/** * @param $xml * @param DbAdapter $db * @return Schema */ public static function fromXml($xml, DbAdapter $db) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); $name = $data['@attributes']['name']; $schema = new Schema($db); foreach ($data['tables']['table'] as $tableArray) { $table = Table::fromXml($tableArray, $schema); $schema->addTable($table); } foreach ($data['tables']['table'] as $tableArray) { $indexArrayList = is_int(key($tableArray['indexes']['index'])) ? $tableArray['indexes']['index'] : $tableArray['indexes']; $table = $schema->getTable($tableArray['@attributes']['name']); foreach ($indexArrayList as $indexArray) { $index = AbstractIndex::fromXml($indexArray, $table); $table->addIndex($index); } if (isset($tableArray['links']['link'])) { $linkArrayList = is_int(key($tableArray['links']['link'])) ? $tableArray['links']['link'] : $tableArray['links']; foreach ($linkArrayList as $linkArray) { $link = AbstractLink::fromXml($linkArray, $table); $table->addLink($link); } } } return $schema; }
public function getColumntConfig(Column $column) { $config = $this->getOption('config'); $configFields = isset($config['fields']) ? $config['fields'] : array(); $result = array(); foreach ($configFields as $configField) { if (isset($configField['match'])) { $isMatched = false; foreach ($configField['match'] as $match) { $isMatched = false; if (isset($match['type'])) { $matchTypes = is_array($match['type']) ? $match['type'] : array($match['type']); $isMatched = in_array($column->getColumnType(), $matchTypes); } if (isset($match['regexp'])) { $isMatched = $isMatched && preg_match($match['regexp'], $column->getFullName()); } $columnLength = $column->getCharacterMaximumLength() ? $column->getCharacterMaximumLength() : $column->getNumericPrecision(); if ($isMatched && isset($match['length'])) { foreach ($match['length'] as $operation => $lengthMatch) { $operation = preg_replace('#\\s+#', '', $operation); switch ($operation) { case '<': $isMatched = $columnLength < $lengthMatch; break; case '>': $isMatched = $columnLength > $lengthMatch; break; case '>=': $isMatched = $columnLength >= $lengthMatch; break; case '<=': $isMatched = $columnLength <= $lengthMatch; break; case '==': $isMatched = $columnLength == $lengthMatch; break; case '=': $isMatched = $columnLength == $lengthMatch; break; default: $isMatched = false; } } } if ($isMatched) { break; } } if ($isMatched) { $result = ArrayUtils::merge($result, $configField); } } } return $result; }
/** * Создать экземпляр из XMl * * @param $xml * @param \Model\Cluster\Schema\Table $table * @throws \Model\Exception\ErrorException * @return AbstractLink */ public static function fromXml($xml, Table $table) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); switch (strtolower($data['type'])) { case 'onetoone': $type = self::LINK_TYPE_ONE_TO_ONE; break; case 'onetomany': $type = self::LINK_TYPE_ONE_TO_MANY; break; case 'manytoone': $type = self::LINK_TYPE_MANY_TO_ONE; break; case 'manytomany': $type = self::LINK_TYPE_MANY_TO_MANY; break; } $type = '\\' . $type; $schema = $table->getSchema(); $localColumn = $schema->getTable($data['local_table'])->getColumn($data['local_column']); $foreignColumn = $schema->getTable($data['foreign_table'])->getColumn($data['foreign_column']); if (!$localColumn) { throw new ErrorException('Local column not found'); } if (!$foreignColumn) { throw new ErrorException('Foreign column not found'); } if (isset($data['rule_update'])) { if (empty($data['rule_update'])) { $data['rule_update'] = null; } } if (isset($data['rule_delete'])) { if (empty($data['rule_delete'])) { $data['rule_delete'] = null; } } if (isset($data['link_table'])) { $linkTableLocalColumn = $schema->getTable($data['link_table'])->getColumn($data['link_table_local_column']); $linkTableForeignColumn = $schema->getTable($data['link_table'])->getColumn($data['link_table_foreign_column']); if (!$linkTableLocalColumn) { throw new ErrorException('Link table Local column not found'); } if (!$linkTableForeignColumn) { throw new ErrorException('Link table Foreign column not found'); } $link = new $type($localColumn, $foreignColumn, $data['rule_delete'], $data['rule_update'], $linkTableLocalColumn, $linkTableForeignColumn); } else { $link = new $type($localColumn, $foreignColumn, $data['rule_delete'], $data['rule_update']); } return $link; }
/** * @param $xml * @param \Model\Cluster\Schema\Table $table * @return mixed * @throws \Model\Exception\ErrorException */ public static function fromXml($xml, Table $table) { if (is_array($xml)) { $data = $xml; } else { $xml = simplexml_load_string($xml); $data = json_decode(json_encode((array) $xml), 1); } $data = Column::prepareXmlArray($data); $columnArray = array_map('trim', explode(',', $data['@attributes']['columns'])); $columns = array(); foreach ($columnArray as $column) { $col = $table->getColumn($column); if (!$col) { throw new \Model\Exception\ErrorException('Column ' . $column . ' not found'); } $columns[] = $col; } switch (strtolower($data['@attributes']['type'])) { case 'primary': $type = self::TYPE_PRIMARY; break; case 'unique': $type = self::TYPE_UNIQUE; break; case 'key': $type = self::TYPE_KEY; break; } return new $type($data['@attributes']['name'], $columns); }
/** * @param Column $column * @return $this */ public function addColumn(Column $column) { $this->_columnByNameRegistry[$column->getName()] = $column; $this[] = $column; return $this; }