/**
* Get the Query database connection (read-only)
- * @return DatabaseBase
+ * @return Database
*/
protected function getDB() {
if ( is_null( $this->mDb ) ) {
* @param string $name Name to assign to the database connection
* @param int $db One of the DB_* constants
* @param array $groups Query groups
- * @return DatabaseBase
+ * @return Database
*/
public function selectNamedDB( $name, $db, $groups ) {
$this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups );
* Blank the internal arrays with query parameters
*/
protected function resetQueryParams() {
- $this->tables = array();
- $this->where = array();
- $this->fields = array();
- $this->options = array();
- $this->join_conds = array();
+ $this->tables = [];
+ $this->where = [];
+ $this->fields = [];
+ $this->options = [];
+ $this->join_conds = [];
}
/**
/**
* Add a set of JOIN conditions to the internal array
*
- * JOIN conditions are formatted as array( tablename => array(jointype,
- * conditions) e.g. array('page' => array('LEFT JOIN',
- * 'page_id=rev_page')) . conditions may be a string or an
- * addWhere()-style array
+ * JOIN conditions are formatted as [ tablename => [ jointype, conditions ] ]
+ * e.g. [ 'page' => [ 'LEFT JOIN', 'page_id=rev_page' ] ].
+ * Conditions may be a string or an addWhere()-style array.
* @param array $join_conds JOIN conditions
*/
protected function addJoinConds( $join_conds ) {
/**
* Add a set of WHERE clauses to the internal array.
- * Clauses can be formatted as 'foo=bar' or array('foo' => 'bar'),
+ * Clauses can be formatted as 'foo=bar' or [ 'foo' => 'bar' ],
* the latter only works if the value is a constant (i.e. not another field)
*
* If $value is an empty array, this function does nothing.
*
- * For example, array('foo=bar', 'baz' => 3, 'bla' => 'foo') translates
+ * For example, [ 'foo=bar', 'baz' => 3, 'bla' => 'foo' ] translates
* to "foo=bar AND baz='3' AND bla='foo'"
* @param string|array $value
*/
// Append ORDER BY
$optionOrderBy = isset( $this->options['ORDER BY'] )
? (array)$this->options['ORDER BY']
- : array();
+ : [];
$optionOrderBy[] = $order;
$this->addOption( 'ORDER BY', $optionOrderBy );
}
* @param string $method Function the query should be attributed to.
* You should usually use __METHOD__ here
* @param array $extraQuery Query data to add but not store in the object
- * Format is array(
+ * Format is [
* 'tables' => ...,
* 'fields' => ...,
* 'where' => ...,
* 'options' => ...,
* 'join_conds' => ...
- * )
+ * ]
+ * @param array|null &$hookData If set, the ApiQueryBaseBeforeQuery and
+ * ApiQueryBaseAfterQuery hooks will be called, and the
+ * ApiQueryBaseProcessRow hook will be expected.
* @return ResultWrapper
*/
- protected function select( $method, $extraQuery = array() ) {
+ protected function select( $method, $extraQuery = [], array &$hookData = null ) {
$tables = array_merge(
$this->tables,
- isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : array()
+ isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : []
);
$fields = array_merge(
$this->fields,
- isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : array()
+ isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : []
);
$where = array_merge(
$this->where,
- isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : array()
+ isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : []
);
$options = array_merge(
$this->options,
- isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : array()
+ isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : []
);
$join_conds = array_merge(
$this->join_conds,
- isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : array()
+ isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : []
);
+ if ( $hookData !== null ) {
+ Hooks::run( 'ApiQueryBaseBeforeQuery',
+ [ $this, &$tables, &$fields, &$where, &$options, &$join_conds, &$hookData ]
+ );
+ }
+
$res = $this->getDB()->select( $tables, $fields, $where, $method, $options, $join_conds );
+ if ( $hookData !== null ) {
+ Hooks::run( 'ApiQueryBaseAfterQuery', [ $this, $res, &$hookData ] );
+ }
+
return $res;
}
+ /**
+ * Call the ApiQueryBaseProcessRow hook
+ *
+ * Generally, a module that passed $hookData to self::select() will call
+ * this just before calling ApiResult::addValue(), and treat a false return
+ * here in the same way it treats a false return from addValue().
+ *
+ * @since 1.28
+ * @param object $row Database row
+ * @param array &$data Data to be added to the result
+ * @param array &$hookData Hook data from ApiQueryBase::select()
+ * @return bool Return false if row processing should end with continuation
+ */
+ protected function processRow( $row, array &$data, array &$hookData ) {
+ return Hooks::run( 'ApiQueryBaseProcessRow', [ $this, $row, &$data, &$hookData ] );
+ }
+
/**
* @param string $query
* @param string $protocol
*/
public function showHiddenUsersAddBlockInfo( $showBlockInfo ) {
$this->addTables( 'ipblocks' );
- $this->addJoinConds( array(
- 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ),
- ) );
+ $this->addJoinConds( [
+ 'ipblocks' => [ 'LEFT JOIN', 'ipb_user=user_id' ],
+ ] );
$this->addFields( 'ipb_deleted' );
if ( $showBlockInfo ) {
- $this->addFields( array(
+ $this->addFields( [
'ipb_id',
'ipb_by',
'ipb_by_text',
'ipb_reason',
'ipb_expiry',
'ipb_timestamp'
- ) );
+ ] );
}
// Don't show hidden names
$result = $this->getResult();
ApiResult::setIndexedTagName( $data, $this->getModulePrefix() );
- return $result->addValue( array( 'query', 'pages', intval( $pageId ) ),
+ return $result->addValue( [ 'query', 'pages', intval( $pageId ) ],
$this->getModuleName(),
$data );
}
$elemname = $this->getModulePrefix();
}
$result = $this->getResult();
- $fit = $result->addValue( array( 'query', 'pages', $pageId,
- $this->getModuleName() ), null, $item );
+ $fit = $result->addValue( [ 'query', 'pages', $pageId,
+ $this->getModuleName() ], null, $item );
if ( !$fit ) {
return false;
}
- $result->addIndexedTagName( array( 'query', 'pages', $pageId,
- $this->getModuleName() ), $elemname );
+ $result->addIndexedTagName( [ 'query', 'pages', $pageId,
+ $this->getModuleName() ], $elemname );
return true;
}
$t = Title::makeTitleSafe( $namespace, $titlePart . 'x' );
if ( !$t || $t->hasFragment() ) {
// Invalid title (e.g. bad chars) or contained a '#'.
- $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
+ $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
}
if ( $namespace != $t->getNamespace() || $t->isExternal() ) {
// This can happen in two cases. First, if you call titlePartToKey with a title part
// difficult to handle such a case. Such cases cannot exist and are therefore treated
// as invalid user input. The second case is when somebody specifies a title interwiki
// prefix.
- $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
+ $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
}
return substr( $t->getDBkey(), 0, -1 );
$t = Title::newFromText( $titlePart . 'x', $defaultNamespace );
if ( !$t || $t->hasFragment() || $t->isExternal() ) {
// Invalid title (e.g. bad chars) or contained a '#'.
- $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
+ $this->dieUsageMsg( [ 'invalidtitle', $titlePart ] );
}
- return array( $t->getNamespace(), substr( $t->getDBkey(), 0, -1 ) );
+ return [ $t->getNamespace(), substr( $t->getDBkey(), 0, -1 ) ];
}
/**