Skip to content

Commit ecccd99

Browse files
committed
Encode binary values for py-postgresql driver
1 parent 15a61fb commit ecccd99

3 files changed

Lines changed: 18 additions & 19 deletions

File tree

.travis.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ matrix:
7474
- env: TOXENV=py34-postgres-pygresql
7575
- env: TOXENV=py35-postgres-pygresql
7676
- env: TOXENV=py36-postgres-pygresql
77-
- env: TOXENV=py34-pypostgresql
78-
- env: TOXENV=py35-pypostgresql
79-
- env: TOXENV=py36-pypostgresql
8077
- env: TOXENV=py27-sqlite-memory
8178
- env: TOXENV=py34-sqlite-memory
8279
- env: TOXENV=py35-sqlite-memory

docs/News.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ SQLObject 3.4.0 (master)
1313
* Python 2.6 is no longer supported. The minimal supported version is
1414
Python 2.7.
1515

16+
* Encode binary values for py-postgresql driver. This fixes the
17+
last remaining problems with the driver.
18+
1619
* Encode/decode binary values for PyGreSQL driver.
1720

1821
* List all drivers in extras_require in setup.py.

sqlobject/postgres/pgconnection.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from sqlobject import col
33
from sqlobject import dberrors
44
from sqlobject import sqlbuilder
5-
from sqlobject.compat import PY2, unicode_type
5+
from sqlobject.compat import PY2
66
from sqlobject.converters import registerConverter, sqlrepr
77
from sqlobject.dbconnection import DBAPI
88

@@ -86,15 +86,13 @@ def __init__(self, dsn=None, host=None, port=None, db=None,
8686
registerConverter(type(self.module.Binary('')),
8787
PsycoBinaryConverter)
8888
elif driver == 'pygresql':
89-
from pg import escape_bytea
89+
from pg import escape_bytea as pg_escape_bytea
9090
self.createBinary = \
91-
lambda value, escape_bytea=escape_bytea: escape_bytea(value)
92-
elif type(self.module.Binary) in (
93-
type, type(PostgresBinaryConverter)) and \
94-
type(self.module.Binary(b'')) not in (bytes, unicode_type):
95-
# Register a converter for Binary type.
91+
lambda value, pg_escape_bytea=pg_escape_bytea: \
92+
pg_escape_bytea(value)
93+
elif driver in ('py-postgresql', 'pypostgresql'):
9694
registerConverter(type(self.module.Binary(b'')),
97-
PostgresBinaryConverter)
95+
PypostgresBinaryConverter)
9896

9997
self.db = db
10098
self.user = user
@@ -541,11 +539,12 @@ def PsycoBinaryConverter(value, db):
541539
return str(value)
542540

543541

544-
if PY2:
545-
def PostgresBinaryConverter(value, db):
546-
assert db == 'postgres'
547-
return sqlrepr(bytes(value), db)
548-
else:
549-
def PostgresBinaryConverter(value, db):
550-
assert db == 'postgres'
551-
return sqlrepr(value.decode('latin1'), db)
542+
def escape_bytea(value):
543+
return ''.join(
544+
['\\' + (x[2:].rjust(3, '0')) for x in (oct(ord(c)) for c in value)]
545+
)
546+
547+
548+
def PypostgresBinaryConverter(value, db):
549+
assert db == 'postgres'
550+
return sqlrepr(escape_bytea(value.decode('latin1')), db)

0 commit comments

Comments
 (0)