115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
from ..adapters.firebird import FireBird
|
|
from ..objects import Expression
|
|
from .base import SQLDialect
|
|
from . import dialects, sqltype_for
|
|
|
|
|
|
@dialects.register_for(FireBird)
|
|
class FireBirdDialect(SQLDialect):
|
|
@sqltype_for('text')
|
|
def type_text(self):
|
|
return 'BLOB SUB_TYPE 1'
|
|
|
|
@sqltype_for('bigint')
|
|
def type_bigint(self):
|
|
return 'BIGINT'
|
|
|
|
@sqltype_for('double')
|
|
def type_double(self):
|
|
return 'DOUBLE PRECISION'
|
|
|
|
@sqltype_for('decimal')
|
|
def type_decimal(self):
|
|
return 'DECIMAL(%(precision)s,%(scale)s)'
|
|
|
|
@sqltype_for('blob')
|
|
def type_blob(self):
|
|
return 'BLOB SUB_TYPE 0'
|
|
|
|
@sqltype_for('id')
|
|
def type_id(self):
|
|
return 'INTEGER PRIMARY KEY'
|
|
|
|
@sqltype_for('big-id')
|
|
def type_big_id(self):
|
|
return 'BIGINT PRIMARY KEY'
|
|
|
|
@sqltype_for('reference')
|
|
def type_reference(self):
|
|
return 'INTEGER REFERENCES %(foreign_key)s ' + \
|
|
'ON DELETE %(on_delete_action)s'
|
|
|
|
@sqltype_for('big-reference')
|
|
def type_big_reference(self):
|
|
return 'BIGINT REFERENCES %(foreign_key)s ' + \
|
|
'ON DELETE %(on_delete_action)s'
|
|
|
|
def sequence_name(self, tablename):
|
|
return self.quote('genid_%s' % tablename)
|
|
|
|
def trigger_name(self, tablename):
|
|
return 'trg_id_%s' % tablename
|
|
|
|
@property
|
|
def random(self):
|
|
return 'RAND()'
|
|
|
|
def not_null(self, default, field_type):
|
|
return 'DEFAULT %s NOT NULL' % \
|
|
self.adapter.represent(default, field_type)
|
|
|
|
def epoch(self, val, query_env={}):
|
|
return "DATEDIFF(second, '1970-01-01 00:00:00', %s)" % \
|
|
self.expand(val, query_env=query_env)
|
|
|
|
def substring(self, field, parameters, query_env={}):
|
|
return 'SUBSTRING(%s from %s for %s)' % (
|
|
self.expand(field, query_env=query_env), parameters[0],
|
|
parameters[1])
|
|
|
|
def length(self, val, query_env={}):
|
|
return "CHAR_LENGTH(%s)" % self.expand(val, query_env=query_env)
|
|
|
|
def contains(self, first, second, case_sensitive=True, query_env={}):
|
|
if first.type.startswith('list:'):
|
|
second = Expression(None, self.concat('|', Expression(
|
|
None, self.replace(second, ('|', '||'), query_env)), '|'))
|
|
return '(%s CONTAINING %s)' % (
|
|
self.expand(first, query_env=query_env),
|
|
self.expand(second, 'string', query_env=query_env))
|
|
|
|
def select(self, fields, tables, where=None, groupby=None, having=None,
|
|
orderby=None, limitby=None, distinct=False, for_update=False):
|
|
dst, whr, grp, order, limit, offset, upd = '', '', '', '', '', '', ''
|
|
if distinct is True:
|
|
dst = ' DISTINCT'
|
|
elif distinct:
|
|
dst = ' DISTINCT ON (%s)' % distinct
|
|
if where:
|
|
whr = ' %s' % self.where(where)
|
|
if groupby:
|
|
grp = ' GROUP BY %s' % groupby
|
|
if having:
|
|
grp += ' HAVING %s' % having
|
|
if orderby:
|
|
order = ' ORDER BY %s' % orderby
|
|
if limitby:
|
|
(lmin, lmax) = limitby
|
|
limit = ' FIRST %i' % (lmax - lmin)
|
|
offset = ' SKIP %i' % lmin
|
|
if for_update:
|
|
upd = ' FOR UPDATE'
|
|
return 'SELECT%s%s%s %s FROM %s%s%s%s%s;' % (
|
|
dst, limit, offset, fields, tables, whr, grp, order, upd)
|
|
|
|
def drop_table(self, table, mode):
|
|
sequence_name = table._sequence_name
|
|
return [
|
|
'DROP TABLE %s %s;' % (table._rname, mode),
|
|
'DROP GENERATOR %s;' % sequence_name]
|
|
|
|
def truncate(self, table, mode=''):
|
|
return [
|
|
'DELETE FROM %s;' % table._rname,
|
|
'SET GENERATOR %s TO 0;' % table._sequence_name]
|