/** * @expectedException RuntimeException */ public function testTableParse() { $query = $this->readInputFile('table.sql'); $table = new Table($query); $this->assertEquals('foobar', $table->getName()); $this->assertTrue($table->hasField('foobar_id')); $this->assertTrue($table->hasPrimary()); $field = new Field('', 'foobar_id'); $table->addField($field); }
/** * @param bool $sort = true * @return array */ public function getCreateStatements($sort = true) { if (!$sort || $this->createsSorted) { return $this->changes['createTables']; } $resolved = []; $dependencyMap = []; $pending = []; //resolve simple tables (no dependencies) foreach ($this->changes['createTables'] as $query) { $table = new Table($query); $tableName = $table->getName(); $depends = $table->getDependencies(); if (!$depends) { $resolved[$tableName] = $query; } elseif ($this->dependenciesMet($resolved, $depends)) { $resolved[$tableName] = $query; } else { $dependencyMap[$tableName] = $depends; $pending[$tableName] = ['query' => $query, 'parsed' => $table]; } } //keep checking pending alters until we can't resolve any more queries $afterCount = count($resolved); do { $preCount = $afterCount; foreach ($dependencyMap as $name => $depends) { if ($this->dependenciesMet($resolved, $depends)) { $resolved[$name] = $pending[$name]['query']; unset($pending[$name]); } else { //remove dependencies that might not be in create list here $clean = []; foreach ($depends as $name) { if (isset($resolved[$name]) || isset($pending[$name])) { $clean[] = $name; } } //rework map $dependencyMap[$name] = $clean; } } $afterCount = count($resolved); } while ($preCount != $afterCount); $this->changes['createTables'] = $this->addMarkedCreates($pending, $resolved); $this->createsSorted = true; return $this->changes['createTables']; }
/** * @param Database $db * @param Table $tbl * @return Table */ public function getTableFields(Database $db, Table $tbl) { $query = sprintf('SHOW COLUMNS IN `%s` FROM `%s`', $tbl->getName(), $db->getName()); $stmt = $this->conn->query($query); while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { $field = new Field('', $row['Field']); $field->setType($row['Type'])->setNullable(strtoupper($row['Null']) == 'YES')->setDefaultValue($row['Default']); if ($row['Extra']) { if ($row['Extra'] == 'auto_increment') { $field->setAutoIncrement(true); } else { //things like on update? $field->setExtraString($row['Extra']); } } $tbl->addField($field, true); } return $tbl; }
/** * @param Table $table * @param Database $db * @return Table */ protected function addCreateStatement(Table $table, Database $db) { $stmt = $this->conn->query(sprintf('SHOW CREATE TABLE %s.%s', $db->getName(), $table->getName())); $create = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$create || !isset($create['Create Table'])) { return null; } $table->setStatement($create['Create Table'])->parse($create['Create Table']); $db->addTable($table); return $table; }