summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/firebird
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-02-01 16:34:37 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2011-02-01 16:34:37 -0500
commit5a2c332f5e2faf321a89e93d5d183d7ec3767084 (patch)
tree46736b890c925c360d05a55009bd025ef9e64d9f /lib/sqlalchemy/dialects/firebird
parent7fcbd39118e470a8ef04256d486f46c176a21b0c (diff)
downloadsqlalchemy-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.py12
-rw-r--r--lib/sqlalchemy/dialects/firebird/kinterbasdb.py19
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,