| Current File : /home/jvzmxxx/wiki/extensions/Flow/includes/Data/Storage/PostRevisionStorage.php |
<?php
namespace Flow\Data\Storage;
use Flow\DbFactory;
use Flow\Model\UUID;
use Flow\Repository\TreeRepository;
/**
* SQL storage and query for PostRevision instances
*/
class PostRevisionStorage extends RevisionStorage {
/**
* @var TreeRepository
*/
protected $treeRepo;
/**
* @param DbFactory $dbFactory
* @param array|false $externalStore List of external store servers available for insert
* or false to disable. See $wgFlowExternalStore.
* @param TreeRepository $treeRepo
*/
public function __construct( DbFactory $dbFactory, $externalStore, TreeRepository $treeRepo ) {
parent::__construct( $dbFactory, $externalStore );
$this->treeRepo = $treeRepo;
}
protected function joinTable() {
return 'flow_tree_revision';
}
protected function joinField() {
return 'tree_rev_id';
}
protected function getRevType() {
return 'post';
}
protected function insertRelated( array $rows ) {
if ( ! is_array( reset( $rows ) ) ) {
$rows = array( $rows );
}
$trees = array();
foreach( $rows as $key => $row ) {
$trees[$key] = $this->splitUpdate( $row, 'tree' );
}
$dbw = $this->dbFactory->getDB( DB_MASTER );
$res = $dbw->insert(
$this->joinTable(),
$this->preprocessNestedSqlArray( $trees ),
__METHOD__
);
// If this is a brand new root revision it needs to be added to the tree
// If it has a rev_parent_id then its already a part of the tree
if ( $res ) {
foreach( $rows as $row ) {
if ( $row['rev_parent_id'] === null ) {
$res = $res && $this->treeRepo->insert(
UUID::create( $row['tree_rev_descendant_id'] ),
UUID::create( $row['tree_parent_id'] )
);
}
}
}
if ( !$res ) {
return array();
}
return $rows;
}
// Topic split will primarily be done through the TreeRepository directly, but
// we will need to accept updates to the denormalized tree_parent_id field for
// the new root post
protected function updateRelated( array $changes, array $old ) {
$treeChanges = $this->splitUpdate( $changes, 'tree' );
// no changes to be performed
if ( !$treeChanges ) {
return $changes;
}
$dbw = $this->dbFactory->getDB( DB_MASTER );
$res = $dbw->update(
$this->joinTable(),
$this->preprocessSqlArray( $treeChanges ),
array( 'tree_rev_id' => $old['tree_rev_id'] ),
__METHOD__
);
if ( !$res ) {
return array();
}
return $changes;
}
// this doesn't delete the whole post, it just deletes the revision.
// The post will *always* exist in the tree structure, its just a tree
// and we aren't going to re-parent its children;
protected function removeRelated( array $row ) {
return $this->dbFactory->getDB( DB_MASTER )->delete(
$this->joinTable(),
$this->preprocessSqlArray( array( $this->joinField() => $row['rev_id'] ) )
);
}
}