Commits

Mike Bayer committed f3b763d

- [feature] An experimental dialect for the fdb
driver is added, but is untested as I cannot
get the fdb package to build. [ticket:2504]

  • Participants
  • Parent commits 5ef6d29

Comments (0)

Files changed (4)

     using the DateTime type with Firebird; other
     dialects support this.
 
+  - [feature] An experimental dialect for the fdb
+    driver is added, but is untested as I cannot
+    get the fdb package to build.  [ticket:2504]
+
 - mysql
   - [bug] Dialect no longer emits expensive server
     collations query, as well as server casing,

File doc/build/dialects/firebird.rst

 -----------
 
 .. automodule:: sqlalchemy.dialects.firebird.kinterbasdb
+
+fdb
+---
+
+.. automodule:: sqlalchemy.dialects.firebird.fdb

File lib/sqlalchemy/dialects/firebird/fdb.py

+# firebird/fdb.py
+# Copyright (C) 2005-2012 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
+
+"""
+fdb is a kinterbasdb compatible DBAPI for Firebird.
+
+Usage is currently the same as that of kinterbasdb, with the exception
+of the connect string below.
+
+.. versionadded:: 0.8 - Support for the fdb Firebird driver.
+
+Status
+------
+
+The fdb dialect is new and not yet tested (can't get fdb to build).
+
+Connecting
+-----------
+
+Connect string format::
+
+    firebird+fdb://user:password@host:port/path/to/db[?key=value&key=value...]
+
+"""
+
+from .kinterbasdb import FBDialect_kinterbasdb
+from ... import util
+
+class FBDialect_fdb(FBDialect_kinterbasdb):
+
+    @classmethod
+    def dbapi(cls):
+        return  __import__('fdb')
+
+    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)
+
+        util.coerce_kw_type(opts, 'type_conv', int)
+
+        return ([], opts)
+
+    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)
+
+dialect = FBDialect_fdb

File lib/sqlalchemy/dialects/firebird/kinterbasdb.py

 # the MIT License: http://www.opensource.org/licenses/mit-license.php
 
 """
-The most common way to connect to a Firebird engine is implemented by
-kinterbasdb__, currently maintained__ directly by the Firebird people.
 
-The connection URL is of the form
-``firebird[+kinterbasdb]://user:password@host:port/path/to/db[?key=value&key=value...]``.
+Connecting
+-----------
+
+Connect string format::
+
+    firebird+kinterbasdb://user:password@host:port/path/to/db[?key=value&key=value...]
+
+Arguments
+----------
 
 Kinterbasedb backend specific keyword arguments are:
 
 __ http://kinterbasdb.sourceforge.net/dist_docs/usage.html#special_issue_concurrency
 """
 
-from sqlalchemy.dialects.firebird.base import FBDialect, \
-                                    FBCompiler, FBExecutionContext
-from sqlalchemy import util, types as sqltypes
-from sqlalchemy.util.compat import decimal
+from .base import FBDialect, FBExecutionContext
+from ... import util, types as sqltypes
+from ...util.compat import decimal
 from re import match
 
 
 
     @classmethod
     def dbapi(cls):
-        k = __import__('kinterbasdb')
-        return k
+        return __import__('kinterbasdb')
 
     def create_connect_args(self, url):
         opts = url.translate_connect_args(username='user')