This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "SQLObject development repository".
The branch, master has been updated
via c689da55a95f3ce96188ccfecf50a0ecc0cd5a6a (commit)
via ba4e8909593ed546de04544cf1d38f87d5287fea (commit)
via e506c2c62b3b34e820a30e0b669c197edc4bc392 (commit)
via d1ff60d0580650455dc4494ba01ef1f59d8bdf17 (commit)
via 732a6e21bae84733dd58f43e05a22931c04b2c67 (commit)
via 3077facd828aebea8b68c5824997a41e4f4df2f3 (commit)
via 70388fa6e6d14c7f9cfca8b642787ff4b1619105 (commit)
via 34e2ab6bcd3291db200bee40c4e8dbad9ff814f7 (commit)
via 2ca0972c0579284abea98f5c1d69fa37df718c1c (commit)
from f09ab7a6c734672d50df14e8d3f364c458eb3ce5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceforge.net/p/sqlobject/sqlobject/ci/c689da55a95f3ce96188ccfecf50a0ecc0cd5a6a
commit c689da55a95f3ce96188ccfecf50a0ecc0cd5a6a
Author: Oleg Broytman <ph...@ph...>
Date: Fri May 5 01:43:00 2017 +0300
Fix JsobCol: undump a string returned by ODBC driver
diff --git a/sqlobject/col.py b/sqlobject/col.py
index 4c06489..e5f5301 100644
--- a/sqlobject/col.py
+++ b/sqlobject/col.py
@@ -1942,6 +1942,8 @@ class UuidCol(Col):
class JsonbValidator(SOValidator):
def to_python(self, value, state):
+ if isinstance(value, string_type):
+ return json.loads(value)
return value
def from_python(self, value, state):
http://sourceforge.net/p/sqlobject/sqlobject/ci/ba4e8909593ed546de04544cf1d38f87d5287fea
commit ba4e8909593ed546de04544cf1d38f87d5287fea
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 23:02:45 2017 +0300
Check error codes from ODBC drivers for DuplicateError
Check error codes for DuplicateError from MySQL and Postgres ODBC drivers.
diff --git a/sqlobject/mysql/mysqlconnection.py b/sqlobject/mysql/mysqlconnection.py
index c49e2e7..225a02f 100644
--- a/sqlobject/mysql/mysqlconnection.py
+++ b/sqlobject/mysql/mysqlconnection.py
@@ -129,7 +129,7 @@ class MySQLConnection(DBAPI):
)
self.CR_SERVER_GONE_ERROR = 2006
self.CR_SERVER_LOST = 2013
- self.ER_DUP_ENTRY = 1062
+ self.ER_DUP_ENTRY = '23000'
global mysql_Bin
if not PY2 and mysql_Bin is None:
diff --git a/sqlobject/postgres/pgconnection.py b/sqlobject/postgres/pgconnection.py
index 420c157..63bd17a 100644
--- a/sqlobject/postgres/pgconnection.py
+++ b/sqlobject/postgres/pgconnection.py
@@ -232,7 +232,8 @@ class PostgresConnection(DBAPI):
msg = ErrorMessage(e)
if getattr(e, 'code', -1) == '23505' or \
getattr(e, 'pgcode', -1) == '23505' or \
- getattr(e, 'sqlstate', -1) == '23505':
+ getattr(e, 'sqlstate', -1) == '23505' or \
+ e.args[0] == '23505':
raise dberrors.DuplicateEntryError(msg)
else:
raise dberrors.IntegrityError(msg)
http://sourceforge.net/p/sqlobject/sqlobject/ci/e506c2c62b3b34e820a30e0b669c197edc4bc392
commit e506c2c62b3b34e820a30e0b669c197edc4bc392
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 22:41:40 2017 +0300
Convert '0'/'1' (from ODBC) to bool in BoolCol
diff --git a/sqlobject/col.py b/sqlobject/col.py
index 2937a23..4c06489 100644
--- a/sqlobject/col.py
+++ b/sqlobject/col.py
@@ -792,6 +792,15 @@ class BoolValidator(SOValidator):
if PY2 and hasattr(value, '__nonzero__') \
or not PY2 and hasattr(value, '__bool__'):
return bool(value)
+ try:
+ connection = state.connection or state.soObject._connection
+ except AttributeError:
+ pass
+ else:
+ if connection.dbName == 'postgres' and \
+ connection.driver in ('odbc', 'pyodbc', 'pypyodbc') and \
+ isinstance(value, string_type):
+ return bool(int(value))
raise validators.Invalid(
"expected a bool or an int in the BoolCol '%s', "
"got %s %r instead" % (
diff --git a/sqlobject/tests/test_validation.py b/sqlobject/tests/test_validation.py
index 7a06800..ae62f3c 100644
--- a/sqlobject/tests/test_validation.py
+++ b/sqlobject/tests/test_validation.py
@@ -87,7 +87,9 @@ class TestValidation:
raises(validators.Invalid, setattr, t, 'name2', 1)
raises(validators.Invalid, setattr, t, 'name3', '1')
raises(validators.Invalid, setattr, t, 'name4', '1')
- raises(validators.Invalid, setattr, t, 'name6', '1')
+ if t._connection.dbName != 'postgres' or \
+ t._connection.driver not in ('odbc', 'pyodbc', 'pypyodbc'):
+ raises(validators.Invalid, setattr, t, 'name6', '1')
raises(validators.Invalid, setattr, t, 'name7', 1)
t.name2 = 'you'
assert t.name2 == 'you'
http://sourceforge.net/p/sqlobject/sqlobject/ci/d1ff60d0580650455dc4494ba01ef1f59d8bdf17
commit d1ff60d0580650455dc4494ba01ef1f59d8bdf17
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 22:31:27 2017 +0300
Test for __nonzero__ under Python 2, __bool__ under Python 3 in BoolCol
diff --git a/docs/DeveloperGuide.rst b/docs/DeveloperGuide.rst
index 6969978..5e889c8 100644
--- a/docs/DeveloperGuide.rst
+++ b/docs/DeveloperGuide.rst
@@ -92,12 +92,12 @@ have any code. ``SOBoolCol`` has a method to create ``BoolValidator``
and methods to create backend-specific column type. ``BoolValidator``
has identical methods ``from_python`` and ``to_python``; the method
passes ``None``, ``SQLExpression`` and bool values unchanged; int and
-objects that have method ``__nonzero__`` are converted to bool; other
-objects trigger validation error. Bool values that are returned by call
-to ``from_python`` will be converted to SQL strings by
-``BoolConverter``; bool values from ``to_python`` (is is supposed they
-are originated from the backend via DB API driver) are passed to the
-application.
+objects that have method ``__nonzero__`` (``__bool__`` in Python 3) are
+converted to bool; other objects trigger validation error. Bool values
+that are returned by call to ``from_python`` will be converted to SQL
+strings by ``BoolConverter``; bool values from ``to_python`` (is is
+supposed they are originated from the backend via DB API driver) are
+passed to the application.
Objects that are returned from ``from_python`` must be registered with
converters. Another approach for ``from_python`` is to return an object
diff --git a/docs/News.rst b/docs/News.rst
index 54ee2f1..cb22978 100644
--- a/docs/News.rst
+++ b/docs/News.rst
@@ -17,6 +17,8 @@ Minor features
Some of thses scripts are version-dependent so it's better to have them
in the main repo.
+* Test for __nonzero__ under Python 2, __bool__ under Python 3 in BoolCol.
+
Drivers (work in progress)
--------------------------
diff --git a/sqlobject/col.py b/sqlobject/col.py
index 26c9a51..2937a23 100644
--- a/sqlobject/col.py
+++ b/sqlobject/col.py
@@ -789,7 +789,8 @@ class BoolValidator(SOValidator):
return None
if isinstance(value, (bool, sqlbuilder.SQLExpression)):
return value
- if isinstance(value, (int, long)) or hasattr(value, '__nonzero__'):
+ if PY2 and hasattr(value, '__nonzero__') \
+ or not PY2 and hasattr(value, '__bool__'):
return bool(value)
raise validators.Invalid(
"expected a bool or an int in the BoolCol '%s', "
diff --git a/sqlobject/sqlbuilder.py b/sqlobject/sqlbuilder.py
index 2b4cdc7..e87ba70 100644
--- a/sqlobject/sqlbuilder.py
+++ b/sqlobject/sqlbuilder.py
@@ -1510,6 +1510,7 @@ class ImportProxy(SQLExpression):
def __nonzero__(self):
return True
+ __bool__ = __nonzero__
def __getattr__(self, attr):
if self.soClass is None:
diff --git a/sqlobject/tests/test_validation.py b/sqlobject/tests/test_validation.py
index 86f1a10..7a06800 100644
--- a/sqlobject/tests/test_validation.py
+++ b/sqlobject/tests/test_validation.py
@@ -63,6 +63,7 @@ class SOValidationTestInt(SOValidationTest):
class SOValidationTestBool(SOValidationTest):
def __nonzero__(self):
return self.value
+ __bool__ = __nonzero__
class SOValidationTestFloat(SOValidationTest):
http://sourceforge.net/p/sqlobject/sqlobject/ci/732a6e21bae84733dd58f43e05a22931c04b2c67
commit 732a6e21bae84733dd58f43e05a22931c04b2c67
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 20:51:15 2017 +0300
appveyor.yml: add 64-bit tests for mssql-pyodbc
diff --git a/appveyor.yml b/appveyor.yml
index a4499b5..eff4614 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -38,21 +38,41 @@ environment:
PYTHON_ARCH: "32"
db: mssql2014
TOX_ENV: "py27-mssql-pyodbc-w32"
+ - PYTHON_HOME: "C:\\Python27-x64"
+ PYTHON_VERSION: "2.7"
+ PYTHON_ARCH: "64"
+ db: mssql2014
+ TOX_ENV: "py27-mssql-pyodbc-w32"
- PYTHON_HOME: "C:\\Python34"
PYTHON_VERSION: "3.4"
PYTHON_ARCH: "32"
db: mssql2014
TOX_ENV: "py34-mssql-pyodbc-w32"
+ - PYTHON_HOME: "C:\\Python34-x64"
+ PYTHON_VERSION: "3.4"
+ PYTHON_ARCH: "64"
+ db: mssql2014
+ TOX_ENV: "py34-mssql-pyodbc-w32"
- PYTHON_HOME: "C:\\Python35"
PYTHON_VERSION: "3.5"
PYTHON_ARCH: "32"
db: mssql2014
TOX_ENV: "py35-mssql-pyodbc-w32"
+ - PYTHON_HOME: "C:\\Python35-x64"
+ PYTHON_VERSION: "3.5"
+ PYTHON_ARCH: "64"
+ db: mssql2014
+ TOX_ENV: "py35-mssql-pyodbc-w32"
- PYTHON_HOME: "C:\\Python36"
PYTHON_VERSION: "3.6"
PYTHON_ARCH: "32"
db: mssql2014
TOX_ENV: "py36-mssql-pyodbc-w32"
+ - PYTHON_HOME: "C:\\Python36-x64"
+ PYTHON_VERSION: "3.6"
+ PYTHON_ARCH: "64"
+ db: mssql2014
+ TOX_ENV: "py36-mssql-pyodbc-w32"
- PYTHON_HOME: "C:\\Python27"
PYTHON_VERSION: "2.7"
PYTHON_ARCH: "32"
http://sourceforge.net/p/sqlobject/sqlobject/ci/3077facd828aebea8b68c5824997a41e4f4df2f3
commit 3077facd828aebea8b68c5824997a41e4f4df2f3
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 21:04:57 2017 +0300
Add missing error codes for ODBC drivers
diff --git a/sqlobject/mysql/mysqlconnection.py b/sqlobject/mysql/mysqlconnection.py
index fe2eace..c49e2e7 100644
--- a/sqlobject/mysql/mysqlconnection.py
+++ b/sqlobject/mysql/mysqlconnection.py
@@ -127,6 +127,9 @@ class MySQLConnection(DBAPI):
'MySQL ODBC 5.3 ANSI Driver'),
db, host, port, user, password
)
+ self.CR_SERVER_GONE_ERROR = 2006
+ self.CR_SERVER_LOST = 2013
+ self.ER_DUP_ENTRY = 1062
global mysql_Bin
if not PY2 and mysql_Bin is None:
http://sourceforge.net/p/sqlobject/sqlobject/ci/70388fa6e6d14c7f9cfca8b642787ff4b1619105
commit 70388fa6e6d14c7f9cfca8b642787ff4b1619105
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 20:46:11 2017 +0300
Set encoding for ODBC connections for MySQL
diff --git a/sqlobject/mysql/mysqlconnection.py b/sqlobject/mysql/mysqlconnection.py
index bf6c48c..fe2eace 100644
--- a/sqlobject/mysql/mysqlconnection.py
+++ b/sqlobject/mysql/mysqlconnection.py
@@ -177,7 +177,15 @@ class MySQLConnection(DBAPI):
self._setAutoCommit(conn, bool(self.autoCommit))
if dbEncoding:
- if hasattr(conn, 'set_character_set'):
+ if self.driver in ('odbc', 'pyodbc'):
+ conn.setdecoding(self.module.SQL_CHAR, encoding=dbEncoding)
+ conn.setdecoding(self.module.SQL_WCHAR, encoding=dbEncoding)
+ if PY2:
+ conn.setencoding(str, encoding=dbEncoding)
+ conn.setencoding(unicode, encoding=dbEncoding) # noqa
+ else:
+ conn.setencoding(encoding=dbEncoding)
+ elif hasattr(conn, 'set_character_set'):
conn.set_character_set(dbEncoding)
elif self.driver == 'oursql':
conn.charset = dbEncoding
http://sourceforge.net/p/sqlobject/sqlobject/ci/34e2ab6bcd3291db200bee40c4e8dbad9ff814f7
commit 34e2ab6bcd3291db200bee40c4e8dbad9ff814f7
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 19:29:15 2017 +0300
tox.ini: set timeout for mssql-pyodbc tests
diff --git a/tox.ini b/tox.ini
index e6812ea..6f27b6a 100644
--- a/tox.ini
+++ b/tox.ini
@@ -21,6 +21,7 @@ deps =
py{34,35,36}: FormEncode >= 1.3.1
PyDispatcher>=2.0.4
py{26,27}: egenix-mx-base
+ mssql-pyodbc: pytest-timeout
mysqldb: mysql-python
mysqlclient: mysqlclient
mysql-connector: mysql-connector <= 2.2.2
@@ -401,7 +402,7 @@ commands =
{envpython} -c "import pyodbc; print(pyodbc.drivers())"
-sqlcmd -U sa -P "Password12!" -S .\SQL2014 -Q "DROP DATABASE sqlobject_test"
sqlcmd -U sa -P "Password12!" -S .\SQL2014 -Q "CREATE DATABASE sqlobject_test"
- pytest --cov=sqlobject -D "mssql://sa:Password12!@localhost\SQL2014/sqlobject_test?driver=pyodbc&odbcdrv=SQL%20Server&debug=1"
+ pytest --cov=sqlobject -D "mssql://sa:Password12!@localhost\SQL2014/sqlobject_test?driver=pyodbc&odbcdrv=SQL%20Server&debug=1" --timeout=30
sqlcmd -U sa -P "Password12!" -S .\SQL2014 -Q "DROP DATABASE sqlobject_test"
[testenv:py27-mssql-pyodbc-w32]
http://sourceforge.net/p/sqlobject/sqlobject/ci/2ca0972c0579284abea98f5c1d69fa37df718c1c
commit 2ca0972c0579284abea98f5c1d69fa37df718c1c
Author: Oleg Broytman <ph...@ph...>
Date: Thu May 4 18:44:35 2017 +0300
Refactor make_odbc_conn_str() to use DB-specific ODBC keywords
diff --git a/sqlobject/dbconnection.py b/sqlobject/dbconnection.py
index 4f29eb0..89f4382 100644
--- a/sqlobject/dbconnection.py
+++ b/sqlobject/dbconnection.py
@@ -734,17 +734,13 @@ class DBAPI(DBConnection):
"""
raise NotImplementedError
- def make_odbc_conn_str(self, db, host=None, port=None,
- user=None, password=None, odb_source=None):
- odbc_conn_parts = ['Driver={%s}' % odb_source, 'Database=%s' % db]
- if host:
- odbc_conn_parts.append('Server=%s' % host)
- if port:
- odbc_conn_parts.append('Port=%d' % port)
- if user:
- odbc_conn_parts.append('UID=%s' % user)
- if password:
- odbc_conn_parts.append('Password=%s' % password)
+ def make_odbc_conn_str(self, odb_source, db, host=None, port=None,
+ user=None, password=None):
+ odbc_conn_parts = ['Driver={%s}' % odb_source]
+ for odbc_keyword, value in \
+ zip(self.odbc_keywords, (host, port, user, password, db)):
+ if value is not None:
+ odbc_conn_parts.append('%s=%s' % (odbc_keyword, value))
self.odbc_conn_str = ';'.join(odbc_conn_parts)
diff --git a/sqlobject/mssql/mssqlconnection.py b/sqlobject/mssql/mssqlconnection.py
index c154dd4..811dcd8 100644
--- a/sqlobject/mssql/mssqlconnection.py
+++ b/sqlobject/mssql/mssqlconnection.py
@@ -12,6 +12,8 @@ class MSSQLConnection(DBAPI):
limit_re = re.compile('^\s*(select )(.*)', re.IGNORECASE)
+ odbc_keywords = ('Server', 'Port', 'User Id', 'Password', 'Database')
+
def __init__(self, db, user, password='', host='localhost', port=None,
autoCommit=0, **kw):
drivers = kw.pop('driver', None) or 'adodb,pymssql'
@@ -50,8 +52,9 @@ class MSSQLConnection(DBAPI):
'Cannot find an MSSQL driver, tried %s' % drivers)
if driver in ('odbc', 'pyodbc', 'pypyodbc'):
- self.make_odbc_conn_str(db, host, port, user, password,
- kw.pop('odbcdrv', 'SQL Server'))
+ self.make_odbc_conn_str(kw.pop('odbcdrv', 'SQL Server'),
+ db, host, port, user, password
+ )
elif driver in ('adodb', 'adodbapi'):
self.module = sqlmodule
diff --git a/sqlobject/mysql/mysqlconnection.py b/sqlobject/mysql/mysqlconnection.py
index 3da502b..bf6c48c 100644
--- a/sqlobject/mysql/mysqlconnection.py
+++ b/sqlobject/mysql/mysqlconnection.py
@@ -25,6 +25,8 @@ class MySQLConnection(DBAPI):
dbName = 'mysql'
schemes = [dbName]
+ odbc_keywords = ('Server', 'Port', 'UID', 'Password', 'Database')
+
def __init__(self, db, user, password='', host='localhost', port=0, **kw):
drivers = kw.pop('driver', None) or 'mysqldb'
for driver in drivers.split(','):
@@ -121,9 +123,10 @@ class MySQLConnection(DBAPI):
self.driver = driver
if driver in ('odbc', 'pyodbc', 'pypyodbc'):
- self.make_odbc_conn_str(db, host, port, user, password,
- kw.pop('odbcdrv',
- 'MySQL ODBC 5.3 ANSI Driver'))
+ self.make_odbc_conn_str(kw.pop('odbcdrv',
+ 'MySQL ODBC 5.3 ANSI Driver'),
+ db, host, port, user, password
+ )
global mysql_Bin
if not PY2 and mysql_Bin is None:
diff --git a/sqlobject/postgres/pgconnection.py b/sqlobject/postgres/pgconnection.py
index c8d9b35..420c157 100644
--- a/sqlobject/postgres/pgconnection.py
+++ b/sqlobject/postgres/pgconnection.py
@@ -27,6 +27,8 @@ class PostgresConnection(DBAPI):
dbName = 'postgres'
schemes = [dbName, 'postgresql']
+ odbc_keywords = ('Server', 'Port', 'UID', 'Password', 'Database')
+
def __init__(self, dsn=None, host=None, port=None, db=None,
user=None, password=None, **kw):
drivers = kw.pop('driver', None) or 'psycopg'
@@ -94,8 +96,9 @@ class PostgresConnection(DBAPI):
self.host = host
self.port = port
if driver in ('odbc', 'pyodbc', 'pypyodbc'):
- self.make_odbc_conn_str(db, host, port, user, password,
- kw.pop('odbcdrv', 'PostgreSQL ANSI'))
+ self.make_odbc_conn_str(kw.pop('odbcdrv', 'PostgreSQL ANSI'),
+ db, host, port, user, password
+ )
sslmode = kw.pop("sslmode", None)
if sslmode:
self.odbc_conn_str += ';sslmode=require'
-----------------------------------------------------------------------
Summary of changes:
appveyor.yml | 20 ++++++++++++++++++++
docs/DeveloperGuide.rst | 12 ++++++------
docs/News.rst | 2 ++
sqlobject/col.py | 14 +++++++++++++-
sqlobject/dbconnection.py | 18 +++++++-----------
sqlobject/mssql/mssqlconnection.py | 7 +++++--
sqlobject/mysql/mysqlconnection.py | 22 ++++++++++++++++++----
sqlobject/postgres/pgconnection.py | 10 +++++++---
sqlobject/sqlbuilder.py | 1 +
sqlobject/tests/test_validation.py | 5 ++++-
tox.ini | 3 ++-
11 files changed, 85 insertions(+), 29 deletions(-)
hooks/post-receive
--
SQLObject development repository
|