/** @return Am_DbSync_Table */ static function createFromXml(SimpleXmlElement $table) { $t = new self((string) $table['name']); $t->oldNames = array_filter(array_map('trim', explode(",", $table["rename"]))); foreach ($table->field as $field) { $t->addField(Am_DbSync_Field::createFromXml($field)); } foreach ($table->index as $index) { $t->addIndex(Am_DbSync_Index::createFromXml($index)); } foreach ($table->alter as $alter) { foreach ($alter->drop as $drop) { if ((string) $drop['field']) { $t->addDropField((string) $drop['field']); } if ((string) $drop['index']) { $t->addDropIndex((string) $drop['index']); } } } // check oldnames $fieldNames = array_keys($t->getFields()); foreach ($t->getFields() as $field) { if ($field->getOldNames() && ($intersect = array_intersect($fieldNames, $field->getOldNames()))) { throw new Exception("XML file error - attempt to rename a field defined in schema /scheme/table[{$t->name}]/field=[{$intersect[0]}] to [{$field->getName()}]"); } } $indexNames = array_keys($t->getIndexes()); foreach ($t->getIndexes() as $index) { if ($index->getOldNames() && ($intersect = array_intersect($indexNames, $index->getOldNames()))) { throw new Exception("XML file error - attempt to rename an index defined in schema /scheme/table[{$t->name}]/index=[{$intersect[0]}] to [{$index->getName()}]"); } } // create by data if ($table->data && $table->data->query) { foreach ($table->data->query as $query) { $t->data[] = (string) $query; } } // create by table_data if ($table->table_data && $table->table_data->row) { foreach ($table->table_data->row as $row) { $record = array(); foreach ($row->field as $field) { $record[(string) $field['name']] = (string) $field; } $t->data[] = $record; } } return $t; }