30 implements Zend_Filter_Interface
44 $this->_asObject = (bool) $asObject;
57 $data = explode(PHP_EOL, $value);
58 $data = array_map(
'trim', $data);
60 $tableName = array_shift($data);
61 if (preg_match(
'|CREATE TABLE `([\w\d\_\-]+)|i', $tableName, $matches)) {
62 $schema[ZendDbSchema_Db_Schema_Table::NAME_KEY] = $matches[
'1'];
65 $tableInfo = array_pop($data);
66 if (preg_match(
'|ENGINE=(\w+)|i', $tableInfo, $matches)) {
67 $schema[
'engine'] = $matches[
'1'];
69 if (preg_match(
'|CHARSET=([\w\d\_\-]+)|i', $tableInfo, $matches)) {
70 $schema[ZendDbSchema_Db_Schema_Table::CHARSET_KEY] = $matches[
'1'];
73 $schema[ZendDbSchema_Db_Schema_Table::COLUMNS_KEY] = array();
74 $schema[ZendDbSchema_Db_Schema_Table::INDEXES_KEY] = array();
75 $schema[ZendDbSchema_Db_Schema_Table::FOREIGNS_KEY] = array();
77 foreach ($data as $row) {
78 $row = trim($row,
",");
80 if (0 === stripos($row,
'PRIMARY KEY')) {
81 preg_match_all(
'|\w+|', substr($row, 14), $matches);
82 $schema[ZendDbSchema_Db_Schema_Table::PRIMARY_KEY] = array(
83 ZendDbSchema_Db_Schema_Table_PrimaryKey::NAME_KEY =>
'primary',
84 ZendDbSchema_Db_Schema_Table_PrimaryKey::TYPE_KEY =>
'primary',
85 ZendDbSchema_Db_Schema_Table_PrimaryKey::COLUMNS_KEY => $matches[
'0']
87 } elseif (0 === stripos($row,
'FULLTEXT')) {
88 $row = preg_replace(
'/^FULLTEXT (KEY|INDEX)?/i',
'', $row, 1);
89 preg_match_all(
'|\w+|', $row, $matches);
90 $name = array_shift($matches[
'0']);
91 $schema[ZendDbSchema_Db_Schema_Table::INDEXES_KEY][$name] = array(
92 ZendDbSchema_Db_Schema_Table_Index::NAME_KEY => $name,
93 ZendDbSchema_Db_Schema_Table_Index::TYPE_KEY =>
'fulltext',
94 ZendDbSchema_Db_Schema_Table_Index::COLUMNS_KEY => $matches[
'0']
96 } elseif (0 === stripos($row,
'UNIQUE')) {
97 $row = preg_replace(
'/^UNIQUE (KEY|INDEX)?/i',
'', $row, 1);
98 preg_match_all(
'|\w+|', $row, $matches);
99 $name = array_shift($matches[
'0']);
100 $schema[ZendDbSchema_Db_Schema_Table::INDEXES_KEY][$name] = array(
101 ZendDbSchema_Db_Schema_Table_Index::NAME_KEY => $name,
102 ZendDbSchema_Db_Schema_Table_Index::TYPE_KEY =>
'unique',
103 ZendDbSchema_Db_Schema_Table_Index::COLUMNS_KEY => $matches[
'0']
105 } elseif (0 === stripos($row,
'CONSTRAINT')) {
106 preg_match(
'|CONSTRAINT ?`(\w+)|i', $row, $matches);
108 $keyName = $matches[
'1'];
111 if (preg_match_all(
'|\([^)]*\)|i', $row, $matches)) {
113 $columns = $matches[
'0'][
'0'];
114 $refColumns = $matches[
'0'][
'1'];
116 preg_match_all(
'|\w+|i', $columns, $matches);
117 $columns = $matches[
'0'];
118 preg_match_all(
'|\w+|i', $refColumns, $matches);
119 $refColumns = $matches[
'0'];
120 $key[ZendDbSchema_Db_Schema_Table_ForeignKey::COLUMNS_KEY] = array_combine($columns, $refColumns);
122 if (preg_match(
'|REFERENCES ?`(\w+)|i', $row, $matches)) {
123 $key[ZendDbSchema_Db_Schema_Table_ForeignKey::REFERENCE_KEY] = $matches[
'1'];
125 if (preg_match(
'|ON DELETE (\w+)|i', $row, $matches)) {
126 $key[ZendDbSchema_Db_Schema_Table_ForeignKey::ONDELETE_KEY] = $matches[
'1'];
128 if (preg_match(
'|ON UPDATE (\w+)|i', $row, $matches)) {
129 $key[ZendDbSchema_Db_Schema_Table_ForeignKey::ONUPDATE_KEY] = $matches[
'1'];
132 $schema[ZendDbSchema_Db_Schema_Table::FOREIGNS_KEY][$keyName] = $key;
133 } elseif (0 === stripos($row,
'`')) {
141 if (preg_match(
'|DEFAULT (\w+)|i', $row, $matches)) {
142 $key[
'default'] = $matches[
'1'];
144 if (preg_match(
'|COMMENT \'([^\']+)\'|i', $row, $matches)) {
145 $key[
'comment'] = $matches[
'1'];
147 if (preg_match(
'|NOT NULL|i', $row, $matches)) {
148 $key[
'nullable'] =
false;
150 $key[
'nullable'] =
true;
152 if (preg_match(
'|AUTO_INCREMENT|i', $row, $matches)) {
153 $key[
'autoincrement'] =
true;
155 if (preg_match(
'|^`(\w+)` (\w+)\((\d+)\)|i', $row, $matches)) {
156 $key[
'type'] = $matches[
'2'];
157 $key[
'length'] = $matches[
'3'];
158 $keyName = $matches[
'1'];
159 $schema[ZendDbSchema_Db_Schema_Table::COLUMNS_KEY][$keyName] = $key;
164 if (!$this->_asObject) {