From 0e4531da1a70da428bd243521534c680502fbdd5 Mon Sep 17 00:00:00 2001 From: Alec Smecher Date: Fri, 2 Oct 2020 16:19:58 -0700 Subject: [PATCH] pkp/pkp-lib#6264 DAO adaptations --- classes/context/CategoryDAO.inc.php | 27 +++---- classes/db/DAO.inc.php | 70 ++++--------------- classes/db/SchemaDAO.inc.php | 12 ++-- classes/file/TemporaryFileDAO.inc.php | 47 ++++--------- classes/install/Installer.inc.php | 2 - classes/mail/EmailTemplateDAO.inc.php | 19 +++-- classes/security/RoleDAO.inc.php | 12 ++-- classes/security/UserGroupDAO.inc.php | 10 ++- .../StageAssignmentDAO.inc.php | 14 ++-- classes/submission/EditDecisionDAO.inc.php | 25 ++++--- classes/submission/SubmissionFileDAO.inc.php | 9 +-- .../ReviewAssignmentDAO.inc.php | 38 +++------- .../reviewRound/ReviewRoundDAO.inc.php | 26 +++---- classes/user/UserStageAssignmentDAO.inc.php | 70 ++++++------------- 14 files changed, 117 insertions(+), 264 deletions(-) diff --git a/classes/context/CategoryDAO.inc.php b/classes/context/CategoryDAO.inc.php index e0994b85538..2b172e1cd75 100644 --- a/classes/context/CategoryDAO.inc.php +++ b/classes/context/CategoryDAO.inc.php @@ -22,10 +22,10 @@ class CategoryDAO extends DAO { * @param $categoryId int * @param $contextId int optional * @param $parentId int optional - * @return Category + * @return Category? */ function getById($categoryId, $contextId = null, $parentId = null) { - $params = array((int) $categoryId); + $params = [(int) $categoryId]; if ($contextId) $params[] = (int) $contextId; if ($parentId) $params[] = (int) $parentId; @@ -38,33 +38,24 @@ function getById($categoryId, $contextId = null, $parentId = null) { $params ); - $returner = null; - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** * Retrieve a category by path. * @param $path string * @param $contextId int - * @return Category + * @return Category? */ function getByPath($path, $contextId) { - $returner = null; $result = $this->retrieve( 'SELECT * FROM categories WHERE path = ? AND context_id = ?', - array((string) $path, (int) $contextId) + [(string) $path, (int) $contextId] ); - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** @@ -112,7 +103,7 @@ public function getByPublicationId($publicationId) { FROM categories c INNER JOIN publication_categories pc ON (pc.category_id = c.category_id) WHERE pc.publication_id = ?', - (int) $publicationId + [(int) $publicationId] ); return new DAOResultFactory($result, $this, '_fromRow'); diff --git a/classes/db/DAO.inc.php b/classes/db/DAO.inc.php index 7fcc58be385..23b1384c185 100644 --- a/classes/db/DAO.inc.php +++ b/classes/db/DAO.inc.php @@ -49,7 +49,7 @@ function __construct($callHooks = true) { * @param $params array parameters for the SQL statement * @return ADORecordSet */ - function retrieve($sql, $params = false, $callHooks = true) { + function retrieve($sql, $params = [], $callHooks = true) { if ($callHooks === true) { $trace = debug_backtrace(); // Call hooks based on the calling entity, assuming @@ -62,20 +62,16 @@ function retrieve($sql, $params = false, $callHooks = true) { } } - yield from Capsule::cursor(Capsule::raw($sql), $this->_prepareParameters($params)); + yield from Capsule::cursor(Capsule::raw($sql), $params); } - private function _prepareParameters($params) { - if ($params === false) return []; - return $params; - } /** * Execute a cached SELECT SQL statement. * @param $sql string the SQL statement * @param $params array parameters for the SQL statement * @return ADORecordSet */ - function &retrieveCached($sql, $params = false, $secsToCache = 3600, $callHooks = true) { + function &retrieveCached($sql, $params = [], $secsToCache = 3600, $callHooks = true) { throw new Exception('BROKEN'); if ($callHooks === true) { $trace = debug_backtrace(); @@ -101,41 +97,13 @@ function &retrieveCached($sql, $params = false, $secsToCache = 3600, $callHooks return $result; } - /** - * Execute a SELECT SQL statement with LIMIT on the rows returned. - * @param $sql string the SQL statement - * @param $params array parameters for the SQL statement - * @param $numRows int maximum number of rows to return in the result set - * @param $offset int row offset in the result set - * @return ADORecordSet - */ - function retrieveLimit($sql, $params = false, $numRows = false, $offset = false, $callHooks = true) { - if ($callHooks === true) { - $trace = debug_backtrace(); - // Call hooks based on the calling entity, assuming - // this method is only called by a subclass. Results - // in hook calls named e.g. "sessiondao::_getsession" - // (all lowercase). - $value = null; - if (HookRegistry::call(strtolower_codesafe($trace[1]['class'] . '::_' . $trace[1]['function']), array(&$sql, &$params, &$numRows, &$offset, &$value))) { - return $value; - } - } - $query = Capsule::raw($sql); - if ($offset !== false) $query->skip($offset); - if ($numRows !== false) $query->take($numRows); - yield from Capsule::cursor($query, $this->_prepareParameters($params)); - } - /** * Execute a SELECT SQL statment, returning rows in the range supplied. * @param $sql string the SQL statement * @param $params array parameters for the SQL statement * @param $dbResultRange DBResultRange object describing the desired range */ - function retrieveRange($sql, $params = false, $dbResultRange = null, $callHooks = true) { - if ($dbResultRange === null) return $this->retrieve($sql, $params, $callHooks); - throw new Exception('BROKEN'); + function retrieveRange($sql, $params = [], $dbResultRange = null, $callHooks = true) { if ($callHooks === true) { $trace = debug_backtrace(); // Call hooks based on the calling entity, assuming @@ -147,22 +115,14 @@ function retrieveRange($sql, $params = false, $dbResultRange = null, $callHooks } } - if (isset($dbResultRange) && $dbResultRange->isValid()) { - $start = Core::microtime(); - $dataSource = $this->getDataSource(); - if (is_null($dbResultRange->getOffset())) { - $result = $dataSource->PageExecute($sql, $dbResultRange->getCount(), $dbResultRange->getPage(), $params); - } else { - $result = $dataSource->SelectLimit($sql, $dbResultRange->getCount(), $dbResultRange->getOffset(), $params); - } - if ($dataSource->errorNo()) { - $this->handleError($dataSource, $sql); - } + if ($dbResultRange && $dbResultRange->isValid()) { + $sql .= ' LIMIT ' . (int) $dbResultRange->getCount(); + $offset = (int) $dbResultRange->getOffset(); + $offset += $dbResultRange->getPage() * Config::getVar('interface', 'items_per_page'); + $sql .= ' OFFSET ' . $offset; } - else { - $result = $this->retrieve($sql, $this->_prepareParameters($params)); - } - return $result; + + yield from Capsule::cursor(Capsule::raw($sql), $params); } /** @@ -173,7 +133,7 @@ function retrieveRange($sql, $params = false, $dbResultRange = null, $callHooks * @param $dieOnError boolean Whether or not to die if an error occurs * @return int Affected row count */ - function update($sql, $params = false, $callHooks = true, $dieOnError = true) { + function update($sql, $params = [], $callHooks = true, $dieOnError = true) { if ($callHooks === true) { $trace = debug_backtrace(); // Call hooks based on the calling entity, assuming @@ -186,7 +146,7 @@ function update($sql, $params = false, $callHooks = true, $dieOnError = true) { } } - return Capsule::affectingStatement($sql, $this->_prepareParameters($params)); + return Capsule::affectingStatement($sql, $params); } /** @@ -523,10 +483,10 @@ function updateDataObjectSettings($tableName, $dataObject, $idArray) { function getDataObjectSettings($tableName, $idFieldName, $idFieldValue, $dataObject) { if ($idFieldName !== null) { $sql = "SELECT * FROM $tableName WHERE $idFieldName = ?"; - $params = array($idFieldValue); + $params = [$idFieldValue]; } else { $sql = "SELECT * FROM $tableName"; - $params = false; + $params = []; } $result = $this->retrieve($sql, $params); foreach ($result as $row) { diff --git a/classes/db/SchemaDAO.inc.php b/classes/db/SchemaDAO.inc.php index 1232d10aee3..72ae331ffbd 100644 --- a/classes/db/SchemaDAO.inc.php +++ b/classes/db/SchemaDAO.inc.php @@ -41,20 +41,16 @@ abstract public function newDataObject(); /** * Retrieve an object by ID * @param $objectId int - * @return DataObject + * @return DataObject? */ public function getById($objectId) { $result = $this->retrieve( 'SELECT * FROM ' . $this->tableName . ' WHERE ' . $this->primaryKeyColumn . ' = ?', - (int) $objectId + [(int) $objectId] ); - $returner = null; - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** diff --git a/classes/file/TemporaryFileDAO.inc.php b/classes/file/TemporaryFileDAO.inc.php index aa1f17952d6..93a3c801430 100644 --- a/classes/file/TemporaryFileDAO.inc.php +++ b/classes/file/TemporaryFileDAO.inc.php @@ -23,22 +23,16 @@ class TemporaryFileDAO extends DAO { * Retrieve a temporary file by ID. * @param $fileId int * @param $userId int - * @return TemporaryFile + * @return TemporaryFile? */ function getTemporaryFile($fileId, $userId) { - $result = $this->retrieveLimit( + $result = $this->retrieve( 'SELECT t.* FROM temporary_files t WHERE t.file_id = ? and t.user_id = ?', - array((int) $fileId, (int) $userId), - 1 + [(int) $fileId, (int) $userId] ); - $returner = null; - if (isset($result) && $result->RecordCount() != 0) { - $returner = $this->_returnTemporaryFileFromRow($result->GetRowAssoc(false)); - } - - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_returnTemporaryFileFromRow($row):null; } /** @@ -129,10 +123,7 @@ function updateObject($temporaryFile) { * @param $userId int */ function deleteTemporaryFileById($fileId, $userId) { - return $this->update( - 'DELETE FROM temporary_files WHERE file_id = ? AND user_id = ?', - array((int) $fileId, (int) $userId) - ); + return $this->update('DELETE FROM temporary_files WHERE file_id = ? AND user_id = ?', [(int) $fileId, (int) $userId]); } /** @@ -140,28 +131,21 @@ function deleteTemporaryFileById($fileId, $userId) { * @param $userId int */ function deleteByUserId($userId) { - return $this->update( - 'DELETE FROM temporary_files WHERE user_id = ?', - (int) $userId - ); + return $this->update('DELETE FROM temporary_files WHERE user_id = ?', [(int) $userId]); } - function &getExpiredFiles() { + /** + * Get all expired temorary files. + * @return array + */ + function getExpiredFiles() { // Files older than one day can be cleaned up. $expiryThresholdTimestamp = time() - (60 * 60 * 24); - $temporaryFiles = array(); - - $result = $this->retrieve( - 'SELECT * FROM temporary_files WHERE date_uploaded < ' . $this->datetimeToDB($expiryThresholdTimestamp) - ); - - while (!$result->EOF) { - $temporaryFiles[] = $this->_returnTemporaryFileFromRow($result->GetRowAssoc(false)); - $result->MoveNext(); + $result = $this->retrieve('SELECT * FROM temporary_files WHERE date_uploaded < ' . $this->datetimeToDB($expiryThresholdTimestamp)); + foreach ($result as $row) { + $temporaryFiles[] = $this->_returnTemporaryFileFromRow((array) $row); } - - $result->Close(); return $temporaryFiles; } @@ -174,4 +158,3 @@ function getInsertId() { } } - diff --git a/classes/install/Installer.inc.php b/classes/install/Installer.inc.php index 608951a61ec..bdd9b75bb88 100644 --- a/classes/install/Installer.inc.php +++ b/classes/install/Installer.inc.php @@ -29,8 +29,6 @@ import('lib.pkp.classes.site.VersionDAO'); import('lib.pkp.classes.config.ConfigParser'); -require_once './lib/pkp/lib/vendor/adodb/adodb-php/adodb-xmlschema.inc.php'; - class Installer { /** @var string descriptor path (relative to INSTALLER_DATA_DIR) */ diff --git a/classes/mail/EmailTemplateDAO.inc.php b/classes/mail/EmailTemplateDAO.inc.php index 04bae8bd6fc..402ffd48c7f 100644 --- a/classes/mail/EmailTemplateDAO.inc.php +++ b/classes/mail/EmailTemplateDAO.inc.php @@ -102,8 +102,8 @@ public function _fromRow($primaryRow) { [$emailTemplate->getData('key')] ); $props = ['subject', 'body', 'description']; - while (!$result->EOF) { - $settingRow = $result->getRowAssoc(false); + foreach ($result as $settingRow) { + $settingRow = (array) $settingRow; foreach ($props as $prop) { // Don't allow default data to override custom template data if ($emailTemplate->getData($prop, $settingRow['locale'])) { @@ -118,9 +118,7 @@ public function _fromRow($primaryRow) { $settingRow['locale'] ); } - $result->MoveNext(); } - $result->Close(); return $emailTemplate; } @@ -131,7 +129,7 @@ public function _fromRow($primaryRow) { */ function deleteEmailTemplatesByLocale($locale) { $this->update( - 'DELETE FROM email_templates_settings WHERE locale = ?', $locale + 'DELETE FROM email_templates_settings WHERE locale = ?', [$locale] ); } @@ -141,7 +139,7 @@ function deleteEmailTemplatesByLocale($locale) { */ function deleteDefaultEmailTemplatesByLocale($locale) { $this->update( - 'DELETE FROM email_templates_default_data WHERE locale = ?', $locale + 'DELETE FROM email_templates_default_data WHERE locale = ?', [$locale] ); } @@ -154,14 +152,13 @@ function deleteDefaultEmailTemplatesByLocale($locale) { */ function defaultTemplateIsInstalled($key) { $result = $this->retrieve( - 'SELECT COUNT(*) + 'SELECT COUNT(*) AS row_count FROM email_templates_default WHERE email_key = ?', - $key + [$key] ); - $returner = isset($result->fields[0]) && $result->fields[0] != 0; - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row && $row['row_count']; } /** diff --git a/classes/security/RoleDAO.inc.php b/classes/security/RoleDAO.inc.php index 9ea1d1f5b84..9b5af560084 100644 --- a/classes/security/RoleDAO.inc.php +++ b/classes/security/RoleDAO.inc.php @@ -120,16 +120,12 @@ function getUsersByRoleId($roleId = null, $contextId = null, $searchType = null, function userHasRole($contextId, $userId, $roleId) { $roleId = is_array($roleId) ? join(',', array_map('intval', $roleId)) : (int) $roleId; $result = $this->retrieve( - 'SELECT count(*) FROM user_groups ug JOIN user_user_groups uug ON ug.user_group_id = uug.user_group_id + 'SELECT count(*) AS row_count FROM user_groups ug JOIN user_user_groups uug ON ug.user_group_id = uug.user_group_id WHERE ug.context_id = ? AND uug.user_id = ? AND ug.role_id IN (' . $roleId . ')', - array((int) $contextId, (int) $userId) + [(int) $contextId, (int) $userId] ); - - // > 0 because user could belong to more than one user group with this role - $returner = isset($result->fields[0]) && $result->fields[0] > 0 ? true : false; - - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row && $row['row_count']; } /** diff --git a/classes/security/UserGroupDAO.inc.php b/classes/security/UserGroupDAO.inc.php index 34d8966879f..7b6c2c6910e 100644 --- a/classes/security/UserGroupDAO.inc.php +++ b/classes/security/UserGroupDAO.inc.php @@ -286,13 +286,11 @@ function getUserGroupIdsByRoleId($roleId, $contextId = null) { $params ); - $userGroupIds = array(); - while (!$result->EOF) { - $userGroupIds[] = (int) $result->fields[0]; - $result->MoveNext(); + $userGroupIds = []; + foreach ($result as $row) { + $row = (array) $row; + $userGroupIds[] = (int) $row['user_group_id']; } - - $result->Close(); return $userGroupIds; } diff --git a/classes/stageAssignment/StageAssignmentDAO.inc.php b/classes/stageAssignment/StageAssignmentDAO.inc.php index 41a92128894..9ecaa9f187c 100644 --- a/classes/stageAssignment/StageAssignmentDAO.inc.php +++ b/classes/stageAssignment/StageAssignmentDAO.inc.php @@ -101,7 +101,7 @@ function editorAssignedToStage($submissionId, $stageId = null) { $params = array((int) $submissionId, ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR); if ($stageId) $params[] = (int) $stageId; $result = $this->retrieve( - 'SELECT COUNT(*) + 'SELECT COUNT(*) AS row_count FROM stage_assignments sa JOIN user_groups ug ON (sa.user_group_id = ug.user_group_id) JOIN user_group_stage ugs ON (ug.user_group_id = ugs.user_group_id) @@ -110,10 +110,8 @@ function editorAssignedToStage($submissionId, $stageId = null) { ($stageId?' AND ugs.stage_id = ?':''), $params ); - $returner = isset($result->fields[0]) && $result->fields[0] > 0 ? true : false; - - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row && $row['row_count']; } /** @@ -123,16 +121,12 @@ function editorAssignedToStage($submissionId, $stageId = null) { * @return DAOResultFactory */ function getByUserGroupId($userGroupId, $contextId) { - $params = array( - (int) $userGroupId, - (int) $contextId - ); $result = $this->retrieve( 'SELECT * FROM stage_assignments sa' . ' JOIN submissions s ON s.submission_id = sa.submission_id' . ' WHERE sa.user_group_id = ? AND s.context_id = ?', - $params + [(int) $userGroupId, (int) $contextId] ); return new DAOResultFactory($result, $this, '_fromRow'); diff --git a/classes/submission/EditDecisionDAO.inc.php b/classes/submission/EditDecisionDAO.inc.php index 2d44ecf218d..33b6a757fee 100644 --- a/classes/submission/EditDecisionDAO.inc.php +++ b/classes/submission/EditDecisionDAO.inc.php @@ -85,20 +85,19 @@ function getEditorDecisions($submissionId, $stageId = null, $round = null, $edit $params ); - $decisions = array(); - while (!$result->EOF) { - $decisions[] = array( - 'editDecisionId' => $result->fields['edit_decision_id'], - 'reviewRoundId' => $result->fields['review_round_id'], - 'stageId' => $result->fields['stage_id'], - 'round' => $result->fields['round'], - 'editorId' => $result->fields['editor_id'], - 'decision' => $result->fields['decision'], - 'dateDecided' => $this->datetimeFromDB($result->fields['date_decided']) - ); - $result->MoveNext(); + $decisions = []; + foreach ($result as $row) { + $row = (array) $row; + $decisions[] = [ + 'editDecisionId' => $row['edit_decision_id'], + 'reviewRoundId' => $row['review_round_id'], + 'stageId' => $row['stage_id'], + 'round' => $row['round'], + 'editorId' => $row['editor_id'], + 'decision' => $row['decision'], + 'dateDecided' => $this->datetimeFromDB($row['date_decided']) + ]; } - $result->Close(); return $decisions; } diff --git a/classes/submission/SubmissionFileDAO.inc.php b/classes/submission/SubmissionFileDAO.inc.php index 23ad4410ee5..b9767d1ca20 100644 --- a/classes/submission/SubmissionFileDAO.inc.php +++ b/classes/submission/SubmissionFileDAO.inc.php @@ -922,9 +922,8 @@ private function _getInternally($submissionId = null, $fileStage = null, $fileId // Build the result array. $submissionFiles = array(); - while (!$result->EOF) { - // Retrieve the next result row. - $row = $result->GetRowAssoc(false); + foreach ($result as $row) { + $row = (array) $row; // Construct a combined id from file id and revision // that uniquely identifies the file. @@ -938,11 +937,7 @@ private function _getInternally($submissionId = null, $fileStage = null, $fileId // N.B. The subclass implementation of fromRow receives just the $row // but calls SubmissionFileDAO::fromRow($row, $fileImplementation) as defined here. $submissionFiles[$idAndRevision] = $this->fromRow($row); - - // Move the query cursor to the next record. - $result->MoveNext(); } - $result->Close(); return $submissionFiles; } diff --git a/classes/submission/reviewAssignment/ReviewAssignmentDAO.inc.php b/classes/submission/reviewAssignment/ReviewAssignmentDAO.inc.php index 7a5334804e9..ca3dc2edf27 100644 --- a/classes/submission/reviewAssignment/ReviewAssignmentDAO.inc.php +++ b/classes/submission/reviewAssignment/ReviewAssignmentDAO.inc.php @@ -61,16 +61,13 @@ function getOpenReviewsByReviewRoundId($reviewRoundId) { * @return array */ function _getReviewAssignmentsArray($query, $queryParams) { - $reviewAssignments = array(); - $result = $this->retrieve($query, $queryParams); - while (!$result->EOF) { - $reviewAssignments[$result->fields['review_id']] = $this->_fromRow($result->GetRowAssoc(false)); - $result->MoveNext(); + $reviewAssignments = []; + foreach ($result as $row) { + $row = (array) $row; + $reviewAssignments[$row['review_id']] = $this->_fromRow($row); } - - $result->Close(); return $reviewAssignments; } @@ -580,30 +577,15 @@ function getInsertId() { * Get the last review round review assignment for a given user. * @param $submissionId int * @param $reviewerId int - * @return ReviewAssignment + * @return ReviewAssignment? */ function getLastReviewRoundReviewAssignmentByReviewer($submissionId, $reviewerId) { - $params = array( - (int) $submissionId, - (int) $reviewerId - ); - - $result = $this->retrieveLimit( - $this->_getSelectQuery() . - ' WHERE r.submission_id = ? AND - r.reviewer_id = ? - ORDER BY r2.stage_id DESC, r2.round DESC', - $params, - 1 + $result = $this->retrieve( + $this->_getSelectQuery() . ' WHERE r.submission_id = ? AND r.reviewer_id = ? ORDER BY r2.stage_id DESC, r2.round DESC', + [(int) $submissionId, (int) $reviewerId] ); - - $returner = null; - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** diff --git a/classes/submission/reviewRound/ReviewRoundDAO.inc.php b/classes/submission/reviewRound/ReviewRoundDAO.inc.php index a49fc67235c..eaf7a4b26f4 100644 --- a/classes/submission/reviewRound/ReviewRoundDAO.inc.php +++ b/classes/submission/reviewRound/ReviewRoundDAO.inc.php @@ -111,6 +111,7 @@ function updateObject($reviewRound) { * @param $submissionId integer * @param $stageId int One of the Stage_id_* constants. * @param $round int The review round to be retrieved. + * @return ReviewRound? */ function getReviewRound($submissionId, $stageId, $round) { $result = $this->retrieve( @@ -118,12 +119,8 @@ function getReviewRound($submissionId, $stageId, $round) { array((int) $submissionId, (int) $stageId, (int) $round) ); - $returner = null; - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** @@ -213,27 +210,22 @@ function getCurrentRoundBySubmissionId($submissionId, $stageId = null) { * Get the last review round for a give stage (or for the latest stage) * @param $submissionId int * @param $stageId int - * @return ReviewRound + * @return ReviewRound? */ function getLastReviewRoundBySubmissionId($submissionId, $stageId = null) { - $params = array((int)$submissionId); + $params = [(int)$submissionId]; if ($stageId) $params[] = (int) $stageId; - $result = $this->retrieveLimit( + $result = $this->retrieve( 'SELECT * FROM review_rounds WHERE submission_id = ? ' . ($stageId ? ' AND stage_id = ?' : '') . ' ORDER BY stage_id DESC, round DESC', - $params, - 1 + $params ); - $returner = null; - if ($result->RecordCount() != 0) { - $returner = $this->_fromRow($result->GetRowAssoc(false)); - } - $result->Close(); - return $returner; + $row = (array) $result->current(); + return $row?$this->_fromRow($row):null; } /** diff --git a/classes/user/UserStageAssignmentDAO.inc.php b/classes/user/UserStageAssignmentDAO.inc.php index d8519c20320..8acabd640e4 100644 --- a/classes/user/UserStageAssignmentDAO.inc.php +++ b/classes/user/UserStageAssignmentDAO.inc.php @@ -48,7 +48,27 @@ function getUsersNotAssignedToStageInUserGroup($submissionId, $stageId, $userGro * @return DAOResultFactory StageAssignment */ function getUsersBySubmissionAndStageId($submissionId, $stageId = null, $userGroupId = null, $roleId = null, $userId = null) { - return $this->_getUsersByIds($submissionId, $stageId, $userGroupId, $userId, $roleId); + $params = [(int) $submissionId]; + if (isset($stageId)) $params[] = (int) $stageId; + if (isset($userGroupId)) $params[] = (int) $userGroupId; + if (isset($userId)) $params[] = (int) $userId; + if (isset($roleId)) $params[] = (int) $roleId; + + $result = $this->retrieve( + 'SELECT u.* + FROM stage_assignments sa + INNER JOIN user_group_stage ugs ON (sa.user_group_id = ugs.user_group_id) + INNER JOIN users u ON (u.user_id = sa.user_id) ' . + (isset($roleId) ? 'INNER JOIN user_groups ug ON (ug.user_group_id = sa.user_group_id) ' : '') . + 'WHERE submission_id = ?' . + (isset($stageId) ? ' AND ugs.stage_id = ?' : '') . + (isset($userGroupId) ? ' AND sa.user_group_id = ?':'') . + (isset($userId)?' AND u.user_id = ? ' : '') . + (isset($roleId)?' AND ug.role_id = ?' : ''), + $params + ); + + return new DAOResultFactory($result, $this, '_returnUserFromRowWithData'); } /** @@ -104,53 +124,5 @@ function filterUsersNotAssignedToStageInUserGroup($submissionId, $stageId, $user $rangeInfo); return new DAOResultFactory($result, $this, '_returnUserFromRowWithData'); } - - // - // Private helper method - // - /** - * Retrieve a user by submission and stage IDs. - * Private method because it serves two purposes: returns a single assignment - * or returns a factory, depending on the calling context. - * @param $submissionId int - * @param $stageId int optional - * @param $userGroupId int optional - * @param $userId int optional - * @param $roleId int optional - * @return object DAOResultFactory - */ - function _getUsersByIds($submissionId, $stageId = null, $userGroupId = null, $userId = null, $roleId = null) { - $params = array((int) $submissionId); - if (isset($stageId)) $params[] = (int) $stageId; - if (isset($userGroupId)) $params[] = (int) $userGroupId; - if (isset($userId)) $params[] = (int) $userId; - if (isset($roleId)) $params[] = (int) $roleId; - - $result = $this->retrieve( - 'SELECT u.* - FROM stage_assignments sa - INNER JOIN user_group_stage ugs ON (sa.user_group_id = ugs.user_group_id) - INNER JOIN users u ON (u.user_id = sa.user_id) ' . - (isset($roleId) ? 'INNER JOIN user_groups ug ON (ug.user_group_id = sa.user_group_id) ' : '') . - 'WHERE submission_id = ?' . - (isset($stageId) ? ' AND ugs.stage_id = ?' : '') . - (isset($userGroupId) ? ' AND sa.user_group_id = ?':'') . - (isset($userId)?' AND u.user_id = ? ' : '') . - (isset($roleId)?' AND ug.role_id = ?' : ''), - $params); - - $returner = null; - // This is a little obscure. - // 4 params and 1 search results, means calling context was seeking an individual user. - if ($result->RecordCount() == 1 && count($params) == 4) { - // If all parameters were specified, then seeking only one assignment. - $returner = $this->_returnUserFromRowWithData($result->GetRowAssoc(false)); - $result->Close(); - } elseif ($result) { - $returner = new DAOResultFactory($result, $this, '_returnUserFromRowWithData'); - } - return $returner; - } } -