ZendDbSchema
Schema management for Zend Framework
 All Classes Namespaces Functions Pages
SqlToSchema.php
1 <?php
30  implements Zend_Filter_Interface
31 {
35  protected $_asObject;
36 
42  public function __construct($asObject = true)
43  {
44  $this->_asObject = (bool) $asObject;
45  }
46 
53  public function filter($value)
54  {
55  $schema = array();
56  if (!empty($value)) {
57  $data = explode(PHP_EOL, $value);
58  $data = array_map('trim', $data);
59 
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'];
63  }
64 
65  $tableInfo = array_pop($data);
66  if (preg_match('|ENGINE=(\w+)|i', $tableInfo, $matches)) {
67  $schema['engine'] = $matches['1'];
68  }
69  if (preg_match('|CHARSET=([\w\d\_\-]+)|i', $tableInfo, $matches)) {
70  $schema[ZendDbSchema_Db_Schema_Table::CHARSET_KEY] = $matches['1'];
71  }
72 
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();
76 
77  foreach ($data as $row) {
78  $row = trim($row, ",");
79 
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']
86  );
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']
95  );
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']
104  );
105  } elseif (0 === stripos($row, 'CONSTRAINT')) {
106  preg_match('|CONSTRAINT ?`(\w+)|i', $row, $matches);
107 
108  $keyName = $matches['1'];
109  $key = array();
110 
111  if (preg_match_all('|\([^)]*\)|i', $row, $matches)) {
112 
113  $columns = $matches['0']['0'];
114  $refColumns = $matches['0']['1'];
115 
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);
121  }
122  if (preg_match('|REFERENCES ?`(\w+)|i', $row, $matches)) {
123  $key[ZendDbSchema_Db_Schema_Table_ForeignKey::REFERENCE_KEY] = $matches['1'];
124  }
125  if (preg_match('|ON DELETE (\w+)|i', $row, $matches)) {
126  $key[ZendDbSchema_Db_Schema_Table_ForeignKey::ONDELETE_KEY] = $matches['1'];
127  }
128  if (preg_match('|ON UPDATE (\w+)|i', $row, $matches)) {
129  $key[ZendDbSchema_Db_Schema_Table_ForeignKey::ONUPDATE_KEY] = $matches['1'];
130  }
131 
132  $schema[ZendDbSchema_Db_Schema_Table::FOREIGNS_KEY][$keyName] = $key;
133  } elseif (0 === stripos($row, '`')) {
134  $key = array(
135  'type' => null,
136  'default' => null,
137  'nullable' => null,
138  'signed' => null,
139  'comment' => null,
140  );
141  if (preg_match('|DEFAULT (\w+)|i', $row, $matches)) {
142  $key['default'] = $matches['1'];
143  }
144  if (preg_match('|COMMENT \'([^\']+)\'|i', $row, $matches)) {
145  $key['comment'] = $matches['1'];
146  }
147  if (preg_match('|NOT NULL|i', $row, $matches)) {
148  $key['nullable'] = false;
149  } else {
150  $key['nullable'] = true;
151  }
152  if (preg_match('|AUTO_INCREMENT|i', $row, $matches)) {
153  $key['autoincrement'] = true;
154  }
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;
160  }
161  }
162  }
163  }
164  if (!$this->_asObject) {
165  return $schema;
166  }
167  return new ZendDbSchema_Db_Schema_Table($schema[ZendDbSchema_Db_Schema_Table::NAME_KEY], $schema);
168  }
169 }