45 if (!is_readable($fileName)) {
52 $dictionary = array();
55 foreach (file($fileName) as $key => $line) {
57 $split = $parser->split($line);
60 if ($tag[self::VERSION_TAG]) {
61 $versions[$tag[self::VERSION_TAG]] = $number;
65 if ($tag[self::TABLENAME_TAG]) {
66 if (isset($tableName)) {
69 $tableName = $tag[self::TABLENAME_TAG];
70 $dictionary[$tableName] = $this->
replace($tableName);
74 if ($tag[self::CONNECTION_TAG]) {
75 $dictionary[$tag[self::CONNECTION_TAG]] = $this->
replace($tag[self::CONNECTION_TAG]);
78 if (!$parser->isEndOfStatement()) {
80 if (!isset($tableName)) {
83 if (empty($versions)) {
91 $statements = $parser->tidy($replaced);
94 $statementBlock[$number] = $statements;
98 if (!$parser->isEndOfStatement()) {
102 $this->updateData[] = array(
103 'tableName' => $this->
replace($tableName),
104 'statementBlock' => $statementBlock,
105 'versions' => $versions
124 foreach ($this->updateData as $dataSet) {
126 $keys = array_keys($versions);
130 $search = array_search($currentVersion, $keys);
132 if ($search == count($keys) - 1) {
134 } elseif ($search ===
false) {
136 trigger_error(
'Current table version (' . $currentVersion .
') not in schema file.', E_USER_WARNING);
138 $startKey = $keys[$search + 1];
141 $startKey = $keys[0];
144 if ($startKey !==
false) {
145 $startLine = $versions[$startKey];
147 foreach ($statementBlock as $lineNumber => $statements) {
148 if ($lineNumber >= $startLine) {
149 $this->
execute($lineNumber, $statements);
153 $lastVersion = $keys[count($keys) - 1];
158 $this->updateData = array();
160 protected function execute($number, $statements)
162 foreach ($statements as $statement) {
164 $this->history[] = $statement;
167 $this->pdo->exec($statement);
168 }
catch (\PDOException $e) {
169 if (class_exists(
'\ReflectionClass',
false)) {
170 $PDOExceptionReflection = new \ReflectionClass(
'PDOException');
171 $line = $PDOExceptionReflection->getProperty(
'line');
172 $message = $PDOExceptionReflection->getProperty(
'message');
174 $line->setAccessible(
true);
175 $line->setValue($e, $number);
176 $line->setAccessible(
false);
177 $message->setAccessible(
true);
178 $message->setValue($e, preg_replace(
'/ at line [0-9]+$/',
' at line ' . $number, $message->getValue($e)));
179 $message->setAccessible(
false);