From a521f212495c42c3f845690a98193ae5d1974a7e Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Sun, 17 Feb 2013 12:38:15 +0900 Subject: add cymysql dialect --- lib/sqlalchemy/dialects/mysql/__init__.py | 2 +- lib/sqlalchemy/dialects/mysql/cymysql.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 lib/sqlalchemy/dialects/mysql/cymysql.py (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/__init__.py b/lib/sqlalchemy/dialects/mysql/__init__.py index 1f7046410..2bb636ff3 100644 --- a/lib/sqlalchemy/dialects/mysql/__init__.py +++ b/lib/sqlalchemy/dialects/mysql/__init__.py @@ -6,7 +6,7 @@ from . import base, mysqldb, oursql, \ pyodbc, zxjdbc, mysqlconnector, pymysql,\ - gaerdbms + gaerdbms, cymysql # default dialect base.dialect = mysqldb.dialect diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py new file mode 100644 index 000000000..b448e00e4 --- /dev/null +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -0,0 +1,29 @@ +# mysql/cymysql.py +# Copyright (C) 2005-2013 the SQLAlchemy authors and contributors +# +# 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://:@/[?] + :url: https://github.com/nakagami/CyMySQL + +""" + +from .mysqldb import MySQLDialect_mysqldb + + +class MySQLDialect_cymysql(MySQLDialect_mysqldb): + driver = 'cymysql' + + description_encoding = None + + @classmethod + def dbapi(cls): + return __import__('cymysql') + +dialect = MySQLDialect_cymysql -- cgit v1.2.1 From 105c991c897cb26db8a3d49ee168b44daf6b6adf Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Mon, 25 Feb 2013 23:42:11 +0900 Subject: cython's _extract_error_code() --- lib/sqlalchemy/dialects/mysql/cymysql.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index b448e00e4..fb5de841f 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -16,7 +16,6 @@ from .mysqldb import MySQLDialect_mysqldb - class MySQLDialect_cymysql(MySQLDialect_mysqldb): driver = 'cymysql' @@ -26,4 +25,7 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb): def dbapi(cls): return __import__('cymysql') + def _extract_error_code(self, exception): + return exception.args[0] + dialect = MySQLDialect_cymysql -- cgit v1.2.1 From 7bb5f463dfeb39b8ba84a63147756d27901a2f56 Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Tue, 26 Feb 2013 00:30:27 +0900 Subject: fix cymysql's _extact_error_code() for py3 --- lib/sqlalchemy/dialects/mysql/cymysql.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index fb5de841f..1d6f97787 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -26,6 +26,9 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb): return __import__('cymysql') def _extract_error_code(self, exception): - return exception.args[0] + v = exception.args[0] + if not isinstance(v, int): + v = v.args[0] + return v dialect = MySQLDialect_cymysql -- cgit v1.2.1 From b8ba4f23a589538074d81f07a4a09b9b8c749f68 Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Tue, 26 Feb 2013 22:57:16 +0900 Subject: return erro_code cymysql dialects --- lib/sqlalchemy/dialects/mysql/cymysql.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index 1d6f97787..da06121dc 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -26,9 +26,10 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb): return __import__('cymysql') def _extract_error_code(self, exception): - v = exception.args[0] - if not isinstance(v, int): - v = v.args[0] - return v + # Py2K + return exception[0] + # end Py2K + # Py3K + #return exception.args[0].args[0] dialect = MySQLDialect_cymysql -- cgit v1.2.1 From 220f2b851a74de510f98fa62559411bcb37ab150 Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Fri, 1 Mar 2013 00:00:18 +0900 Subject: mymysql dialect --- lib/sqlalchemy/testing/engines.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/testing/engines.py b/lib/sqlalchemy/testing/engines.py index 20bcf0317..26f561016 100644 --- a/lib/sqlalchemy/testing/engines.py +++ b/lib/sqlalchemy/testing/engines.py @@ -229,7 +229,7 @@ def utf8_engine(url=None, options=None): 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 -- cgit v1.2.1 From 46edfb987241980fcf8b109b98a52ef9d9222a7f Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Fri, 1 Mar 2013 23:27:39 +0900 Subject: cython's result_processor() --- lib/sqlalchemy/dialects/mysql/cymysql.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index da06121dc..8f61dcb95 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -15,12 +15,41 @@ """ 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 + value = 0L + for i in map(ord, value): + value = value << 8 | i + # end Py2K + # Py3K + #value = 0 + #for i in value: + # value = value << 8 | i + 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') -- cgit v1.2.1 From af3689191ea28573b2bf44585ec0ed2b2e1a074d Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Fri, 1 Mar 2013 23:45:02 +0900 Subject: fix easy miss --- lib/sqlalchemy/dialects/mysql/cymysql.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index 8f61dcb95..017005866 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -26,14 +26,14 @@ class _cymysqlBIT(BIT): def process(value): if value is not None: # Py2K - value = 0L + v = 0L for i in map(ord, value): - value = value << 8 | i + v = v << 8 | i # end Py2K # Py3K - #value = 0 + #v = 0 #for i in value: - # value = value << 8 | i + # v = v << 8 | i return value return process -- cgit v1.2.1 From 0cd4b6f8058095edceb15cd99a04069318dcb08a Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Fri, 1 Mar 2013 23:58:28 +0900 Subject: fix easy miss --- lib/sqlalchemy/dialects/mysql/cymysql.py | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index 017005866..b55634392 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -34,6 +34,7 @@ class _cymysqlBIT(BIT): #v = 0 #for i in value: # v = v << 8 | i + return v return value return process -- cgit v1.2.1 From 979156c985d0c3992ae4127e0aa8b4c28ba97142 Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Sat, 2 Mar 2013 08:57:45 +0900 Subject: modify _extract_error_code() at cymysql dialect --- lib/sqlalchemy/dialects/mysql/cymysql.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index b55634392..ddd9ac322 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -56,10 +56,6 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb): return __import__('cymysql') def _extract_error_code(self, exception): - # Py2K - return exception[0] - # end Py2K - # Py3K - #return exception.args[0].args[0] + return exception.errno dialect = MySQLDialect_cymysql -- cgit v1.2.1 From 68c7827d695d1243a2344f450fc7762ba2faea57 Mon Sep 17 00:00:00 2001 From: Hajime Nakagami Date: Sat, 2 Mar 2013 13:37:00 +0900 Subject: is_disconnect() in cymysql dialect --- lib/sqlalchemy/dialects/mysql/cymysql.py | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/mysql/cymysql.py b/lib/sqlalchemy/dialects/mysql/cymysql.py index ddd9ac322..d9b43869c 100644 --- a/lib/sqlalchemy/dialects/mysql/cymysql.py +++ b/lib/sqlalchemy/dialects/mysql/cymysql.py @@ -58,4 +58,15 @@ class MySQLDialect_cymysql(MySQLDialect_mysqldb): 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 -- cgit v1.2.1