1 | import re |
---|
2 | from .._compat import long |
---|
3 | from .base import SQLAdapter |
---|
4 | from . import adapters |
---|
5 | |
---|
6 | |
---|
7 | @adapters.register_for("firebird") |
---|
8 | class FireBird(SQLAdapter): |
---|
9 | dbengine = "firebird" |
---|
10 | drivers = ("kinterbasdb", "firebirdsql", "fdb", "pyodbc") |
---|
11 | |
---|
12 | support_distributed_transaction = True |
---|
13 | commit_on_alter_table = True |
---|
14 | |
---|
15 | REGEX_URI = ( |
---|
16 | "^(?P<user>[^:@]+)(:(?P<password>[^@]*))?" |
---|
17 | r"@(?P<host>[^:/]+|\[[^\]]+\])(:(?P<port>\d+))?" |
---|
18 | "/(?P<db>[^?]+)" |
---|
19 | r"(\?set_encoding=(?P<charset>\w+))?$" |
---|
20 | ) |
---|
21 | |
---|
22 | def _initialize_(self): |
---|
23 | super(FireBird, self)._initialize_() |
---|
24 | ruri = self.uri.split("://", 1)[1] |
---|
25 | m = re.match(self.REGEX_URI, ruri) |
---|
26 | if not m: |
---|
27 | raise SyntaxError("Invalid URI string in DAL") |
---|
28 | user = self.credential_decoder(m.group("user")) |
---|
29 | password = self.credential_decoder(m.group("password")) |
---|
30 | if password is None: |
---|
31 | password = "" |
---|
32 | host = m.group("host") |
---|
33 | db = self.credential_decoder(m.group("db")) |
---|
34 | port = int(m.group("port") or 3050) |
---|
35 | charset = m.group("charset") or "UTF8" |
---|
36 | self.driver_args.update( |
---|
37 | dsn="%s/%s:%s" % (host, port, db), |
---|
38 | user=user, |
---|
39 | password=password, |
---|
40 | charset=charset, |
---|
41 | ) |
---|
42 | |
---|
43 | def connector(self): |
---|
44 | return self.driver.connect(**self.driver_args) |
---|
45 | |
---|
46 | def test_connection(self): |
---|
47 | self.execute('select current_timestamp from RDB$DATABASE') |
---|
48 | |
---|
49 | def lastrowid(self, table): |
---|
50 | sequence_name = table._sequence_name |
---|
51 | self.execute("SELECT gen_id(%s, 0) FROM rdb$database" % sequence_name) |
---|
52 | return long(self.cursor.fetchone()[0]) |
---|
53 | |
---|
54 | def create_sequence_and_triggers(self, query, table, **args): |
---|
55 | tablename = table._rname |
---|
56 | sequence_name = table._sequence_name |
---|
57 | trigger_name = table._trigger_name |
---|
58 | self.execute(query) |
---|
59 | self.execute("create generator %s;" % sequence_name) |
---|
60 | self.execute("set generator %s to 0;" % sequence_name) |
---|
61 | qid = self.dialect.quote_template % "id" |
---|
62 | self.execute( |
---|
63 | "create trigger %s for %s active before insert position 0 as\n" |
---|
64 | "begin\nif(new.%s is null) then new.%s = gen_id(%s, 1);\n" |
---|
65 | "end;" % (trigger_name, tablename, qid, qid, sequence_name) |
---|
66 | ) |
---|
67 | |
---|
68 | |
---|
69 | @adapters.register_for("firebird_embedded") |
---|
70 | class FireBirdEmbedded(FireBird): |
---|
71 | REGEX_URI = ( |
---|
72 | "^(?P<user>[^:@]+)(:(?P<password>[^@]*))?" |
---|
73 | r"@(?P<path>[^?]+)(\?set_encoding=(?P<charset>\w+))?$" |
---|
74 | ) |
---|
75 | |
---|
76 | def _initialize_(self): |
---|
77 | super(FireBird, self)._initialize_() |
---|
78 | ruri = self.uri.split("://", 1)[1] |
---|
79 | m = re.match(self.REGEX_URI, ruri) |
---|
80 | if not m: |
---|
81 | raise SyntaxError("Invalid URI string in DAL") |
---|
82 | user = self.credential_decoder(m.group("user")) |
---|
83 | password = self.credential_decoder(m.group("password")) |
---|
84 | if password is None: |
---|
85 | password = "" |
---|
86 | pathdb = m.group("path") |
---|
87 | charset = m.group("charset") or "UTF8" |
---|
88 | self.driver_args.update( |
---|
89 | host="", database=pathdb, user=user, password=password, charset=charset |
---|
90 | ) |
---|