mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-28 16:30:59 +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 $actorPHID;
|
||||||
protected $targetPHID;
|
protected $targetPHID;
|
||||||
protected $action;
|
protected $action;
|
||||||
protected $content;
|
protected $content = '';
|
||||||
protected $metadata = array();
|
protected $metadata = array();
|
||||||
|
|
||||||
|
private $proxyComment;
|
||||||
|
|
||||||
public static function loadComments(
|
public static function loadComments(
|
||||||
PhabricatorUser $viewer,
|
PhabricatorUser $viewer,
|
||||||
$commit_phid) {
|
$commit_phid) {
|
||||||
|
|
||||||
return id(new PhabricatorAuditComment())->loadAllWhere(
|
$comments = id(new PhabricatorAuditComment())->loadAllWhere(
|
||||||
'targetPHID = %s',
|
'targetPHID = %s',
|
||||||
$commit_phid);
|
$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() {
|
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 )-------------------------- */
|
/* -( PhabricatorMarkupInterface Implementation )-------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,8 @@ final class PhabricatorAuditInlineComment
|
||||||
$commit_phid) {
|
$commit_phid) {
|
||||||
|
|
||||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
$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(),
|
$viewer->getPHID(),
|
||||||
$commit_phid);
|
$commit_phid);
|
||||||
|
|
||||||
|
@ -45,7 +46,8 @@ final class PhabricatorAuditInlineComment
|
||||||
$commit_phid) {
|
$commit_phid) {
|
||||||
|
|
||||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
$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);
|
$commit_phid);
|
||||||
|
|
||||||
return self::buildProxies($inlines);
|
return self::buildProxies($inlines);
|
||||||
|
@ -58,7 +60,8 @@ final class PhabricatorAuditInlineComment
|
||||||
|
|
||||||
if ($path_id === null) {
|
if ($path_id === null) {
|
||||||
$inlines = id(new PhabricatorAuditTransactionComment())->loadAllWhere(
|
$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,
|
$commit_phid,
|
||||||
$viewer->getPHID());
|
$viewer->getPHID());
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue