diff options
author | Hajime Nakagami <nakagami@gmail.com> | 2014-02-14 01:37:13 +0900 |
---|---|---|
committer | Hajime Nakagami <nakagami@gmail.com> | 2014-02-14 01:37:13 +0900 |
commit | cca31911c1ac02610e942ddac122d35dd09e2cc5 (patch) | |
tree | aea2faf820e4eebb407461d7ae85d692e8482af7 | |
parent | 036cb93abfb44f4ab7fdb125eaaf2597a95a0187 (diff) | |
download | sqlalchemy-pr/70.tar.gz |
add firebird+firebirdsql dialectpr/70
-rw-r--r-- | lib/sqlalchemy/dialects/firebird/__init__.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/firebird/firebirdsql.py | 107 | ||||
-rw-r--r-- | test/sql/test_types.py | 1 |
3 files changed, 109 insertions, 1 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/__init__.py b/lib/sqlalchemy/dialects/firebird/__init__.py index 094ac3e83..9df8f8911 100644 --- a/lib/sqlalchemy/dialects/firebird/__init__.py +++ b/lib/sqlalchemy/dialects/firebird/__init__.py @@ -4,7 +4,7 @@ # This module is part of SQLAlchemy and is released under # the MIT License: http://www.opensource.org/licenses/mit-license.php -from sqlalchemy.dialects.firebird import base, kinterbasdb, fdb +from sqlalchemy.dialects.firebird import base, kinterbasdb, fdb, firebirdsql base.dialect = fdb.dialect diff --git a/lib/sqlalchemy/dialects/firebird/firebirdsql.py b/lib/sqlalchemy/dialects/firebird/firebirdsql.py new file mode 100644 index 000000000..7cdf98797 --- /dev/null +++ b/lib/sqlalchemy/dialects/firebird/firebirdsql.py @@ -0,0 +1,107 @@ +# firebird/firebirdsql.py +# Copyright (C) 2005-2014 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:: firebird+firebirdsql + :name: firebirdsql + :connectstring: firebird+firebirdsql://user:password@host:port/path/to/db[?key=value&key=value...] + :url: https://pypi.python.org/pypi/firebirdsql + + firebirdsql is a DBAPI for Firebird. + +Arguments +---------- + +The ``firebirdsql`` dialect is based on the :mod:`sqlalchemy.dialects.firebird.fdb` +dialect, however does not accept every argument that Kinterbasdb does. + +""" +import sys +from re import match +from .base import FBDialect +from ... import util + +def Binary(x): + if isinstance(x, bytes): + return x + if util.py3k: + return str(x).encode('utf-8') + else: + return bytes(x) + +class FBDialect_firebirdsql(FBDialect): + driver = 'firebirdsql' + supports_sane_rowcount = False + supports_sane_multi_rowcount = False + supports_native_decimal = True + supports_unicode_statements = True + + def __init__(self, retaining=False, **kwargs): + self.retaining = retaining + super(FBDialect_firebirdsql, self).__init__( + enable_rowcount=False, + retaining=retaining, **kwargs) + + @classmethod + def dbapi(cls): + module = __import__('firebirdsql') + module.Binary = Binary + return module + + def create_connect_args(self, url): + opts = url.translate_connect_args(username='user') + if opts.get('port'): + opts['host'] = "%s/%s" % (opts['host'], opts['port']) + del opts['port'] + opts.update(url.query) + + return ([], opts) + + def _parse_version_info(self, version): + m = match('\w+-[VT](\d+)\.(\d+)\.(\d+)\.(\d+)( \w+ (\d+)\.(\d+))?', version) + if not m: + raise AssertionError( + "Could not determine version from string '%s'" % version) + + if m.group(5) != None: + return tuple([int(x) for x in m.group(6, 7, 4)] + ['firebird']) + else: + return tuple([int(x) for x in m.group(1, 2, 3)] + ['interbase']) + + def initialize(self, connection): + super(FBDialect_firebirdsql, self).initialize(connection) + + def do_rollback(self, dbapi_connection): + dbapi_connection.rollback(self.retaining) + + def do_commit(self, dbapi_connection): + dbapi_connection.commit(self.retaining) + + + def _get_server_version_info(self, connection): + """Get the version of the Firebird server used by a connection. + + Returns a tuple of (`major`, `minor`, `build`), three integers + representing the version of the attached server. + """ + + # This is the simpler approach (the other uses the services api), + # that for backward compatibility reasons returns a string like + # LI-V6.3.3.12981 Firebird 2.0 + # where the first version is a fake one resembling the old + # Interbase signature. + + isc_info_firebird_version = 103 + fbconn = connection.connection + + version = fbconn.db_info(isc_info_firebird_version) + + return self._parse_version_info(version) + + def is_disconnect(self, e, connection, cursor): + return connection is None or connection.is_disconnect() + +dialect = FBDialect_firebirdsql diff --git a/test/sql/test_types.py b/test/sql/test_types.py index 3950b1a6a..cda1726da 100644 --- a/test/sql/test_types.py +++ b/test/sql/test_types.py @@ -886,6 +886,7 @@ class UnicodeTest(fixtures.TestBase): ('mysql', 'mysqlconnector'), ('sqlite', 'pysqlite'), ('oracle', 'zxjdbc'), + ('firebird', 'firebirdsql'), ) eq_( |