1 | from .._compat import integer_types, long |
---|
2 | from .base import SQLAdapter |
---|
3 | from . import adapters, with_connection_or_raise |
---|
4 | |
---|
5 | |
---|
6 | class DB2(SQLAdapter): |
---|
7 | dbengine = "db2" |
---|
8 | |
---|
9 | def _initialize_(self): |
---|
10 | super(DB2, self)._initialize_() |
---|
11 | self.ruri = self.uri.split("://", 1)[1] |
---|
12 | |
---|
13 | @with_connection_or_raise |
---|
14 | def execute(self, *args, **kwargs): |
---|
15 | command = self.filter_sql_command(args[0]) |
---|
16 | if command[-1:] == ";": |
---|
17 | command = command[:-1] |
---|
18 | handlers = self._build_handlers_for_execution() |
---|
19 | for handler in handlers: |
---|
20 | handler.before_execute(command) |
---|
21 | if kwargs.get("placeholders"): |
---|
22 | args.append(kwargs["placeholders"]) |
---|
23 | del kwargs["placeholders"] |
---|
24 | rv = self.cursor.execute(command, *args[1:], **kwargs) |
---|
25 | for handler in handlers: |
---|
26 | handler.after_execute(command) |
---|
27 | return rv |
---|
28 | |
---|
29 | def lastrowid(self, table): |
---|
30 | self.execute( |
---|
31 | "SELECT DISTINCT IDENTITY_VAL_LOCAL() FROM %s;" % table._rname |
---|
32 | if table._rname |
---|
33 | else table |
---|
34 | ) |
---|
35 | return long(self.cursor.fetchone()[0]) |
---|
36 | |
---|
37 | def rowslice(self, rows, minimum=0, maximum=None): |
---|
38 | if maximum is None: |
---|
39 | return rows[minimum:] |
---|
40 | return rows[minimum:maximum] |
---|
41 | |
---|
42 | def test_connection(self): |
---|
43 | self.execute("select * from sysibm.sysdummy1") |
---|
44 | |
---|
45 | |
---|
46 | @adapters.register_for("db2:ibm_db_dbi") |
---|
47 | class DB2IBM(DB2): |
---|
48 | drivers = ("ibm_db_dbi",) |
---|
49 | |
---|
50 | def connector(self): |
---|
51 | uriparts = self.ruri.split(";") |
---|
52 | cnxn = {} |
---|
53 | for var in uriparts: |
---|
54 | v = var.split("=") |
---|
55 | cnxn[v[0].lower()] = v[1] |
---|
56 | return self.driver.connect( |
---|
57 | cnxn["dsn"], cnxn["uid"], cnxn["pwd"], **self.driver_args |
---|
58 | ) |
---|
59 | |
---|
60 | |
---|
61 | @adapters.register_for("db2:pyodbc") |
---|
62 | class DB2Pyodbc(DB2): |
---|
63 | drivers = ("pyodbc",) |
---|
64 | |
---|
65 | def connector(self): |
---|
66 | conn = self.driver.connect(self.ruri, **self.driver_args) |
---|
67 | conn.setencoding(encoding="utf-8") |
---|
68 | return conn |
---|