79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
|
from ..adapters.sap import SAPDB
|
||
|
from .base import SQLDialect
|
||
|
from . import dialects, sqltype_for
|
||
|
|
||
|
|
||
|
@dialects.register_for(SAPDB)
|
||
|
class SAPDBDialect(SQLDialect):
|
||
|
@sqltype_for('integer')
|
||
|
def type_integer(self):
|
||
|
return 'INT'
|
||
|
|
||
|
@sqltype_for('text')
|
||
|
def type_text(self):
|
||
|
return 'LONG'
|
||
|
|
||
|
@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 'FIXED(%(precision)s,%(scale)s)'
|
||
|
|
||
|
@sqltype_for('id')
|
||
|
def type_id(self):
|
||
|
return 'INT PRIMARY KEY'
|
||
|
|
||
|
@sqltype_for('big-id')
|
||
|
def type_big_id(self):
|
||
|
return 'BIGINT PRIMARY KEY'
|
||
|
|
||
|
@sqltype_for('reference')
|
||
|
def type_reference(self):
|
||
|
return 'INT, FOREIGN KEY (%(field_name)s) REFERENCES ' + \
|
||
|
'%(foreign_key)s ON DELETE %(on_delete_action)s'
|
||
|
|
||
|
@sqltype_for('big-reference')
|
||
|
def type_big_reference(self):
|
||
|
return 'BIGINT, FOREIGN KEY (%(field_name)s) REFERENCES ' + \
|
||
|
'%(foreign_key)s ON DELETE %(on_delete_action)s'
|
||
|
|
||
|
def sequence_name(self, tablename):
|
||
|
return self.quote('%s_id_Seq' % tablename)
|
||
|
|
||
|
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
|
||
|
if whr:
|
||
|
whr2 = whr + " AND w_row > %i" % lmin
|
||
|
else:
|
||
|
whr2 = self.where('w_row > %i' % lmin)
|
||
|
return 'SELECT%s %s FROM (SELECT w_tmp.*, ROWNO w_row FROM ' + \
|
||
|
'(SELECT %s FROM %s%s%s%s) w_tmp WHERE ROWNO=%i) %s%s%s%s;' \
|
||
|
% (
|
||
|
dst, fields, fields, tables, whr, grp, order, lmax, tables,
|
||
|
whr2, grp, order)
|
||
|
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)
|