[Sqlalchemy-commits] sqlalchemy: merge default
Brought to you by:
zzzeek
From: <co...@sq...> - 2013-03-07 17:44:45
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/281bb94375a6 changeset: 9210:281bb94375a6 user: Mike Bayer <mi...@zz...> date: Thu Mar 07 12:44:28 2013 -0500 description: merge default diffstat: doc/build/changelog/changelog_08.rst | 6 ++ lib/sqlalchemy/dialects/mysql/__init__.py | 2 +- lib/sqlalchemy/dialects/mysql/cymysql.py | 72 +++++++++++++++++++++++++++++++ lib/sqlalchemy/testing/engines.py | 2 +- test/dialect/test_mysql.py | 1 + test/engine/test_execute.py | 4 +- test/engine/test_reconnect.py | 3 + test/engine/test_transaction.py | 1 + test/requirements.py | 4 +- test/sql/test_types.py | 10 ++++ 10 files changed, 100 insertions(+), 5 deletions(-) diffs (213 lines): diff -r 289c4124701d -r 281bb94375a6 doc/build/changelog/changelog_08.rst --- a/doc/build/changelog/changelog_08.rst Mon Mar 04 12:50:22 2013 -0500 +++ b/doc/build/changelog/changelog_08.rst Thu Mar 07 12:44:28 2013 -0500 @@ -17,6 +17,12 @@ * :ref:`metadata_create_drop_tables` .. change:: + :tags: feature, mysql + :pullreq: 42 + + New dialect for CyMySQL added, courtesy Hajime Nakagami. + + .. change:: :tags: bug, orm :tickets: 2674 diff -r 289c4124701d -r 281bb94375a6 lib/sqlalchemy/dialects/mysql/__init__.py --- a/lib/sqlalchemy/dialects/mysql/__init__.py Mon Mar 04 12:50:22 2013 -0500 +++ b/lib/sqlalchemy/dialects/mysql/__init__.py Thu Mar 07 12:44:28 2013 -0500 @@ -6,7 +6,7 @@ from . import base, mysqldb, oursql, \ pyodbc, zxjdbc, mysqlconnector, pymysql,\ - gaerdbms + gaerdbms, cymysql # default dialect base.dialect = mysqldb.dialect diff -r 289c4124701d -r 281bb94375a6 lib/sqlalchemy/dialects/mysql/cymysql.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py Thu Mar 07 12:44:28 2013 -0500 @@ -0,0 +1,72 @@ +# mysql/cymysql.py +# Copyright (C) 2005-2013 the SQLAlchemy authors and contributors <see AUTHORS file> +# +# This module is part of SQLAlchemy and is released under +# the MIT License: http://www.opensource.org/licenses/mit-license.php + +""" + +.. dialect:: mysql+cymysql + :name: CyMySQL + :dbapi: cymysql + :connectstring: mysql+cymysql://<username>:<password>@<host>/<dbname>[?<options>] + :url: https://github.com/nakagami/CyMySQL + +""" + +from .mysqldb import MySQLDialect_mysqldb +from .base import (BIT, MySQLDialect) +from ... import util + +class _cymysqlBIT(BIT): + def result_processor(self, dialect, coltype): + """Convert a MySQL's 64 bit, variable length binary string to a long. + """ + + def process(value): + if value is not None: + # Py2K + v = 0L + for i in map(ord, value): + v = v << 8 | i + # end Py2K + # Py3K + #v = 0 + #for i in value: + # v = v << 8 | i + return v + return value + return process + + +class MySQLDialect_cymysql(MySQLDialect_mysqldb): + driver = 'cymysql' + + description_encoding = None + + colspecs = util.update_copy( + MySQLDialect.colspecs, + { + BIT: _cymysqlBIT, + } + ) + + @classmethod + def dbapi(cls): + return __import__('cymysql') + + def _extract_error_code(self, exception): + return exception.errno + + def is_disconnect(self, e, connection, cursor): + if isinstance(e, self.dbapi.OperationalError): + return self._extract_error_code(e) in \ + (2006, 2013, 2014, 2045, 2055) + elif isinstance(e, self.dbapi.InterfaceError): + # if underlying connection is closed, + # this is the error you get + return True + else: + return False + +dialect = MySQLDialect_cymysql diff -r 289c4124701d -r 281bb94375a6 lib/sqlalchemy/testing/engines.py --- a/lib/sqlalchemy/testing/engines.py Mon Mar 04 12:50:22 2013 -0500 +++ b/lib/sqlalchemy/testing/engines.py Thu Mar 07 12:44:28 2013 -0500 @@ -229,7 +229,7 @@ from sqlalchemy.engine import url as engine_url if config.db.dialect.name == 'mysql' and \ - config.db.driver in ['mysqldb', 'pymysql']: + config.db.driver in ['mysqldb', 'pymysql', 'cymysql']: # note 1.2.1.gamma.6 or greater of MySQLdb # needed here url = url or config.db_url diff -r 289c4124701d -r 281bb94375a6 test/dialect/test_mysql.py --- a/test/dialect/test_mysql.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/dialect/test_mysql.py Thu Mar 07 12:44:28 2013 -0500 @@ -1500,6 +1500,7 @@ @testing.fails_on('mysql+mysqldb', 'uses format') @testing.fails_on('mysql+pymysql', 'uses format') + @testing.fails_on('mysql+cymysql', 'uses format') @testing.fails_on('mysql+oursql', 'uses format') @testing.fails_on('mysql+pyodbc', 'uses format') @testing.fails_on('mysql+zxjdbc', 'uses format') diff -r 289c4124701d -r 281bb94375a6 test/engine/test_execute.py --- a/test/engine/test_execute.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/engine/test_execute.py Thu Mar 07 12:44:28 2013 -0500 @@ -110,7 +110,7 @@ # some psycopg2 versions bomb this. @testing.fails_on_everything_except('mysql+mysqldb', 'mysql+pymysql', - 'mysql+mysqlconnector', 'postgresql') + 'mysql+cymysql', 'mysql+mysqlconnector', 'postgresql') @testing.fails_on('postgresql+zxjdbc', 'sprintf not supported') def test_raw_sprintf(self): def go(conn): @@ -157,7 +157,7 @@ 'db-api flaky') @testing.fails_on_everything_except('postgresql+psycopg2', 'postgresql+pypostgresql', 'mysql+mysqlconnector', - 'mysql+pymysql') + 'mysql+pymysql', 'mysql+cymysql') def test_raw_python(self): def go(conn): conn.execute('insert into users (user_id, user_name) ' diff -r 289c4124701d -r 281bb94375a6 test/engine/test_reconnect.py --- a/test/engine/test_reconnect.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/engine/test_reconnect.py Thu Mar 07 12:44:28 2013 -0500 @@ -487,6 +487,9 @@ meta.drop_all() engine.dispose() + @testing.fails_on('+cymysql', + "Buffers the result set and doesn't check for " + "connection close") @testing.fails_on('+pymysql', "Buffers the result set and doesn't check for " "connection close") diff -r 289c4124701d -r 281bb94375a6 test/engine/test_transaction.py --- a/test/engine/test_transaction.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/engine/test_transaction.py Thu Mar 07 12:44:28 2013 -0500 @@ -29,6 +29,7 @@ testing.db.execute(users.delete()).close() @classmethod + @testing.crashes('mysql+cymysql', 'deadlock') def teardown_class(cls): users.drop(testing.db) diff -r 289c4124701d -r 281bb94375a6 test/requirements.py --- a/test/requirements.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/requirements.py Thu Mar 07 12:44:28 2013 -0500 @@ -378,6 +378,7 @@ """ return fails_on_everything_except('mysql+mysqldb', 'mysql+oursql', 'sqlite+pysqlite', 'mysql+pymysql', + 'mysql+cymysql', 'sybase', 'mssql+pyodbc', 'mssql+mxodbc') @property @@ -393,7 +394,8 @@ """ return fails_on_everything_except('mysql+mysqldb', 'mysql+oursql', - 'sqlite+pysqlite', 'mysql+pymysql') + 'sqlite+pysqlite', 'mysql+pymysql', + 'mysql+cymysql') @property def sane_multi_rowcount(self): diff -r 289c4124701d -r 281bb94375a6 test/sql/test_types.py --- a/test/sql/test_types.py Mon Mar 04 12:50:22 2013 -0500 +++ b/test/sql/test_types.py Thu Mar 07 12:44:28 2013 -0500 @@ -690,6 +690,16 @@ ('charset' in testing.db.url.query) ) + elif testing.against('mysql+cymysql'): + eq_( + testing.db.dialect.returns_unicode_strings, + # Py3K + #True + # Py2K + False + # end Py2K + ) + else: expected = (testing.db.name, testing.db.driver) in \ ( |