summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHajime Nakagami <nakagami@gmail.com>2014-02-14 01:37:13 +0900
committerHajime Nakagami <nakagami@gmail.com>2014-02-14 01:37:13 +0900
commitcca31911c1ac02610e942ddac122d35dd09e2cc5 (patch)
treeaea2faf820e4eebb407461d7ae85d692e8482af7
parent036cb93abfb44f4ab7fdb125eaaf2597a95a0187 (diff)
downloadsqlalchemy-pr/70.tar.gz
add firebird+firebirdsql dialectpr/70
-rw-r--r--lib/sqlalchemy/dialects/firebird/__init__.py2
-rw-r--r--lib/sqlalchemy/dialects/firebird/firebirdsql.py107
-rw-r--r--test/sql/test_types.py1
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_(