from ..adapters.sqlite import SQLite, Spatialite from .base import SQLDialect from . import dialects, sqltype_for @dialects.register_for(SQLite) class SQLiteDialect(SQLDialect): @sqltype_for('string') def type_string(self): return 'CHAR(%(length)s)' @sqltype_for('float') def type_float(self): return 'DOUBLE' @sqltype_for('double') def type_double(self): return self.types['float'] @sqltype_for('decimal') def type_decimal(self): return self.types['float'] def extract(self, field, what, query_env={}): return "web2py_extract('%s', %s)" % (what, self.expand(field, query_env=query_env)) def regexp(self, first, second, query_env={}): return '(%s REGEXP %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): if distinct and distinct is not True: raise SyntaxError( 'DISTINCT ON is not supported by SQLite') return super(SQLiteDialect, self).select( fields, tables, where, groupby, having, orderby, limitby, distinct, for_update) def truncate(self, table, mode=''): tablename = self.adapter.expand(table._raw_rname, 'string') return [ self.delete(table), "DELETE FROM sqlite_sequence WHERE name=%s" % tablename] def writing_alias(self, table): if table._dalname != table._tablename: raise SyntaxError( 'SQLite does not support UPDATE/DELETE on aliased table') return table._rname @dialects.register_for(Spatialite) class SpatialiteDialect(SQLiteDialect): @sqltype_for('geometry') def type_geometry(self): return 'GEOMETRY' def st_asgeojson(self, first, second, query_env={}): return 'AsGeoJSON(%s,%s,%s)' % ( self.expand(first, query_env=query_env), second['precision'], second['options']) def st_astext(self, first, query_env={}): return 'AsText(%s)' % self.expand(first, query_env=query_env) def st_contains(self, first, second, query_env={}): return 'Contains(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_distance(self, first, second, query_env={}): return 'Distance(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_equals(self, first, second, query_env={}): return 'Equals(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_intersects(self, first, second, query_env={}): return 'Intersects(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_overlaps(self, first, second, query_env={}): return 'Overlaps(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_simplify(self, first, second, query_env={}): return 'Simplify(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, 'double', query_env=query_env)) def st_touches(self, first, second, query_env={}): return 'Touches(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env)) def st_within(self, first, second, query_env={}): return 'Within(%s,%s)' % ( self.expand(first, query_env=query_env), self.expand(second, first.type, query_env=query_env))