mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
Migrate Audit comment text into new storage
Summary: Ref T4896. This is substantially similar to D8196. Migrate the comment text out of the `audit_comment` table and into the `audit_transaction_comment` table. Do double reads on `PhabricatorAuditComment` so the APIs aren't disturbed. The old table is still updated. Test Plan: - Before applying migration, cleared cache and browsed around. Things looked fine, except no comment text. - Applied migration. - Cleared cache, browsed around, saw all my old comments. - Added some new comments. - Spot checked migrated and new rows in database. Reviewers: btrahan, joshuaspence Reviewed By: joshuaspence Subscribers: epriestley Maniphest Tasks: T4896 Differential Revision: https://secure.phabricator.com/D10020
This commit is contained in:
parent
dc5c87f74c
commit
3d78c0eff7
3 changed files with 157 additions and 5 deletions
61
resources/sql/autopatches/20140722.audit.4.migtext.php
Normal file
61
resources/sql/autopatches/20140722.audit.4.migtext.php
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
$conn_w = id(new PhabricatorAuditTransaction())->establishConnection('w');
|
||||
$rows = new LiskRawMigrationIterator($conn_w, 'audit_comment');
|
||||
|
||||
$content_source = PhabricatorContentSource::newForSource(
|
||||
PhabricatorContentSource::SOURCE_LEGACY,
|
||||
array())->serialize();
|
||||
|
||||
echo "Migrating Audit comment text to modern storage...\n";
|
||||
foreach ($rows as $row) {
|
||||
$id = $row['id'];
|
||||
echo "Migrating Audit comment {$id}...\n";
|
||||
if (!strlen($row['content'])) {
|
||||
echo "Comment has no text, continuing.\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
$xaction_phid = PhabricatorPHID::generateNewPHID(
|
||||
PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST,
|
||||
PhabricatorRepositoryCommitPHIDType::TYPECONST);
|
||||
|
||||
$comment_phid = PhabricatorPHID::generateNewPHID(
|
||||
PhabricatorPHIDConstants::PHID_TYPE_XCMT,
|
||||
PhabricatorRepositoryCommitPHIDType::TYPECONST);
|
||||
|
||||
queryfx(
|
||||
$conn_w,
|
||||
'INSERT IGNORE INTO %T
|
||||
(phid, transactionPHID, authorPHID, viewPolicy, editPolicy,
|
||||
commentVersion, content, contentSource, isDeleted,
|
||||
dateCreated, dateModified, commitPHID, pathID,
|
||||
legacyCommentID)
|
||||
VALUES (%s, %s, %s, %s, %s,
|
||||
%d, %s, %s, %d,
|
||||
%d, %d, %s, %nd,
|
||||
%d)',
|
||||
'audit_transaction_comment',
|
||||
|
||||
// phid, transactionPHID, authorPHID, viewPolicy, editPolicy
|
||||
$comment_phid,
|
||||
$xaction_phid,
|
||||
$row['actorPHID'],
|
||||
'public',
|
||||
$row['actorPHID'],
|
||||
|
||||
// commentVersion, content, contentSource, isDeleted
|
||||
1,
|
||||
$row['content'],
|
||||
$content_source,
|
||||
0,
|
||||
|
||||
// dateCreated, dateModified, commitPHID, pathID, legacyCommentID
|
||||
$row['dateCreated'],
|
||||
$row['dateModified'],
|
||||
$row['targetPHID'],
|
||||
null,
|
||||
$row['id']);
|
||||
}
|
||||
|
||||
echo "Done.\n";
|
|
@ -12,16 +12,40 @@ final class PhabricatorAuditComment extends PhabricatorAuditDAO
|
|||
protected $actorPHID;
|
||||
protected $targetPHID;
|
||||
protected $action;
|
||||
protected $content;
|
||||
protected $content = '';
|
||||
protected $metadata = array();
|
||||
|
||||
private $proxyComment;
|
||||
|
||||
public static function loadComments(
|
||||
PhabricatorUser $viewer,
|
||||
$commit_phid) {
|
||||
|
||||
return id(new PhabricatorAuditComment())->loadAllWhere(
|
||||
$comments = id(new PhabricatorAuditComment())->loadAllWhere(
|
||||
'targetPHID = %s',
|
||||
$commit_phid);
|
||||
|
||||
if ($comments) {
|
||||
$table = new PhabricatorAuditTransactionComment();
|
||||
$conn_r = $table->establishConnection('r');
|
||||
|
||||
$data = queryfx_all(
|
||||
$conn_r,
|
||||
'SELECT * FROM %T WHERE legacyCommentID IN (%Ld) AND pathID IS NULL',
|
||||
$table->getTableName(),
|
||||
mpull($comments, 'getID'));
|
||||
$texts = $table->loadAllFromArray($data);
|
||||
$texts = mpull($texts, null, 'getLegacyCommentID');
|
||||
|
||||
foreach ($comments as $comment) {
|
||||
$text = idx($texts, $comment->getID());
|
||||
if ($text) {
|
||||
$comment->setProxyComment($text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $comments;
|
||||
}
|
||||
|
||||
public function getConfiguration() {
|
||||
|
@ -38,6 +62,70 @@ final class PhabricatorAuditComment extends PhabricatorAuditDAO
|
|||
}
|
||||
|
||||
|
||||
public function getContent() {
|
||||
return $this->getProxyComment()->getContent();
|
||||
}
|
||||
|
||||
public function setContent($content) {
|
||||
// NOTE: We no longer read this field, but there's no cost to continuing
|
||||
// to write it in case something goes horribly wrong, since it makes it
|
||||
// far easier to back out of this.
|
||||
$this->content = $content;
|
||||
$this->getProxyComment()->setContent($content);
|
||||
return $this;
|
||||
}
|
||||
|
||||
private function getProxyComment() {
|
||||
if (!$this->proxyComment) {
|
||||
$this->proxyComment = new PhabricatorAuditTransactionComment();
|
||||
}
|
||||
return $this->proxyComment;
|
||||
}
|
||||
|
||||
public function setProxyComment(PhabricatorAuditTransactionComment $proxy) {
|
||||
if ($this->proxyComment) {
|
||||
throw new Exception(pht('You can not overwrite a proxy comment.'));
|
||||
}
|
||||
$this->proxyComment = $proxy;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setTargetPHID($target_phid) {
|
||||
$this->getProxyComment()->setCommitPHID($target_phid);
|
||||
return parent::setTargetPHID($target_phid);
|
||||
}
|
||||
|
||||
public function save() {
|
||||
$this->openTransaction();
|
||||
$result = parent::save();
|
||||
|
||||
if (strlen($this->getContent())) {
|
||||
$content_source = PhabricatorContentSource::newForSource(
|
||||
PhabricatorContentSource::SOURCE_LEGACY,
|
||||
array());
|
||||
|
||||
$xaction_phid = PhabricatorPHID::generateNewPHID(
|
||||
PhabricatorApplicationTransactionTransactionPHIDType::TYPECONST,
|
||||
PhabricatorRepositoryCommitPHIDType::TYPECONST);
|
||||
|
||||
$proxy = $this->getProxyComment();
|
||||
$proxy
|
||||
->setAuthorPHID($this->getActorPHID())
|
||||
->setViewPolicy('public')
|
||||
->setEditPolicy($this->getActorPHID())
|
||||
->setContentSource($content_source)
|
||||
->setCommentVersion(1)
|
||||
->setLegacyCommentID($this->getID())
|
||||
->setTransactionPHID($xaction_phid)
|
||||
->save();
|
||||
}
|
||||
|
||||
$this->saveTransaction();
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorMarkupInterface Implementation )-------------------------- */
|
||||
|
||||
|
||||
|
|
|
@ -33,7 +33,8 @@ final class PhabricatorAuditInlineComment
|
|||
$commit_phid) {
|
||||
|
||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
||||
'authorPHID = %s AND commitPHID = %s AND transactionPHID IS NULL',
|
||||
'authorPHID = %s AND commitPHID = %s AND transactionPHID IS NULL
|
||||
AND pathID IS NOT NULL',
|
||||
$viewer->getPHID(),
|
||||
$commit_phid);
|
||||
|
||||
|
@ -45,7 +46,8 @@ final class PhabricatorAuditInlineComment
|
|||
$commit_phid) {
|
||||
|
||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
||||
'commitPHID = %s AND transactionPHID IS NOT NULL',
|
||||
'commitPHID = %s AND transactionPHID IS NOT NULL
|
||||
AND pathID IS NOT NULL',
|
||||
$commit_phid);
|
||||
|
||||
return self::buildProxies($inlines);
|
||||
|
@ -58,7 +60,8 @@ final class PhabricatorAuditInlineComment
|
|||
|
||||
if ($path_id === null) {
|
||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
||||
'commitPHID = %s AND (transactionPHID IS NOT NULL OR authorPHID = %s)',
|
||||
'commitPHID = %s AND (transactionPHID IS NOT NULL OR authorPHID = %s)
|
||||
AND pathID IS NOT NULL',
|
||||
$commit_phid,
|
||||
$viewer->getPHID());
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue