SP/web2py/gluon/packages/dal/pydal/adapters/firebird.py
Saturneic 064f602b1a Add.
2018-10-25 23:33:13 +08:00

93 lines
3.4 KiB
Python

import re
from .._compat import long
from .base import SQLAdapter
from . import adapters
@adapters.register_for('firebird')
class FireBird(SQLAdapter):
dbengine = "firebird"
drivers = ('kinterbasdb', 'firebirdsql', 'fdb', 'pyodbc')
support_distributed_transaction = True
commit_on_alter_table = True
REGEX_URI = re.compile(
'^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<host>\[[^/]+\]|' +
'[^\:/]+)(\:(?P<port>[0-9]+))?/(?P<db>.+?)' +
'(\?set_encoding=(?P<charset>\w+))?$')
def _initialize_(self, do_connect):
super(FireBird, self)._initialize_(do_connect)
ruri = self.uri.split('://', 1)[1]
m = self.REGEX_URI.match(ruri)
if not m:
raise SyntaxError("Invalid URI string in DAL")
user = self.credential_decoder(m.group('user'))
if not user:
raise SyntaxError('User required')
password = self.credential_decoder(m.group('password'))
if not password:
password = ''
host = m.group('host')
if not host:
raise SyntaxError('Host name required')
db = m.group('db')
if not db:
raise SyntaxError('Database name required')
port = int(m.group('port') or 3050)
charset = m.group('charset') or 'UTF8'
self.driver_args.update(
dsn='%s/%s:%s' % (host, port, db),
user=self.credential_decoder(user),
password=self.credential_decoder(password),
charset=charset)
def connector(self):
return self.driver.connect(**self.driver_args)
def lastrowid(self, table):
sequence_name = table._sequence_name
self.execute('SELECT gen_id(%s, 0) FROM rdb$database' % sequence_name)
return long(self.cursor.fetchone()[0])
def create_sequence_and_triggers(self, query, table, **args):
tablename = table._rname
sequence_name = table._sequence_name
trigger_name = table._trigger_name
self.execute(query)
self.execute('create generator %s;' % sequence_name)
self.execute('set generator %s to 0;' % sequence_name)
self.execute(
'create trigger %s for %s active before insert position 0 ' +
'as\nbegin\nif(new."id" is null) then\nbegin\n' +
'new."id" = gen_id(%s, 1);\nend\nend;' % (
trigger_name, tablename, sequence_name))
@adapters.register_for('firebird_embedded')
class FireBirdEmbedded(FireBird):
REGEX_URI = re.compile(
'^(?P<user>[^:@]+)(\:(?P<password>[^@]*))?@(?P<path>[^\?]+)' +
'(\?set_encoding=(?P<charset>\w+))?$')
def _initialize_(self, do_connect):
super(FireBird, self)._initialize_(do_connect)
ruri = self.uri.split('://', 1)[1]
m = self.REGEX_URI.match(ruri)
if not m:
raise SyntaxError("Invalid URI string in DAL")
user = self.credential_decoder(m.group('user'))
if not user:
raise SyntaxError('User required')
password = self.credential_decoder(m.group('password'))
if not password:
password = ''
pathdb = m.group('path')
if not pathdb:
raise SyntaxError('Path required')
charset = m.group('charset') or 'UTF8'
self.driver_args.update(
host='', database=pathdb, user=self.credential_decoder(user),
password=self.credential_decoder(password), charset=charset)