1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-23 15:22:41 +01:00
phorge-phorge/resources/sql/patches/20130921.xmigratemaniphest.php
epriestley 7abe9dc4c0 Migrate all Maniphest transaction data to new storage
Summary:
Ref T2217. This is the risky, hard part; everything after this should be smooth sailing. This is //mostly// clean, except:

  - The old format would opportunistically combine a comment with some other transaction type if it could. We no longer do that, so:
    - When migrating, "edit" + "comment" transactions need to be split in two.
    - When editing now, we should no longer combine these transaction types.
    - These changes are pretty straightforward and low-impact.
  - This migration promotes "auxiliary field" data to the new CustomField/StandardField format, so that's not a straight migration either. The formats are very similar, though.

Broadly, this takes the same attack that the auth migration did: proxy all the code through to the new storage. `ManiphestTransaction` is now just an API on top of `ManiphestTransactionPro`, which is the new storage format. The two formats are very similar, so this was mostly a straight copy from one table to the other.

Test Plan:
  - Without performing the migration, made a bunch of edits and comments on tasks and verified the new code works correctly.
  - Droped the test data and performed the migration.
  - Looked at the resulting data for obvious discrepancies.
  - Looked at a bunch of tasks and their transaction history.
  - Used Conduit to pull transaction data.
  - Edited task description and clicked "View Details" on transaction.
  - Used batch editor.
  - Made a bunch more edits.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T2217

Differential Revision: https://secure.phabricator.com/D7068
2013-09-23 14:25:28 -07:00

147 lines
4.4 KiB
PHP

<?php
$task_table = new ManiphestTask();
$conn_w = $task_table->establishConnection('w');
$rows = new LiskRawMigrationIterator($conn_w, 'maniphest_transaction');
$conn_w->openTransaction();
$xaction_table = new ManiphestTransactionPro();
$comment_table = new ManiphestTransactionComment();
foreach ($rows as $row) {
$row_id = $row['id'];
$task_id = $row['taskID'];
echo "Migrating row {$row_id} (T{$task_id})...\n";
$task_row = queryfx_one(
$conn_w,
'SELECT phid FROM %T WHERE id = %d',
$task_table->getTableName(),
$task_id);
if (!$task_row) {
echo "Skipping, no such task.\n";
continue;
}
$task_phid = $task_row['phid'];
$has_comment = strlen(trim($row['comments']));
$xaction_type = $row['transactionType'];
$xaction_old = $row['oldValue'];
$xaction_new = $row['newValue'];
$xaction_source = $row['contentSource'];
$xaction_meta = $row['metadata'];
// Convert "aux" (auxiliary field) transactions to proper CustomField
// transactions. The formats are very similar, except that the type constant
// is different and the auxiliary key should be prefixed.
if ($xaction_type == 'aux') {
$xaction_meta = @json_decode($xaction_meta, true);
$xaction_meta = nonempty($xaction_meta, array());
$xaction_type = PhabricatorTransactions::TYPE_CUSTOMFIELD;
$aux_key = idx($xaction_meta, 'aux:key');
if (!preg_match('/^std:maniphest:/', $aux_key)) {
$aux_key = 'std:maniphest:'.$aux_key;
}
$xaction_meta = array(
'customfield:key' => $aux_key,
);
$xaction_meta = json_encode($xaction_meta);
}
// If this transaction did something other than just leaving a comment,
// insert a new transaction for that action. If there was a comment (or
// a comment in addition to an action) we'll insert that below.
if ($row['transactionType'] != 'comment') {
$xaction_phid = PhabricatorPHID::generateNewPHID(
PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST,
ManiphestPHIDTypeTask::TYPECONST);
queryfx(
$conn_w,
'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy,
commentPHID, commentVersion, transactionType, oldValue, newValue,
contentSource, metadata, dateCreated, dateModified)
VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)',
$xaction_table->getTableName(),
$xaction_phid,
$row['authorPHID'],
$task_phid,
'public',
$row['authorPHID'],
null,
0,
$xaction_type,
$xaction_old,
$xaction_new,
$xaction_source,
$xaction_meta,
$row['dateCreated'],
$row['dateModified']);
}
// Now, if the old transaction has a comment, we insert an explicit new
// transaction for it.
if ($has_comment) {
$comment_phid = PhabricatorPHID::generateNewPHID(
PhabricatorPHIDConstants::PHID_TYPE_XCMT,
ManiphestPHIDTypeTask::TYPECONST);
$comment_version = 1;
$comment_xaction_phid = PhabricatorPHID::generateNewPHID(
PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST,
ManiphestPHIDTypeTask::TYPECONST);
// Insert the comment data.
queryfx(
$conn_w,
'INSERT INTO %T (phid, transactionPHID, authorPHID, viewPolicy,
editPolicy, commentVersion, content, contentSource, isDeleted,
dateCreated, dateModified)
VALUES (%s, %s, %s, %s, %s, %d, %s, %s, %d, %d, %d)',
$comment_table->getTableName(),
$comment_phid,
$comment_xaction_phid,
$row['authorPHID'],
'public',
$row['authorPHID'],
$comment_version,
$row['comments'],
$xaction_source,
0,
$row['dateCreated'],
$row['dateModified']);
queryfx(
$conn_w,
'INSERT INTO %T (phid, authorPHID, objectPHID, viewPolicy, editPolicy,
commentPHID, commentVersion, transactionType, oldValue, newValue,
contentSource, metadata, dateCreated, dateModified)
VALUES (%s, %s, %s, %s, %s, %s, %d, %s, %ns, %ns, %s, %s, %d, %d)',
$xaction_table->getTableName(),
$comment_xaction_phid,
$row['authorPHID'],
$task_phid,
'public',
$row['authorPHID'],
$comment_phid,
$comment_version,
PhabricatorTransactions::TYPE_COMMENT,
$xaction_old,
$xaction_new,
$xaction_source,
$xaction_meta,
$row['dateCreated'],
$row['dateModified']);
}
}
$conn_w->saveTransaction();
echo "Done.\n";