mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-26 03:25:53 +03:00
Convert simple_delete to async/await. (#8191)
This commit is contained in:
parent
9b7ac03af3
commit
b71d4a094c
5 changed files with 90 additions and 37 deletions
1
changelog.d/8191.misc
Normal file
1
changelog.d/8191.misc
Normal file
|
@ -0,0 +1 @@
|
|||
Convert various parts of the codebase to async/await.
|
|
@ -614,6 +614,7 @@ class DatabasePool(object):
|
|||
"""Runs a single query for a result set.
|
||||
|
||||
Args:
|
||||
desc: description of the transaction, for logging and metrics
|
||||
decoder - The function which can resolve the cursor results to
|
||||
something meaningful.
|
||||
query - The query string to execute
|
||||
|
@ -649,7 +650,7 @@ class DatabasePool(object):
|
|||
or_ignore: bool stating whether an exception should be raised
|
||||
when a conflicting row already exists. If True, False will be
|
||||
returned by the function instead
|
||||
desc: string giving a description of the transaction
|
||||
desc: description of the transaction, for logging and metrics
|
||||
|
||||
Returns:
|
||||
Whether the row was inserted or not. Only useful when `or_ignore` is True
|
||||
|
@ -686,7 +687,7 @@ class DatabasePool(object):
|
|||
Args:
|
||||
table: string giving the table name
|
||||
values: dict of new column names and values for them
|
||||
desc: string giving a description of the transaction
|
||||
desc: description of the transaction, for logging and metrics
|
||||
"""
|
||||
await self.runInteraction(desc, self.simple_insert_many_txn, table, values)
|
||||
|
||||
|
@ -700,7 +701,6 @@ class DatabasePool(object):
|
|||
txn: The transaction to use.
|
||||
table: string giving the table name
|
||||
values: dict of new column names and values for them
|
||||
desc: string giving a description of the transaction
|
||||
"""
|
||||
if not values:
|
||||
return
|
||||
|
@ -755,6 +755,7 @@ class DatabasePool(object):
|
|||
keyvalues: The unique key columns and their new values
|
||||
values: The nonunique columns and their new values
|
||||
insertion_values: additional key/values to use only when inserting
|
||||
desc: description of the transaction, for logging and metrics
|
||||
lock: True to lock the table when doing the upsert.
|
||||
Returns:
|
||||
Native upserts always return None. Emulated upserts return True if a
|
||||
|
@ -1081,6 +1082,7 @@ class DatabasePool(object):
|
|||
retcols: list of strings giving the names of the columns to return
|
||||
allow_none: If true, return None instead of failing if the SELECT
|
||||
statement returns no rows
|
||||
desc: description of the transaction, for logging and metrics
|
||||
"""
|
||||
return await self.runInteraction(
|
||||
desc, self.simple_select_one_txn, table, keyvalues, retcols, allow_none
|
||||
|
@ -1166,6 +1168,7 @@ class DatabasePool(object):
|
|||
table: table name
|
||||
keyvalues: column names and values to select the rows with
|
||||
retcol: column whos value we wish to retrieve.
|
||||
desc: description of the transaction, for logging and metrics
|
||||
|
||||
Returns:
|
||||
Results in a list
|
||||
|
@ -1190,6 +1193,7 @@ class DatabasePool(object):
|
|||
column names and values to select the rows with, or None to not
|
||||
apply a WHERE clause.
|
||||
retcols: the names of the columns to return
|
||||
desc: description of the transaction, for logging and metrics
|
||||
|
||||
Returns:
|
||||
A list of dictionaries.
|
||||
|
@ -1243,14 +1247,16 @@ class DatabasePool(object):
|
|||
"""Executes a SELECT query on the named table, which may return zero or
|
||||
more rows, returning the result as a list of dicts.
|
||||
|
||||
Filters rows by if value of `column` is in `iterable`.
|
||||
Filters rows by whether the value of `column` is in `iterable`.
|
||||
|
||||
Args:
|
||||
table: string giving the table name
|
||||
column: column name to test for inclusion against `iterable`
|
||||
iterable: list
|
||||
keyvalues: dict of column names and values to select the rows with
|
||||
retcols: list of strings giving the names of the columns to return
|
||||
keyvalues: dict of column names and values to select the rows with
|
||||
desc: description of the transaction, for logging and metrics
|
||||
batch_size: the number of rows for each select query
|
||||
"""
|
||||
results = [] # type: List[Dict[str, Any]]
|
||||
|
||||
|
@ -1291,7 +1297,7 @@ class DatabasePool(object):
|
|||
"""Executes a SELECT query on the named table, which may return zero or
|
||||
more rows, returning the result as a list of dicts.
|
||||
|
||||
Filters rows by if value of `column` is in `iterable`.
|
||||
Filters rows by whether the value of `column` is in `iterable`.
|
||||
|
||||
Args:
|
||||
txn: Transaction object
|
||||
|
@ -1367,6 +1373,7 @@ class DatabasePool(object):
|
|||
table: string giving the table name
|
||||
keyvalues: dict of column names and values to select the row with
|
||||
updatevalues: dict giving column names and values to update
|
||||
desc: description of the transaction, for logging and metrics
|
||||
"""
|
||||
await self.runInteraction(
|
||||
desc, self.simple_update_one_txn, table, keyvalues, updatevalues
|
||||
|
@ -1426,6 +1433,7 @@ class DatabasePool(object):
|
|||
Args:
|
||||
table: string giving the table name
|
||||
keyvalues: dict of column names and values to select the row with
|
||||
desc: description of the transaction, for logging and metrics
|
||||
"""
|
||||
await self.runInteraction(desc, self.simple_delete_one_txn, table, keyvalues)
|
||||
|
||||
|
@ -1451,13 +1459,38 @@ class DatabasePool(object):
|
|||
if txn.rowcount > 1:
|
||||
raise StoreError(500, "More than one row matched (%s)" % (table,))
|
||||
|
||||
def simple_delete(self, table: str, keyvalues: Dict[str, Any], desc: str):
|
||||
return self.runInteraction(desc, self.simple_delete_txn, table, keyvalues)
|
||||
async def simple_delete(
|
||||
self, table: str, keyvalues: Dict[str, Any], desc: str
|
||||
) -> int:
|
||||
"""Executes a DELETE query on the named table.
|
||||
|
||||
Filters rows by the key-value pairs.
|
||||
|
||||
Args:
|
||||
table: string giving the table name
|
||||
keyvalues: dict of column names and values to select the row with
|
||||
desc: description of the transaction, for logging and metrics
|
||||
|
||||
Returns:
|
||||
The number of deleted rows.
|
||||
"""
|
||||
return await self.runInteraction(desc, self.simple_delete_txn, table, keyvalues)
|
||||
|
||||
@staticmethod
|
||||
def simple_delete_txn(
|
||||
txn: LoggingTransaction, table: str, keyvalues: Dict[str, Any]
|
||||
) -> int:
|
||||
"""Executes a DELETE query on the named table.
|
||||
|
||||
Filters rows by the key-value pairs.
|
||||
|
||||
Args:
|
||||
table: string giving the table name
|
||||
keyvalues: dict of column names and values to select the row with
|
||||
|
||||
Returns:
|
||||
The number of deleted rows.
|
||||
"""
|
||||
sql = "DELETE FROM %s WHERE %s" % (
|
||||
table,
|
||||
" AND ".join("%s = ?" % (k,) for k in keyvalues),
|
||||
|
@ -1474,6 +1507,20 @@ class DatabasePool(object):
|
|||
keyvalues: Dict[str, Any],
|
||||
desc: str,
|
||||
) -> int:
|
||||
"""Executes a DELETE query on the named table.
|
||||
|
||||
Filters rows by if value of `column` is in `iterable`.
|
||||
|
||||
Args:
|
||||
table: string giving the table name
|
||||
column: column name to test for inclusion against `iterable`
|
||||
iterable: list
|
||||
keyvalues: dict of column names and values to select the rows with
|
||||
desc: description of the transaction, for logging and metrics
|
||||
|
||||
Returns:
|
||||
Number rows deleted
|
||||
"""
|
||||
return await self.runInteraction(
|
||||
desc, self.simple_delete_many_txn, table, column, iterable, keyvalues
|
||||
)
|
||||
|
|
|
@ -728,11 +728,13 @@ class GroupServerStore(GroupServerWorkerStore):
|
|||
},
|
||||
)
|
||||
|
||||
def remove_room_from_summary(self, group_id, room_id, category_id):
|
||||
async def remove_room_from_summary(
|
||||
self, group_id: str, room_id: str, category_id: str
|
||||
) -> int:
|
||||
if category_id is None:
|
||||
category_id = _DEFAULT_CATEGORY_ID
|
||||
|
||||
return self.db_pool.simple_delete(
|
||||
return await self.db_pool.simple_delete(
|
||||
table="group_summary_rooms",
|
||||
keyvalues={
|
||||
"group_id": group_id,
|
||||
|
@ -772,8 +774,8 @@ class GroupServerStore(GroupServerWorkerStore):
|
|||
desc="upsert_group_category",
|
||||
)
|
||||
|
||||
def remove_group_category(self, group_id, category_id):
|
||||
return self.db_pool.simple_delete(
|
||||
async def remove_group_category(self, group_id: str, category_id: str) -> int:
|
||||
return await self.db_pool.simple_delete(
|
||||
table="group_room_categories",
|
||||
keyvalues={"group_id": group_id, "category_id": category_id},
|
||||
desc="remove_group_category",
|
||||
|
@ -809,8 +811,8 @@ class GroupServerStore(GroupServerWorkerStore):
|
|||
desc="upsert_group_role",
|
||||
)
|
||||
|
||||
def remove_group_role(self, group_id, role_id):
|
||||
return self.db_pool.simple_delete(
|
||||
async def remove_group_role(self, group_id: str, role_id: str) -> int:
|
||||
return await self.db_pool.simple_delete(
|
||||
table="group_roles",
|
||||
keyvalues={"group_id": group_id, "role_id": role_id},
|
||||
desc="remove_group_role",
|
||||
|
@ -940,11 +942,13 @@ class GroupServerStore(GroupServerWorkerStore):
|
|||
},
|
||||
)
|
||||
|
||||
def remove_user_from_summary(self, group_id, user_id, role_id):
|
||||
async def remove_user_from_summary(
|
||||
self, group_id: str, user_id: str, role_id: str
|
||||
) -> int:
|
||||
if role_id is None:
|
||||
role_id = _DEFAULT_ROLE_ID
|
||||
|
||||
return self.db_pool.simple_delete(
|
||||
return await self.db_pool.simple_delete(
|
||||
table="group_summary_users",
|
||||
keyvalues={"group_id": group_id, "role_id": role_id, "user_id": user_id},
|
||||
desc="remove_user_from_summary",
|
||||
|
@ -1264,16 +1268,16 @@ class GroupServerStore(GroupServerWorkerStore):
|
|||
desc="update_remote_attestion",
|
||||
)
|
||||
|
||||
def remove_attestation_renewal(self, group_id, user_id):
|
||||
async def remove_attestation_renewal(self, group_id: str, user_id: str) -> int:
|
||||
"""Remove an attestation that we thought we should renew, but actually
|
||||
shouldn't. Ideally this would never get called as we would never
|
||||
incorrectly try and do attestations for local users on local groups.
|
||||
|
||||
Args:
|
||||
group_id (str)
|
||||
user_id (str)
|
||||
group_id
|
||||
user_id
|
||||
"""
|
||||
return self.db_pool.simple_delete(
|
||||
return await self.db_pool.simple_delete(
|
||||
table="group_attestations_renewals",
|
||||
keyvalues={"group_id": group_id, "user_id": user_id},
|
||||
desc="remove_attestation_renewal",
|
||||
|
|
|
@ -529,21 +529,21 @@ class RegistrationWorkerStore(SQLBaseStore):
|
|||
"user_get_threepids",
|
||||
)
|
||||
|
||||
def user_delete_threepid(self, user_id, medium, address):
|
||||
return self.db_pool.simple_delete(
|
||||
async def user_delete_threepid(self, user_id, medium, address) -> None:
|
||||
await self.db_pool.simple_delete(
|
||||
"user_threepids",
|
||||
keyvalues={"user_id": user_id, "medium": medium, "address": address},
|
||||
desc="user_delete_threepid",
|
||||
)
|
||||
|
||||
def user_delete_threepids(self, user_id: str):
|
||||
async def user_delete_threepids(self, user_id: str) -> None:
|
||||
"""Delete all threepid this user has bound
|
||||
|
||||
Args:
|
||||
user_id: The user id to delete all threepids of
|
||||
|
||||
"""
|
||||
return self.db_pool.simple_delete(
|
||||
await self.db_pool.simple_delete(
|
||||
"user_threepids",
|
||||
keyvalues={"user_id": user_id},
|
||||
desc="user_delete_threepids",
|
||||
|
@ -597,21 +597,20 @@ class RegistrationWorkerStore(SQLBaseStore):
|
|||
desc="user_get_bound_threepids",
|
||||
)
|
||||
|
||||
def remove_user_bound_threepid(self, user_id, medium, address, id_server):
|
||||
async def remove_user_bound_threepid(
|
||||
self, user_id: str, medium: str, address: str, id_server: str
|
||||
) -> None:
|
||||
"""The server proxied an unbind request to the given identity server on
|
||||
behalf of the given user, so we remove the mapping of threepid to
|
||||
identity server.
|
||||
|
||||
Args:
|
||||
user_id (str)
|
||||
medium (str)
|
||||
address (str)
|
||||
id_server (str)
|
||||
|
||||
Returns:
|
||||
Deferred
|
||||
user_id
|
||||
medium
|
||||
address
|
||||
id_server
|
||||
"""
|
||||
return self.db_pool.simple_delete(
|
||||
await self.db_pool.simple_delete(
|
||||
table="user_threepid_id_server",
|
||||
keyvalues={
|
||||
"user_id": user_id,
|
||||
|
@ -1247,14 +1246,14 @@ class RegistrationStore(RegistrationBackgroundUpdateStore):
|
|||
desc="add_user_pending_deactivation",
|
||||
)
|
||||
|
||||
def del_user_pending_deactivation(self, user_id):
|
||||
async def del_user_pending_deactivation(self, user_id: str) -> None:
|
||||
"""
|
||||
Removes the given user to the table of users who need to be parted from all the
|
||||
rooms they're in, effectively marking that user as fully deactivated.
|
||||
"""
|
||||
# XXX: This should be simple_delete_one but we failed to put a unique index on
|
||||
# the table, so somehow duplicate entries have ended up in it.
|
||||
return self.db_pool.simple_delete(
|
||||
await self.db_pool.simple_delete(
|
||||
"users_pending_deactivation",
|
||||
keyvalues={"user_id": user_id},
|
||||
desc="del_user_pending_deactivation",
|
||||
|
|
|
@ -123,9 +123,11 @@ class EventPushActionsStoreTestCase(tests.unittest.TestCase):
|
|||
yield _inject_actions(6, PlAIN_NOTIF)
|
||||
yield _rotate(7)
|
||||
|
||||
yield self.store.db_pool.simple_delete(
|
||||
yield defer.ensureDeferred(
|
||||
self.store.db_pool.simple_delete(
|
||||
table="event_push_actions", keyvalues={"1": 1}, desc=""
|
||||
)
|
||||
)
|
||||
|
||||
yield _assert_counts(1, 0)
|
||||
|
||||
|
|
Loading…
Reference in a new issue