|
|
|
@ -869,6 +869,89 @@ class RoomWorkerStore(SQLBaseStore): |
|
|
|
|
"get_all_new_public_rooms", get_all_new_public_rooms |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
async def get_rooms_for_retention_period_in_range( |
|
|
|
|
self, min_ms: Optional[int], max_ms: Optional[int], include_null: bool = False |
|
|
|
|
) -> Dict[str, dict]: |
|
|
|
|
"""Retrieves all of the rooms within the given retention range. |
|
|
|
|
|
|
|
|
|
Optionally includes the rooms which don't have a retention policy. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
min_ms: Duration in milliseconds that define the lower limit of |
|
|
|
|
the range to handle (exclusive). If None, doesn't set a lower limit. |
|
|
|
|
max_ms: Duration in milliseconds that define the upper limit of |
|
|
|
|
the range to handle (inclusive). If None, doesn't set an upper limit. |
|
|
|
|
include_null: Whether to include rooms which retention policy is NULL |
|
|
|
|
in the returned set. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
The rooms within this range, along with their retention |
|
|
|
|
policy. The key is "room_id", and maps to a dict describing the retention |
|
|
|
|
policy associated with this room ID. The keys for this nested dict are |
|
|
|
|
"min_lifetime" (int|None), and "max_lifetime" (int|None). |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
def get_rooms_for_retention_period_in_range_txn(txn): |
|
|
|
|
range_conditions = [] |
|
|
|
|
args = [] |
|
|
|
|
|
|
|
|
|
if min_ms is not None: |
|
|
|
|
range_conditions.append("max_lifetime > ?") |
|
|
|
|
args.append(min_ms) |
|
|
|
|
|
|
|
|
|
if max_ms is not None: |
|
|
|
|
range_conditions.append("max_lifetime <= ?") |
|
|
|
|
args.append(max_ms) |
|
|
|
|
|
|
|
|
|
# Do a first query which will retrieve the rooms that have a retention policy |
|
|
|
|
# in their current state. |
|
|
|
|
sql = """ |
|
|
|
|
SELECT room_id, min_lifetime, max_lifetime FROM room_retention |
|
|
|
|
INNER JOIN current_state_events USING (event_id, room_id) |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
if len(range_conditions): |
|
|
|
|
sql += " WHERE (" + " AND ".join(range_conditions) + ")" |
|
|
|
|
|
|
|
|
|
if include_null: |
|
|
|
|
sql += " OR max_lifetime IS NULL" |
|
|
|
|
|
|
|
|
|
txn.execute(sql, args) |
|
|
|
|
|
|
|
|
|
rows = self.db_pool.cursor_to_dict(txn) |
|
|
|
|
rooms_dict = {} |
|
|
|
|
|
|
|
|
|
for row in rows: |
|
|
|
|
rooms_dict[row["room_id"]] = { |
|
|
|
|
"min_lifetime": row["min_lifetime"], |
|
|
|
|
"max_lifetime": row["max_lifetime"], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if include_null: |
|
|
|
|
# If required, do a second query that retrieves all of the rooms we know |
|
|
|
|
# of so we can handle rooms with no retention policy. |
|
|
|
|
sql = "SELECT DISTINCT room_id FROM current_state_events" |
|
|
|
|
|
|
|
|
|
txn.execute(sql) |
|
|
|
|
|
|
|
|
|
rows = self.db_pool.cursor_to_dict(txn) |
|
|
|
|
|
|
|
|
|
# If a room isn't already in the dict (i.e. it doesn't have a retention |
|
|
|
|
# policy in its state), add it with a null policy. |
|
|
|
|
for row in rows: |
|
|
|
|
if row["room_id"] not in rooms_dict: |
|
|
|
|
rooms_dict[row["room_id"]] = { |
|
|
|
|
"min_lifetime": None, |
|
|
|
|
"max_lifetime": None, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return rooms_dict |
|
|
|
|
|
|
|
|
|
return await self.db_pool.runInteraction( |
|
|
|
|
"get_rooms_for_retention_period_in_range", |
|
|
|
|
get_rooms_for_retention_period_in_range_txn, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RoomBackgroundUpdateStore(SQLBaseStore): |
|
|
|
|
REMOVE_TOMESTONED_ROOMS_BG_UPDATE = "remove_tombstoned_rooms_from_directory" |
|
|
|
@ -1446,88 +1529,3 @@ class RoomStore(RoomBackgroundUpdateStore, RoomWorkerStore, SearchStore): |
|
|
|
|
self.is_room_blocked, |
|
|
|
|
(room_id,), |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
async def get_rooms_for_retention_period_in_range( |
|
|
|
|
self, min_ms: Optional[int], max_ms: Optional[int], include_null: bool = False |
|
|
|
|
) -> Dict[str, dict]: |
|
|
|
|
"""Retrieves all of the rooms within the given retention range. |
|
|
|
|
|
|
|
|
|
Optionally includes the rooms which don't have a retention policy. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
min_ms: Duration in milliseconds that define the lower limit of |
|
|
|
|
the range to handle (exclusive). If None, doesn't set a lower limit. |
|
|
|
|
max_ms: Duration in milliseconds that define the upper limit of |
|
|
|
|
the range to handle (inclusive). If None, doesn't set an upper limit. |
|
|
|
|
include_null: Whether to include rooms which retention policy is NULL |
|
|
|
|
in the returned set. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
The rooms within this range, along with their retention |
|
|
|
|
policy. The key is "room_id", and maps to a dict describing the retention |
|
|
|
|
policy associated with this room ID. The keys for this nested dict are |
|
|
|
|
"min_lifetime" (int|None), and "max_lifetime" (int|None). |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
def get_rooms_for_retention_period_in_range_txn(txn): |
|
|
|
|
range_conditions = [] |
|
|
|
|
args = [] |
|
|
|
|
|
|
|
|
|
if min_ms is not None: |
|
|
|
|
range_conditions.append("max_lifetime > ?") |
|
|
|
|
args.append(min_ms) |
|
|
|
|
|
|
|
|
|
if max_ms is not None: |
|
|
|
|
range_conditions.append("max_lifetime <= ?") |
|
|
|
|
args.append(max_ms) |
|
|
|
|
|
|
|
|
|
# Do a first query which will retrieve the rooms that have a retention policy |
|
|
|
|
# in their current state. |
|
|
|
|
sql = """ |
|
|
|
|
SELECT room_id, min_lifetime, max_lifetime FROM room_retention |
|
|
|
|
INNER JOIN current_state_events USING (event_id, room_id) |
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
if len(range_conditions): |
|
|
|
|
sql += " WHERE (" + " AND ".join(range_conditions) + ")" |
|
|
|
|
|
|
|
|
|
if include_null: |
|
|
|
|
sql += " OR max_lifetime IS NULL" |
|
|
|
|
|
|
|
|
|
txn.execute(sql, args) |
|
|
|
|
|
|
|
|
|
rows = self.db_pool.cursor_to_dict(txn) |
|
|
|
|
rooms_dict = {} |
|
|
|
|
|
|
|
|
|
for row in rows: |
|
|
|
|
rooms_dict[row["room_id"]] = { |
|
|
|
|
"min_lifetime": row["min_lifetime"], |
|
|
|
|
"max_lifetime": row["max_lifetime"], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if include_null: |
|
|
|
|
# If required, do a second query that retrieves all of the rooms we know |
|
|
|
|
# of so we can handle rooms with no retention policy. |
|
|
|
|
sql = "SELECT DISTINCT room_id FROM current_state_events" |
|
|
|
|
|
|
|
|
|
txn.execute(sql) |
|
|
|
|
|
|
|
|
|
rows = self.db_pool.cursor_to_dict(txn) |
|
|
|
|
|
|
|
|
|
# If a room isn't already in the dict (i.e. it doesn't have a retention |
|
|
|
|
# policy in its state), add it with a null policy. |
|
|
|
|
for row in rows: |
|
|
|
|
if row["room_id"] not in rooms_dict: |
|
|
|
|
rooms_dict[row["room_id"]] = { |
|
|
|
|
"min_lifetime": None, |
|
|
|
|
"max_lifetime": None, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return rooms_dict |
|
|
|
|
|
|
|
|
|
rooms = await self.db_pool.runInteraction( |
|
|
|
|
"get_rooms_for_retention_period_in_range", |
|
|
|
|
get_rooms_for_retention_period_in_range_txn, |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
return rooms |
|
|
|
|