Move the group database backend fully to query builder

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2018-03-12 13:23:03 +01:00 committed by Roeland Jago Douma
parent e2b44d199b
commit 7ea00b7b5f
No known key found for this signature in database
GPG Key ID: F941078878347C0C
1 changed files with 54 additions and 32 deletions

View File

@ -40,23 +40,25 @@
namespace OC\Group; namespace OC\Group;
use OCP\IDBConnection;
/** /**
* Class for group management in a SQL Database (e.g. MySQL, SQLite) * Class for group management in a SQL Database (e.g. MySQL, SQLite)
*/ */
class Database extends \OC\Group\Backend { class Database extends Backend {
/** @var string[] */ /** @var string[] */
private $groupCache = []; private $groupCache = [];
/** @var \OCP\IDBConnection */ /** @var IDBConnection */
private $dbConn; private $dbConn;
/** /**
* \OC\Group\Database constructor. * \OC\Group\Database constructor.
* *
* @param \OCP\IDBConnection|null $dbConn * @param IDBConnection|null $dbConn
*/ */
public function __construct(\OCP\IDBConnection $dbConn = null) { public function __construct(IDBConnection $dbConn = null) {
$this->dbConn = $dbConn; $this->dbConn = $dbConn;
} }
@ -219,7 +221,7 @@ class Database extends \OC\Group\Backend {
$groups = []; $groups = [];
while( $row = $cursor->fetch()) { while( $row = $cursor->fetch()) {
$groups[] = $row["gid"]; $groups[] = $row['gid'];
$this->groupCache[$row['gid']] = $row['gid']; $this->groupCache[$row['gid']] = $row['gid'];
} }
$cursor->closeCursor(); $cursor->closeCursor();
@ -237,19 +239,27 @@ class Database extends \OC\Group\Backend {
* Returns a list with all groups * Returns a list with all groups
*/ */
public function getGroups($search = '', $limit = null, $offset = null) { public function getGroups($search = '', $limit = null, $offset = null) {
$parameters = []; $query = $this->dbConn->getQueryBuilder();
$searchLike = ''; $query->select('gid')
->from('groups')
->orderBy('gid', 'ASC');
if ($search !== '') { if ($search !== '') {
$parameters[] = '%' . $search . '%'; $query->where($query->expr()->iLike('gid', $query->createNamedParameter(
$searchLike = ' WHERE LOWER(`gid`) LIKE LOWER(?)'; '%' . $this->dbConn->escapeLikeParameter($search) . '%'
)));
} }
$stmt = \OC_DB::prepare('SELECT `gid` FROM `*PREFIX*groups`' . $searchLike . ' ORDER BY `gid` ASC', $limit, $offset); $query->setMaxResults($limit)
$result = $stmt->execute($parameters); ->setFirstResult($offset);
$groups = array(); $result = $query->execute();
while ($row = $result->fetchRow()) {
$groups = [];
while ($row = $result->fetch()) {
$groups[] = $row['gid']; $groups[] = $row['gid'];
} }
$result->closeCursor();
return $groups; return $groups;
} }
@ -290,21 +300,28 @@ class Database extends \OC\Group\Backend {
* @return array an array of user ids * @return array an array of user ids
*/ */
public function usersInGroup($gid, $search = '', $limit = null, $offset = null) { public function usersInGroup($gid, $search = '', $limit = null, $offset = null) {
$parameters = [$gid]; $query = $this->dbConn->getQueryBuilder();
$searchLike = ''; $query->select('uid')
->from('group_user')
->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
->orderBy('uid', 'ASC');
if ($search !== '') { if ($search !== '') {
$parameters[] = '%' . $this->dbConn->escapeLikeParameter($search) . '%'; $query->andWhere($query->expr()->like('uid', $query->createNamedParameter(
$searchLike = ' AND `uid` LIKE ?'; '%' . $this->dbConn->escapeLikeParameter($search) . '%'
)));
} }
$stmt = \OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ?' . $searchLike . ' ORDER BY `uid` ASC', $query->setMaxResults($limit)
$limit, ->setFirstResult($offset);
$offset); $result = $query->execute();
$result = $stmt->execute($parameters);
$users = array(); $users = [];
while ($row = $result->fetchRow()) { while ($row = $result->fetch()) {
$users[] = $row['uid']; $users[] = $row['uid'];
} }
$result->closeCursor();
return $users; return $users;
} }
@ -313,20 +330,25 @@ class Database extends \OC\Group\Backend {
* @param string $gid * @param string $gid
* @param string $search * @param string $search
* @return int|false * @return int|false
* @throws \OC\DatabaseException
*/ */
public function countUsersInGroup($gid, $search = '') { public function countUsersInGroup($gid, $search = '') {
$parameters = [$gid]; $query = $this->dbConn->getQueryBuilder();
$searchLike = ''; $query->selectAlias($query->createFunction('COUNT(*)'), 'num_users')
->from('group_user')
->where($query->expr()->eq('gid', $query->createNamedParameter($gid)))
->orderBy('uid', 'ASC');
if ($search !== '') { if ($search !== '') {
$parameters[] = '%' . $this->dbConn->escapeLikeParameter($search) . '%'; $query->andWhere($query->expr()->like('uid', $query->createNamedParameter(
$searchLike = ' AND `uid` LIKE ?'; '%' . $this->dbConn->escapeLikeParameter($search) . '%'
)));
} }
$stmt = \OC_DB::prepare('SELECT COUNT(`uid`) AS `count` FROM `*PREFIX*group_user` WHERE `gid` = ?' . $searchLike); $result = $query->execute();
$result = $stmt->execute($parameters); $count = $result->fetchColumn();
$count = $result->fetchOne(); $result->closeCursor();
if($count !== false) {
if ($count !== false) {
$count = (int)$count; $count = (int)$count;
} }
return $count; return $count;