Example #1
0
 /**
  * @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);
 }
Example #2
0
 /**
  * @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'];
 }
Example #3
0
 /**
  * @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;
 }
Example #4
0
 /**
  * @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;
 }