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