Maybe improve channel leave handling

This commit is contained in:
Tulir Asokan
2022-06-27 15:11:59 +03:00
parent 1d0e8c7e0c
commit 8f68801aa9
4 changed files with 44 additions and 15 deletions
+12 -9
View File
@@ -136,6 +136,10 @@ class PgSession(MemorySession):
q, self.session_id, entity_id, row.pts, row.qts, ts, row.seq, row.unread_count
)
async def delete_update_state(self, entity_id: int) -> None:
q = "DELETE FROM telethon_update_state WHERE session_id=$1 AND entity_id=$2"
await self.db.execute(q, self.session_id, entity_id)
async def get_update_states(self) -> Iterable[tuple[int, updates.State], ...]:
q = (
"SELECT entity_id, pts, qts, date, seq, unread_count FROM telethon_update_state "
@@ -196,25 +200,24 @@ class PgSession(MemorySession):
async def _select_entity(
self, constraint: str, *args: str | int | tuple[int, ...]
) -> tuple[int, int] | None:
row = await self.db.fetchrow(
f"SELECT id, hash FROM telethon_entities WHERE {constraint}", *args
)
q = f"SELECT id, hash FROM telethon_entities WHERE session_id=$1 AND {constraint}"
row = await self.db.fetchrow(q, self.session_id, *args)
if row is None:
return None
return row["id"], row["hash"]
async def get_entity_rows_by_phone(self, key: str | int) -> tuple[int, int] | None:
return await self._select_entity("phone=$1", str(key))
return await self._select_entity("phone=$2", str(key))
async def get_entity_rows_by_username(self, key: str) -> tuple[int, int] | None:
return await self._select_entity("username=$1", key)
return await self._select_entity("username=$2", key)
async def get_entity_rows_by_name(self, key: str) -> tuple[int, int] | None:
return await self._select_entity("name=$1", key)
return await self._select_entity("name=$2", key)
async def get_entity_rows_by_id(self, key: int, exact: bool = True) -> tuple[int, int] | None:
if exact:
return await self._select_entity("id=$1", key)
return await self._select_entity("id=$2", key)
ids = (
utils.get_peer_id(PeerUser(key)),
@@ -222,6 +225,6 @@ class PgSession(MemorySession):
utils.get_peer_id(PeerChannel(key)),
)
if self.db.scheme in (Scheme.POSTGRES, Scheme.COCKROACH):
return await self._select_entity("id=ANY($1)", ids)
return await self._select_entity("id=ANY($2)", ids)
else:
return await self._select_entity(f"id IN ($1, $2, $3)", *ids)
return await self._select_entity(f"id IN ($2, $3, $4)", *ids)