Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Convert simple_search_list/simple_search_list_txn to return tuples. #16434

Merged
merged 8 commits into from
Oct 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/16434.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Reduce memory allocations.
13 changes: 12 additions & 1 deletion synapse/rest/admin/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -842,7 +842,18 @@ async def on_GET(
logger.info("term: %s ", term)

ret = await self.store.search_users(term)
return HTTPStatus.OK, ret
results = [
{
"name": name,
"password_hash": password_hash,
"is_guest": bool(is_guest),
"admin": bool(admin),
"user_type": user_type,
}
for name, password_hash, is_guest, admin, user_type in ret
]

return HTTPStatus.OK, results


class UserAdminServlet(RestServlet):
Expand Down
62 changes: 0 additions & 62 deletions synapse/storage/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -2476,68 +2476,6 @@ def simple_select_list_paginate_txn(

return txn.fetchall()

async def simple_search_list(
self,
table: str,
term: Optional[str],
col: str,
retcols: Collection[str],
desc: str = "simple_search_list",
) -> Optional[List[Dict[str, Any]]]:
"""Executes a SELECT query on the named table, which may return zero or
more rows, returning the result as a list of dicts.

Args:
table: the table name
term: term for searching the table matched to a column.
col: column to query term should be matched to
retcols: the names of the columns to return

Returns:
A list of dictionaries or None.
"""

return await self.runInteraction(
desc,
self.simple_search_list_txn,
table,
term,
col,
retcols,
db_autocommit=True,
)

@classmethod
def simple_search_list_txn(
cls,
txn: LoggingTransaction,
table: str,
term: Optional[str],
col: str,
retcols: Iterable[str],
) -> Optional[List[Dict[str, Any]]]:
"""Executes a SELECT query on the named table, which may return zero or
more rows, returning the result as a list of dicts.

Args:
txn: Transaction object
table: the table name
term: term for searching the table matched to a column.
col: column to query term should be matched to
retcols: the names of the columns to return

Returns:
None if no term is given, otherwise a list of dictionaries.
"""
if term:
sql = "SELECT %s FROM %s WHERE %s LIKE ?" % (", ".join(retcols), table, col)
termvalues = ["%%" + term + "%%"]
txn.execute(sql, termvalues)
else:
return None

return cls.cursor_to_dict(txn)


def make_in_list_sql_clause(
database_engine: BaseDatabaseEngine, column: str, iterable: Collection[Any]
Expand Down
46 changes: 36 additions & 10 deletions synapse/storage/databases/main/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
# limitations under the License.

import logging
from typing import TYPE_CHECKING, List, Optional, Tuple, cast
from typing import TYPE_CHECKING, List, Optional, Tuple, Union, cast

from synapse.api.constants import Direction
from synapse.config.homeserver import HomeServerConfig
Expand Down Expand Up @@ -296,23 +296,49 @@ def get_users_paginate_txn(
"get_users_paginate_txn", get_users_paginate_txn
)

async def search_users(self, term: str) -> Optional[List[JsonDict]]:
async def search_users(
self, term: str
) -> List[
Tuple[str, Optional[str], Union[int, bool], Union[int, bool], Optional[str]]
]:
"""Function to search users list for one or more users with
the matched term.

Args:
term: search term

Returns:
A list of dictionaries or None.
A list of tuples of name, password_hash, is_guest, admin, user_type or None.
"""
return await self.db_pool.simple_search_list(
table="users",
term=term,
col="name",
retcols=["name", "password_hash", "is_guest", "admin", "user_type"],
desc="search_users",
)

def search_users(
txn: LoggingTransaction,
) -> List[
Tuple[str, Optional[str], Union[int, bool], Union[int, bool], Optional[str]]
]:
search_term = "%%" + term + "%%"

sql = """
SELECT name, password_hash, is_guest, admin, user_type
FROM users
WHERE name LIKE ?
"""
txn.execute(sql, (search_term,))

return cast(
List[
Tuple[
str,
Optional[str],
Union[int, bool],
Union[int, bool],
Optional[str],
]
],
txn.fetchall(),
)

return await self.db_pool.runInteraction("search_users", search_users)


def check_database_before_upgrade(
Expand Down
Loading