SP/web2py/gluon/packages/dal/pydal/dialects/sqlite.py
Saturneic 064f602b1a Add.
2018-10-25 23:33:13 +08:00

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))