<?php // Convert dashboards to a new storage format. The old storage format looks // like this: // { // "0": ["PHID-DSHP-A", ...], // "1": ["PHID-DSHP-B", ...] // } // The new storage format looks like this: // [ // { // "panelKey": "abcdefgh", // "panelPHID": "PHID-DSHP-A", // "columnKey": "left" // }, // ... // ] // One major issue with the old storage format is that when multiple copies of // a single dashboard panel appeared on the same dashboard, the UI had a lot // of difficulty acting on a particular copy because copies were identified // only by PHID and all copies of the same panel have the same panel PHID. $dashboard_table = new PhabricatorDashboard(); $conn = $dashboard_table->establishConnection('r'); $table_name = $dashboard_table->getTableName(); $rows = new LiskRawMigrationIterator($conn, $table_name); foreach ($rows as $row) { $config = $row['layoutConfig']; try { $config = phutil_json_decode($config); } catch (Exception $ex) { $config = array(); } if (!is_array($config)) { $config = array(); } $panels = idx($config, 'panelLocations'); if (!is_array($panels)) { $panels = array(); } if (idx($config, 'layoutMode') === 'layout-mode-full') { $column_map = array( 0 => 'main', ); } else { $column_map = array( 0 => 'left', 1 => 'right', ); } $panel_list = array(); foreach ($panels as $column_idx => $panel_phids) { $column_key = idx($column_map, $column_idx, 'unknown'); foreach ($panel_phids as $panel_phid) { $panel_list[] = array( 'panelKey' => Filesystem::readRandomCharacters(8), 'columnKey' => $column_key, 'panelPHID' => $panel_phid, ); } } unset($config['panelLocations']); $config['panels'] = $panel_list; queryfx( $conn, 'UPDATE %R SET layoutConfig = %s WHERE id = %d', $dashboard_table, phutil_json_encode($config), $row['id']); }