Example #1
0
 public function repairTableParams($tablename, $fielddefs, $indices, $execute = true, $engine = null)
 {
     //Modules with names close to 30 characters may have index names over 30 characters, we need to clean them
     foreach ($indices as $key => $value) {
         $indices[$key]['name'] = $this->getValidDBName($value['name'], true, 'index');
     }
     return parent::repairTableParams($tablename, $fielddefs, $indices, $execute, $engine);
 }
Example #2
0
 public function testRepairTableParamsAddIndexAndData()
 {
     $tableName = 'test1_' . mt_rand();
     $params = array('foo' => array('name' => 'foo', 'type' => 'varchar', 'len' => '255'), 'bar' => array('name' => 'bar', 'type' => 'int'));
     $index = array('name' => 'test_index', 'type' => 'index', 'fields' => array('foo', 'bar'));
     if ($this->_db->tableExists($tableName)) {
         $this->_db->dropTableName($tableName);
     }
     $this->createTableParams($tableName, $params, array());
     $repair = $this->_db->repairTableParams($tableName, $params, array($index), false);
     $this->assertRegExp('#MISSING INDEX IN DATABASE.*test_index#i', $repair);
     $repair = $this->_db->repairTableParams($tableName, $params, array($index), true);
     $idx = $this->_db->get_indices($tableName);
     $this->assertArrayHasKey('test_index', $idx);
     $this->assertContains('foo', $idx['test_index']['fields']);
     $this->assertContains('bar', $idx['test_index']['fields']);
     $this->dropTableName($tableName);
 }
 /**
  * @see DBManager::repairTableParams()
  *
  * For MySQL, we can write the ALTER TABLE statement all in one line, which speeds things 
  * up quite a bit. So here, we'll parse the returned SQL into a single ALTER TABLE command.
  */
 public function repairTableParams($tablename, $fielddefs, $indices, $execute = true, $engine = null)
 {
     $sql = parent::repairTableParams($tablename, $fielddefs, $indices, false, $engine);
     if ($sql == '') {
         return '';
     }
     if (stristr($sql, 'create table')) {
         return $sql;
     }
     // first, parse out all the comments
     $match = array();
     preg_match_all("!/\\*.*?\\*/!is", $sql, $match);
     $commentBlocks = $match[0];
     $sql = preg_replace("!/\\*.*?\\*/!is", '', $sql);
     // now, we should only have alter table statements
     // let's replace the 'alter table name' part with a comma
     $sql = preg_replace("!alter table {$tablename}!is", ', ', $sql);
     // re-add it at the beginning
     $sql = substr_replace($sql, '', strpos($sql, ','), 1);
     $sql = str_replace(";", "", $sql);
     $sql = str_replace("\n", "", $sql);
     $sql = "ALTER TABLE {$tablename} {$sql}";
     if ($execute) {
         $this->query($sql, 'Error with MySQL repair table');
     }
     // and re-add the comments at the beginning
     $sql = implode("\n", $commentBlocks) . "\n" . $sql . "\n";
     return $sql;
 }