108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
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))
|