summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/informix/informixdb.py
blob: 722a0f0f4d6dbffd419aaf8d1a2c17fd2e74c8f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from sqlalchemy.dialects.informix.base import InformixDialect
from sqlalchemy.engine import default

class InfoExecutionContext(default.DefaultExecutionContext):
    def post_exec(self):
        if self.isinsert:
            self._lastrowid = [self.cursor.sqlerrd[1]]


class Informix_informixdb(InformixDialect):
    driver = 'informixdb'
    default_paramstyle = 'qmark'
    execution_context_cls = InfoExecutionContext

    @classmethod
    def dbapi(cls):
        return __import__('informixdb')

    def create_connect_args(self, url):
        if url.host:
            dsn = '%s@%s' % (url.database, url.host)
        else:
            dsn = url.database

        if url.username:
            opt = {'user': url.username, 'password': url.password}
        else:
            opt = {}

        return ([dsn], opt)

    def _get_server_version_info(self, connection):
        # http://informixdb.sourceforge.net/manual.html#inspecting-version-numbers
        vers = connection.dbms_version
        
        # TODO: not tested
        return tuple([int(x) for x in vers.split('.')])

    def is_disconnect(self, e):
        if isinstance(e, self.dbapi.OperationalError):
            return 'closed the connection' in str(e) or 'connection not open' in str(e)
        else:
            return False


dialect = Informix_informixdb