diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-01 16:34:37 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2011-02-01 16:34:37 -0500 |
| commit | 5a2c332f5e2faf321a89e93d5d183d7ec3767084 (patch) | |
| tree | 46736b890c925c360d05a55009bd025ef9e64d9f /lib/sqlalchemy/dialects/firebird | |
| parent | 7fcbd39118e470a8ef04256d486f46c176a21b0c (diff) | |
| download | sqlalchemy-5a2c332f5e2faf321a89e93d5d183d7ec3767084.tar.gz | |
- Some adjustments so that Interbase is supported as well.
FB/Interbase version idents are parsed into a structure
such as (8, 1, 1, 'interbase') or (2, 1, 588, 'firebird')
so they can be distinguished. [ticket:1885]
- fixed relfection of the "autoincrement" flag against a default
placed on the column.
Diffstat (limited to 'lib/sqlalchemy/dialects/firebird')
| -rw-r--r-- | lib/sqlalchemy/dialects/firebird/base.py | 12 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/firebird/kinterbasdb.py | 19 |
2 files changed, 22 insertions, 9 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py index 32ffbfd69..84222e428 100644 --- a/lib/sqlalchemy/dialects/firebird/base.py +++ b/lib/sqlalchemy/dialects/firebird/base.py @@ -375,7 +375,13 @@ class FBDialect(default.DefaultDialect): def initialize(self, connection): super(FBDialect, self).initialize(connection) - self._version_two = self.server_version_info > (2, ) + self._version_two = ('firebird' in self.server_version_info and \ + self.server_version_info >= (2, ) + ) or \ + ('interbase' in self.server_version_info and \ + self.server_version_info >= (6, ) + ) + if not self._version_two: # TODO: whatever other pre < 2.0 stuff goes here self.ischema_names = ischema_names.copy() @@ -510,7 +516,7 @@ class FBDialect(default.DefaultDialect): def get_columns(self, connection, table_name, schema=None, **kw): # Query to extract the details of all the fields of the given table tblqry = """ - SELECT DISTINCT r.rdb$field_name AS fname, + SELECT r.rdb$field_name AS fname, r.rdb$null_flag AS null_flag, t.rdb$type_name AS ftype, f.rdb$field_sub_type AS stype, @@ -587,7 +593,7 @@ class FBDialect(default.DefaultDialect): 'type' : coltype, 'nullable' : not bool(row['null_flag']), 'default' : defvalue, - 'autoincrement':default is None + 'autoincrement':defvalue is None } if orig_colname.lower() == orig_colname: diff --git a/lib/sqlalchemy/dialects/firebird/kinterbasdb.py b/lib/sqlalchemy/dialects/firebird/kinterbasdb.py index 73989097b..216fec270 100644 --- a/lib/sqlalchemy/dialects/firebird/kinterbasdb.py +++ b/lib/sqlalchemy/dialects/firebird/kinterbasdb.py @@ -49,6 +49,8 @@ from sqlalchemy.dialects.firebird.base import FBDialect, \ FBCompiler, FBExecutionContext from sqlalchemy import util, types as sqltypes from sqlalchemy.util.compat import decimal +from re import match + class _FBNumeric_kinterbasdb(sqltypes.Numeric): def bind_processor(self, dialect): @@ -133,18 +135,23 @@ class FBDialect_kinterbasdb(FBDialect): # 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. This is more than enough for our purposes, - # as this is mainly (only?) used by the testsuite. - - from re import match + # Interbase signature. fbconn = connection.connection version = fbconn.server_version - m = match('\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+) \w+ (\d+)\.(\d+)', version) + + return self._parse_version_info(version) + + def _parse_version_info(self, version): + m = match('\w+-V(\d+)\.(\d+)\.(\d+)\.(\d+)( \w+ (\d+)\.(\d+))?', version) if not m: raise AssertionError( "Could not determine version from string '%s'" % version) - return tuple([int(x) for x in m.group(5, 6, 4)]) + + 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 is_disconnect(self, e): if isinstance(e, (self.dbapi.OperationalError, |
