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, ]