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)