diff options
author | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2017-06-16 01:37:49 +0100 |
---|---|---|
committer | Daniele Varrazzo <daniele.varrazzo@gmail.com> | 2017-06-16 01:37:49 +0100 |
commit | 789eb64f3a08563a40532052a53f89e2a4f3b84e (patch) | |
tree | dd3e93f2ec63659eeadd589f61c0bfd647a8aaec | |
parent | 21ee8b62ef9c8fc72d6e9c139aa2955189886880 (diff) | |
download | psycopg2-fix-562.tar.gz |
Added Json.prepare()fix-562
Close #562
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | lib/_json.py | 9 | ||||
-rwxr-xr-x | tests/test_types_extras.py | 18 |
3 files changed, 28 insertions, 1 deletions
@@ -21,6 +21,8 @@ What's new in psycopg 2.7.2 - Fixed `~psycopg2.extras.ReplicationCursor.consume_stream()` *keepalive_interval* argument (:ticket:`#547`). - Fixed random `!SystemError` upon receiving abort signal (:ticket:`#551`). +- Added `~psycopg2.extras.Json` `!prepare()` method to consider connection + params when adapting (:ticket:`#562`). - `~psycopg2.errorcodes` map updated to PostgreSQL 10 beta 1. diff --git a/lib/_json.py b/lib/_json.py index b137a2d..92a9def 100644 --- a/lib/_json.py +++ b/lib/_json.py @@ -66,6 +66,7 @@ class Json(object): """ def __init__(self, adapted, dumps=None): self.adapted = adapted + self._conn = None if dumps is not None: self._dumps = dumps @@ -93,9 +94,15 @@ class Json(object): "json module not available: " "you should provide a dumps function") + def prepare(self, conn): + self._conn = conn + def getquoted(self): s = self.dumps(self.adapted) - return QuotedString(s).getquoted() + qs = QuotedString(s) + if self._conn is not None: + qs.prepare(self._conn) + return qs.getquoted() if sys.version_info < (3,): def __str__(self): diff --git a/tests/test_types_extras.py b/tests/test_types_extras.py index 3e4771a..9066e00 100755 --- a/tests/test_types_extras.py +++ b/tests/test_types_extras.py @@ -1084,6 +1084,24 @@ class JsonTestCase(ConnectingTestCase): self.assert_(s.startswith("'")) self.assert_(s.endswith("'")) + @skip_if_no_json_module + def test_scs(self): + cnn_on = self.connect(options="-c standard_conforming_strings=on") + cur_on = cnn_on.cursor() + self.assertEqual( + cur_on.mogrify("%s", [psycopg2.extras.Json({'a': '"'})]), + b'\'{"a": "\\""}\'') + + cnn_off = self.connect(options="-c standard_conforming_strings=off") + cur_off = cnn_off.cursor() + self.assertEqual( + cur_off.mogrify("%s", [psycopg2.extras.Json({'a': '"'})]), + b'E\'{"a": "\\\\""}\'') + + self.assertEqual( + cur_on.mogrify("%s", [psycopg2.extras.Json({'a': '"'})]), + b'\'{"a": "\\""}\'') + def skip_if_no_jsonb_type(f): return skip_before_postgres(9, 4)(f) |