From cd7171ec6e116c08bb301aa7c2f30403208745b5 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 26 Feb 2014 16:52:30 -0800 Subject: [PATCH] Migrate old AuxiliaryField storage to modern CustomField storage Summary: Ref T2222. Ref T3886. Differential has a legacy storage table for auxiliary fields; move the data to modern storage. Test Plan: - Ran migration. - Verified fields still worked properly afterward (view, edit, etc). Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T3886, T2222 Differential Revision: https://secure.phabricator.com/D8355 --- .../20140226.dxcustom.1.fielddata.php | 22 +++++++++++++ src/__phutil_library_map__.php | 1 - .../editor/DifferentialRevisionEditor.php | 18 +++++----- .../storage/DifferentialAuxiliaryField.php | 33 ++++++++----------- .../storage/DifferentialRevision.php | 7 ---- 5 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 resources/sql/autopatches/20140226.dxcustom.1.fielddata.php diff --git a/resources/sql/autopatches/20140226.dxcustom.1.fielddata.php b/resources/sql/autopatches/20140226.dxcustom.1.fielddata.php new file mode 100644 index 0000000000..aa1adf41be --- /dev/null +++ b/resources/sql/autopatches/20140226.dxcustom.1.fielddata.php @@ -0,0 +1,22 @@ +establishConnection('w'); +$rows = new LiskRawMigrationIterator($conn_w, 'differential_auxiliaryfield'); + +echo "Modernizing Differential auxiliary field storage...\n"; + +$table_name = id(new DifferentialCustomFieldStorage())->getTableName(); +foreach ($rows as $row) { + $id = $row['id']; + echo "Migrating row {$id}...\n"; + queryfx( + $conn_w, + 'INSERT IGNORE INTO %T (objectPHID, fieldIndex, fieldValue) + VALUES (%s, %s, %s)', + $table_name, + $row['revisionPHID'], + PhabricatorHash::digestForIndex($row['name']), + $row['value']); +} + +echo "Done.\n"; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index c7f4fd2c88..526e7d788f 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2891,7 +2891,6 @@ phutil_register_library_map(array( 'DifferentialAuditorsFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialAuthorField' => 'DifferentialCustomField', 'DifferentialAuthorFieldSpecification' => 'DifferentialFieldSpecification', - 'DifferentialAuxiliaryField' => 'DifferentialDAO', 'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail', diff --git a/src/applications/differential/editor/DifferentialRevisionEditor.php b/src/applications/differential/editor/DifferentialRevisionEditor.php index 10411f2346..7d7bdac7cd 100644 --- a/src/applications/differential/editor/DifferentialRevisionEditor.php +++ b/src/applications/differential/editor/DifferentialRevisionEditor.php @@ -707,14 +707,14 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { $revision = $this->revision; - $fields = id(new DifferentialAuxiliaryField())->loadAllWhere( - 'revisionPHID = %s AND name IN (%Ls)', - $revision->getPHID(), - array_keys($aux_map)); - $fields = mpull($fields, null, 'getName'); + $fields = id(new DifferentialCustomFieldStorage())->loadAllWhere( + 'objectPHID = %s', + $revision->getPHID()); + $fields = mpull($fields, null, 'getFieldIndex'); foreach ($aux_map as $key => $val) { - $obj = idx($fields, $key); + $index = PhabricatorHash::digestForIndex($key); + $obj = idx($fields, $index); if (!strlen($val)) { // If the new value is empty, just delete the old row if one exists and // don't add a new row if it doesn't. @@ -723,9 +723,9 @@ final class DifferentialRevisionEditor extends PhabricatorEditor { } } else { if (!$obj) { - $obj = new DifferentialAuxiliaryField(); - $obj->setRevisionPHID($revision->getPHID()); - $obj->setName($key); + $obj = new DifferentialCustomFieldStorage(); + $obj->setObjectPHID($revision->getPHID()); + $obj->setFieldIndex($index); } if ($obj->getValue() !== $val) { diff --git a/src/applications/differential/storage/DifferentialAuxiliaryField.php b/src/applications/differential/storage/DifferentialAuxiliaryField.php index 0584956562..6e15423bcb 100644 --- a/src/applications/differential/storage/DifferentialAuxiliaryField.php +++ b/src/applications/differential/storage/DifferentialAuxiliaryField.php @@ -1,20 +1,6 @@ 32) { - throw new Exception( - "Tried to set name '{$name}' for a Differential auxiliary field; ". - "auxiliary field names must be no longer than 32 characters."); - } - $this->name = $name; - return $this; - } +final class DifferentialAuxiliaryField { public static function loadFromStorage( DifferentialRevision $revision, @@ -24,11 +10,20 @@ final class DifferentialAuxiliaryField extends DifferentialDAO { $storage_keys = array_filter(mpull($aux_fields, 'getStorageKey')); $field_data = array(); if ($storage_keys) { - $field_data = id(new DifferentialAuxiliaryField())->loadAllWhere( - 'revisionPHID = %s AND name IN (%Ls)', + $index_map = array(); + foreach ($storage_keys as $key) { + $index_map[PhabricatorHash::digestForIndex($key)] = $key; + } + + $index_data = id(new DifferentialCustomFieldStorage())->loadAllWhere( + 'objectPHID = %s AND fieldIndex IN (%Ls)', $revision->getPHID(), - $storage_keys); - $field_data = mpull($field_data, 'getValue', 'getName'); + array_keys($index_map)); + $index_data = mpull($index_data, 'getFieldValue', 'getFieldIndex'); + + foreach ($index_data as $index => $data) { + $field_data[$index_map[$index]] = $data; + } } foreach ($aux_fields as $aux_field) { diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php index 76379884d6..d49ee400e6 100644 --- a/src/applications/differential/storage/DifferentialRevision.php +++ b/src/applications/differential/storage/DifferentialRevision.php @@ -209,13 +209,6 @@ final class DifferentialRevision extends DifferentialDAO $inline->delete(); } - $fields = id(new DifferentialAuxiliaryField())->loadAllWhere( - 'revisionPHID = %s', - $this->getPHID()); - foreach ($fields as $field) { - $field->delete(); - } - // we have to do paths a little differentally as they do not have // an id or phid column for delete() to act on $dummy_path = new DifferentialAffectedPath();