/** * Sort row columns. * @param array $fullRows * @return array */ protected function sortRowColumns(array $fullRows) { foreach ($fullRows as $index => $row) { if (!isset($this->_tables[$row->table])) { $this->_tables[$row->table] = $this->dbms->getTableColumns($row->table); } $new = new \stdClass(); foreach ($this->_tables[$row->table] as $column) { $new->{$column} = $row->data->{$column}; } $fullRows[$index]->data = $new; } return $fullRows; }
/** * @return int */ public function upgrade() { $change_column_num = 0; $table_name = $this->getTableName(); $columns = $this->getDBColumns(); $index_columns = $this->getIndexColumns(); $reference_columns = $this->getDBReferenceColumn(); if ($this->db->checkTableExists($table_name)) { $results = $this->db->getTableColumns($table_name); $results_index = $this->db->getTableIndex($table_name); //$results_foreignkey = $this->db->getTableForeignKey($table_name); $add_columns = array(); $add_index_columns = array(); $change_columns = array(); $delete_columns = array(); $delete_indexs = array(); $delete_foreignkey = array(); $columns_keys = array_keys($columns); foreach ($columns as $k => $v) { if (isset($results[$k])) { if (!$v->isEqual($results[$k])) { $change_columns[$k] = $v; } } else { $add_columns[$k] = $v; } } foreach ($results as $k => $v) { if (!isset($columns[$k])) { $delete_columns[$k] = $v; } } foreach ($index_columns as $k => $v) { if (isset($results_index[$k])) { //$change_columns[$k] = $v; } else { $add_index_columns[$k] = $v; } } foreach ($results_index as $k) { if ($k == "PRIMARY") { continue; } if (preg_match('/^(.+_fk)$/', $k, $matchs)) { if (!preg_match('/^(.+)_(.+_fk)$/', $matchs[1], $mt) || !isset($reference_columns[$mt[2]])) { $delete_foreignkey[$k] = $k; } continue; } if (!isset($index_columns[$k])) { $delete_indexs[$k] = $k; } } // update foreach ($delete_foreignkey as $k) { if ($this->db->dropForeignKey($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($delete_columns as $k => $v) { if ($this->db->alterTableDrop($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($delete_indexs as $k => $v) { if ($this->db->alterTableDropIndex($table_name, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($change_columns as $k => $v) { if ($this->db->alterTableChange($table_name, $k, $v, $k) && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($add_columns as $k => $v) { $current_key = array_search($k, $columns_keys); if ($this->db->alterTableAdd($table_name, $k, $v, $current_key > 0 ? $this->db->escapeColumn($columns_keys[$current_key - 1]) : "FIRST") && $this->db->affectedRows() > 0) { $change_column_num++; } } foreach ($add_index_columns as $k => $v) { if ($this->db->alterTableAddIndex($table_name, $v->generateName(), $v->getFields()) && $this->db->affectedRows() > 0) { $change_column_num++; } } // update callback $this->modelUpdate(); } else { if ($result = $this->db->createTable($table_name, $columns, $this->table_options) && $this->db->affectedRows() > 0) { $change_column_num++; } // update callback $this->modelUpdate(); } return $change_column_num; }
$class = substr($i, 0, -10); if ($class == 'DBObject') { continue; } $classes[] = $class; } try { foreach ($classes as $class) { echo 'Checking class ' . $class . "\n"; $datamap = call_user_func($class . '::getDataMap'); $table = call_user_func($class . '::getDBTable'); // Check if table exists echo 'Look for table ' . $table . "\n"; if (Database::tableExists($table)) { echo 'Table found, check columns' . "\n"; $existing_columns = Database::getTableColumns($table); echo 'Found ' . count($existing_columns) . ' columns in existing table : ' . implode(', ', $existing_columns) . "\n"; $required_columns = array_keys($datamap); echo 'Found ' . count($required_columns) . ' columns in required table : ' . implode(', ', $required_columns) . "\n"; $missing = array(); foreach ($required_columns as $c) { if (!in_array($c, $existing_columns)) { $missing[] = $c; } } if (count($missing)) { echo 'Found ' . count($missing) . ' missing columns in existing table : ' . implode(', ', $missing) . "\n"; foreach ($missing as $column) { Database::createTableColumn($table, $column, $datamap[$column]); } }
/** * Update database */ public static function updateStructure() { $class = static::getClassName(); Logger::info('Updating ' . $class . ' database structure'); $datamap = static::getDataMap(); $table = static::getDBTable(); // Check if table exists Logger::info('Look for table ' . $table); if (Database::tableExists($table)) { Logger::info('Table found, check columns'); $existing_columns = Database::getTableColumns($table); Logger::info('Found ' . count($existing_columns) . ' columns in existing table : ' . implode(', ', $existing_columns)); $required_columns = array_keys($datamap); Logger::info('Found ' . count($required_columns) . ' columns in required table : ' . implode(', ', $required_columns)); $missing = array(); foreach ($required_columns as $c) { if (!in_array($c, $existing_columns)) { $missing[] = $c; } } if (count($missing)) { Logger::info('Found ' . count($missing) . ' missing columns in existing table : ' . implode(', ', $missing)); foreach ($missing as $column) { Database::createTableColumn($table, $column, $datamap[$column]); } } $useless = array(); foreach ($existing_columns as $c) { if (!in_array($c, $required_columns)) { $useless[] = $c; } } if (count($useless)) { Logger::info('Found ' . count($useless) . ' useless columns in existing table : ' . implode(', ', $useless)); foreach ($useless as $column) { Database::removeTableColumn($table, $column); } } Logger::info('Check column format'); foreach ($required_columns as $column) { if (in_array($column, $missing)) { continue; } // Already created with the right format $problems = Database::checkTableColumnFormat($table, $column, $datamap[$column], function ($message) { Logger::info("\t" . $message); }); if ($problems) { Logger::info('Column ' . $column . ' has bad format, updating it'); Database::updateTableColumnFormat($table, $column, $datamap[$column], $problems); } } } else { Logger::info('Table is missing, create it'); Database::createTable($table, $datamap); } Logger::info('Done for ' . $class); }