Skip to content

Commit fe64960

Browse files
committedFeb 27, 2023
Use server_encoding as a fall back to database encoding
(We need an assertion to pass static type checker as parameter_status() would return None for unknown parameters, but we're querying a known one here.)
1 parent b0c3b34 commit fe64960

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed
 

‎pgactivity/data.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
import re
44
from argparse import Namespace
5+
from functools import partial
56
from typing import Dict, List, Optional
67

78
import attr
@@ -68,6 +69,7 @@ class Data:
6869
pg_conn: Connection
6970
pg_version: str
7071
pg_num_version: int
72+
server_encoding: str
7173
min_duration: float
7274
filters: Filters
7375
dsn_parameters: Dict[str, str]
@@ -103,10 +105,13 @@ def pg_connect(
103105
if pg.server_version(pg_conn) >= 130000:
104106
pg.execute(pg_conn, queries.get("disable_log_min_duration_sample"))
105107
pg_version = pg_get_short_version(pg_get_version(pg_conn))
108+
server_encoding = pg_conn.info.parameter_status("server_encoding")
109+
assert server_encoding is not None
106110
return cls(
107111
pg_conn,
108112
pg_version,
109113
pg.server_version(pg_conn),
114+
server_encoding,
110115
min_duration=min_duration,
111116
failed_queries=FailedQueriesInfo(),
112117
filters=filters,
@@ -412,7 +417,7 @@ def pg_get_activities(self, duration_mode: int = 1) -> List[RunningProcess]:
412417
"min_duration": self.min_duration,
413418
"dbname_filter": self.filters.dbname,
414419
},
415-
mkrow=RunningProcess.from_bytes,
420+
mkrow=partial(RunningProcess.from_bytes, self.server_encoding),
416421
text_as_bytes=True,
417422
)
418423

@@ -439,7 +444,7 @@ def pg_get_waiting(self, duration_mode: int = 1) -> List[WaitingProcess]:
439444
"min_duration": self.min_duration,
440445
"dbname_filter": self.filters.dbname,
441446
},
442-
mkrow=WaitingProcess.from_bytes,
447+
mkrow=partial(WaitingProcess.from_bytes, self.server_encoding),
443448
text_as_bytes=True,
444449
)
445450

@@ -468,7 +473,7 @@ def pg_get_blocking(self, duration_mode: int = 1) -> List[BlockingProcess]:
468473
"min_duration": self.min_duration,
469474
"dbname_filter": self.filters.dbname,
470475
},
471-
mkrow=BlockingProcess.from_bytes,
476+
mkrow=partial(BlockingProcess.from_bytes, self.server_encoding),
472477
text_as_bytes=True,
473478
)
474479

‎pgactivity/types.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import attr
2323
import psutil
24-
from attr import validators, converters
24+
from attr import validators
2525

2626
from . import compat, colors, utils
2727

@@ -908,23 +908,29 @@ class BaseProcess:
908908
duration: Optional[float]
909909
state: str
910910
query: Optional[str]
911-
encoding: str = attr.ib(converter=converters.default_if_none("utf-8")) # type: ignore[misc]
911+
encoding: Optional[str]
912912
query_leader_pid: Optional[int]
913913
is_parallel_worker: bool
914914

915915
_P = TypeVar("_P", bound="BaseProcess")
916916

917917
@classmethod
918918
def from_bytes(
919-
cls: Type[_P], *, encoding: Optional[Union[str, bytes]], **kwargs: Any
919+
cls: Type[_P],
920+
server_encoding: str,
921+
*,
922+
encoding: Optional[Union[str, bytes]],
923+
**kwargs: Any,
920924
) -> _P:
921925
if encoding is None:
922-
encoding = "utf-8"
926+
enc = server_encoding
923927
elif isinstance(encoding, bytes): # psycopg2
924-
encoding = encoding.decode()
928+
enc = encoding = encoding.decode()
929+
else:
930+
enc = encoding
925931
for name, value in kwargs.items():
926932
if isinstance(value, bytes):
927-
kwargs[name] = value.decode(encoding, errors="replace")
933+
kwargs[name] = value.decode(enc, errors="replace")
928934
return cls(encoding=encoding, **kwargs)
929935

930936

0 commit comments

Comments
 (0)
Please sign in to comment.