| Current File : /home/jvzmxxx/wiki1/extensions/Echo/includes/mapper/EventMapper.php |
<?php
/**
* Database mapper for EchoEvent model, which is an immutable class, there should
* not be any update to it
*/
class EchoEventMapper extends EchoAbstractMapper {
/**
* Insert an event record
*
* @param EchoEvent
* @return int|bool
*/
public function insert( EchoEvent $event ) {
$dbw = $this->dbFactory->getEchoDb( DB_MASTER );
$id = $dbw->nextSequenceValue( 'echo_event_id' );
$row = $event->toDbArray();
if ( $id ) {
$row['event_id'] = $id;
}
$res = $dbw->insert( 'echo_event', $row, __METHOD__ );
if ( $res ) {
if ( !$id ) {
$id = $dbw->insertId();
}
$listeners = $this->getMethodListeners( __FUNCTION__ );
foreach ( $listeners as $listener ) {
$dbw->onTransactionIdle( $listener );
}
return $id;
} else {
return false;
}
}
/**
* Create an EchoEvent by id
*
* @param int
* @param boolean
* @return EchoEvent|bool false if it wouldn't load/unserialize
* @throws MWException
*/
public function fetchById( $id, $fromMaster = false ) {
$db = $fromMaster ? $this->dbFactory->getEchoDb( DB_MASTER ) : $this->dbFactory->getEchoDb( DB_SLAVE );
$row = $db->selectRow( 'echo_event', '*', array( 'event_id' => $id ), __METHOD__ );
if ( !$row && !$fromMaster ) {
return $this->fetchById( $id, true );
} elseif ( !$row ) {
throw new MWException( "No EchoEvent found with ID: $id" );
}
return EchoEvent::newFromRow( $row );
}
/**
* @param int[] $eventIds
* @param bool $deleted
* @return bool|ResultWrapper
*/
public function toggleDeleted( $eventIds, $deleted ) {
$dbw = $this->dbFactory->getEchoDb( DB_MASTER );
$selectDeleted = $deleted ? 0 : 1;
$setDeleted = $deleted ? 1 : 0;
$res = $dbw->update(
'echo_event',
array(
'event_deleted' => $setDeleted,
),
array(
'event_deleted' => $selectDeleted,
'event_id' => $eventIds,
),
__METHOD__
);
return $res;
}
/**
* Fetch events associated with a page
*
* @param int $pageId
* @return EchoEvent[] Events
*/
public function fetchByPage( $pageId ) {
$events = array();
$dbr = $this->dbFactory->getEchoDb( DB_SLAVE );
$res = $dbr->select(
array( 'echo_event', 'echo_target_page' ),
array( '*' ),
array(
'etp_page' => $pageId
),
__METHOD__,
array( 'GROUP BY' => 'etp_event' ),
array( 'echo_target_page' => array( 'INNER JOIN', 'event_id=etp_event' ) )
);
if ( $res ) {
foreach ( $res as $row ) {
$events[] = EchoEvent::newFromRow( $row );
}
}
return $events;
}
/**
* Fetch event IDs associated with a page
*
* @param int $pageId
* @return int[] Event IDs
*/
public function fetchIdsByPage( $pageId ) {
$events = $this->fetchByPage( $pageId );
$eventIds = array_map(
function ( EchoEvent $event ) {
return $event->getId();
},
$events
);
return $eventIds;
}
/**
* Fetch events unread by a user and associated with a page
*
* @param User $user
* @param int $pageId
* @return EchoEvent[]
*/
public function fetchUnreadByUserAndPage( User $user, $pageId ) {
$dbr = $this->dbFactory->getEchoDb( DB_SLAVE );
$res = $dbr->select(
array( 'echo_event', 'echo_notification', 'echo_target_page' ),
'*',
array(
'event_deleted' => 0,
'notification_user' => $user->getId(),
'notification_read_timestamp' => null,
'etp_page' => $pageId,
),
__METHOD__,
null,
array(
'echo_target_page' => array( 'INNER JOIN', 'etp_event=event_id' ),
'echo_notification' => array( 'INNER JOIN', array( 'notification_event=event_id' ) ),
)
);
$data = array();
foreach ( $res as $row ) {
$data[] = EchoEvent::newFromRow( $row );
}
return $data;
}
}