I'm so flipflopping on this...
else:
return "UTF8"
+ @encoding.setter
+ def encoding(self, value: str) -> None:
+ self._set_client_encoding(value)
+
+ def _set_client_encoding(self, value: str) -> None:
+ raise NotImplementedError
+
def cancel(self) -> None:
c = self.pgconn.get_cancel()
c.cancel()
) -> proto.RV:
return wait(gen, timeout=timeout)
- def set_client_encoding(self, value: str) -> None:
+ def _set_client_encoding(self, value: str) -> None:
with self.lock:
self.pgconn.send_query_params(
b"select set_config('client_encoding', $1, false)",
async def wait(cls, gen: proto.PQGen[proto.RV]) -> proto.RV:
return await wait_async(gen)
+ def _set_client_encoding(self, value: str) -> None:
+ raise AttributeError(
+ "'encoding' is read-only on async connections:"
+ " please use await .set_client_encoding() instead."
+ )
+
async def set_client_encoding(self, value: str) -> None:
async with self.lock:
self.pgconn.send_query_params(
def test_set_encoding(conn):
newenc = "LATIN1" if conn.encoding != "LATIN1" else "UTF8"
assert conn.encoding != newenc
- conn.set_client_encoding(newenc)
+ conn.encoding = newenc
assert conn.encoding == newenc
(enc,) = conn.cursor().execute("show client_encoding").fetchone()
assert enc == newenc
],
)
def test_normalize_encoding(conn, enc, out, codec):
- conn.set_client_encoding(enc)
+ conn.encoding = enc
assert conn.encoding == out
assert conn.codec.name == codec
def test_set_encoding_unsupported(conn):
- conn.set_client_encoding("EUC_TW")
+ conn.encoding = "EUC_TW"
with pytest.raises(psycopg3.NotSupportedError):
conn.cursor().execute("select 1")
def test_set_encoding_bad(conn):
with pytest.raises(psycopg3.DatabaseError):
- conn.set_client_encoding("WAT")
+ conn.encoding = "WAT"
@pytest.mark.parametrize(
async def test_autocommit(aconn):
assert aconn.autocommit is False
- with pytest.raises(TypeError):
+ with pytest.raises(AttributeError):
aconn.autocommit = True
assert not aconn.autocommit
async def test_set_encoding(aconn):
newenc = "LATIN1" if aconn.encoding != "LATIN1" else "UTF8"
assert aconn.encoding != newenc
+ with pytest.raises(AttributeError):
+ aconn.encoding = newenc
+ assert aconn.encoding != newenc
await aconn.set_client_encoding(newenc)
assert aconn.encoding == newenc
cur = aconn.cursor()
cur = conn.cursor()
ensure_table(cur, sample_tabledef)
- conn.set_client_encoding("utf8")
+ conn.encoding = "utf8"
with cur.copy("copy copy_in from stdin (format text)") as copy:
for i in range(1, 256):
copy.write_row((i, None, chr(i)))
@pytest.mark.parametrize("encoding", ["utf8", "latin9"])
def test_query_encode(conn, encoding):
- conn.set_client_encoding(encoding)
+ conn.encoding = encoding
cur = conn.cursor()
(res,) = cur.execute("select '\u20ac'").fetchone()
assert res == "\u20ac"
def test_query_badenc(conn):
- conn.set_client_encoding("latin1")
+ conn.encoding = "latin1"
cur = conn.cursor()
with pytest.raises(UnicodeEncodeError):
cur.execute("select '\u20ac'")
msgs = []
conn.pgconn.exec_(b"set client_min_messages to notice")
conn.add_notice_handler(lambda diag: msgs.append(diag.message_primary))
- conn.set_client_encoding(enc)
+ conn.encoding = enc
cur = conn.cursor()
cur.execute(
"do $$begin raise notice 'hello %', chr(8364); end$$ language plpgsql"
@pytest.mark.parametrize("enc", ["utf8", "latin9"])
def test_error_encoding(conn, enc):
- conn.set_client_encoding(enc)
+ conn.encoding = enc
cur = conn.cursor()
with pytest.raises(e.DatabaseError) as excinfo:
cur.execute(
cur = conn.cursor()
ph = "%s" if fmt_in == Format.TEXT else "%b"
- conn.set_client_encoding(encoding)
+ conn.encoding = encoding
(res,) = cur.execute(f"select {ph}::bytea", (eur,)).fetchone()
assert res == eur.encode("utf8")
cur = conn.cursor()
ph = "%s" if fmt_in == Format.TEXT else "%b"
- conn.set_client_encoding("sql_ascii")
+ conn.encoding = "sql_ascii"
(res,) = cur.execute(f"select ascii({ph})", (eur,)).fetchone()
assert res == ord(eur)
cur = conn.cursor()
ph = "%s" if fmt_in == Format.TEXT else "%b"
- conn.set_client_encoding("latin1")
+ conn.encoding = "latin1"
with pytest.raises(UnicodeEncodeError):
cur.execute(f"select {ph}::bytea", (eur,))
def test_load_enc(conn, typename, encoding, fmt_out):
cur = conn.cursor(format=fmt_out)
- conn.set_client_encoding(encoding)
+ conn.encoding = encoding
(res,) = cur.execute(
f"select chr(%s::int)::{typename}", (ord(eur),)
).fetchone()
def test_load_badenc(conn, typename, fmt_out):
cur = conn.cursor(format=fmt_out)
- conn.set_client_encoding("latin1")
+ conn.encoding = "latin1"
with pytest.raises(psycopg3.DatabaseError):
cur.execute(f"select chr(%s::int)::{typename}", (ord(eur),))
def test_load_ascii(conn, typename, fmt_out):
cur = conn.cursor(format=fmt_out)
- conn.set_client_encoding("sql_ascii")
+ conn.encoding = "sql_ascii"
(res,) = cur.execute(
f"select chr(%s::int)::{typename}", (ord(eur),)
).fetchone()
def test_load_ascii_encanyway(conn, typename, fmt_out):
cur = conn.cursor(format=fmt_out)
- conn.set_client_encoding("sql_ascii")
+ conn.encoding = "sql_ascii"
(res,) = cur.execute(f"select 'aa'::{typename}").fetchone()
assert res == "aa"
@pytest.mark.parametrize("fmt_in", [Format.TEXT, Format.BINARY])
@pytest.mark.parametrize("fmt_out", [Format.TEXT, Format.BINARY])
def test_text_array_ascii(conn, fmt_in, fmt_out):
- conn.set_client_encoding("sql_ascii")
+ conn.encoding = "sql_ascii"
cur = conn.cursor(format=fmt_out)
a = list(map(chr, range(1, 256))) + [eur]
exp = [s.encode("utf8") for s in a]