diff -r b758351d191f -r cc9b7e14412b web/lib/django/contrib/gis/db/backends/mysql/operations.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/db/backends/mysql/operations.py Tue May 25 02:43:45 2010 +0200 @@ -0,0 +1,65 @@ +from django.db.backends.mysql.base import DatabaseOperations + +from django.contrib.gis.db.backends.adapter import WKTAdapter +from django.contrib.gis.db.backends.base import BaseSpatialOperations + +class MySQLOperations(DatabaseOperations, BaseSpatialOperations): + + compiler_module = 'django.contrib.gis.db.models.sql.compiler' + mysql = True + name = 'mysql' + select = 'AsText(%s)' + from_wkb = 'GeomFromWKB' + from_text = 'GeomFromText' + + Adapter = WKTAdapter + Adaptor = Adapter # Backwards-compatibility alias. + + geometry_functions = { + 'bbcontains' : 'MBRContains', # For consistency w/PostGIS API + 'bboverlaps' : 'MBROverlaps', # .. .. + 'contained' : 'MBRWithin', # .. .. + 'contains' : 'MBRContains', + 'disjoint' : 'MBRDisjoint', + 'equals' : 'MBREqual', + 'exact' : 'MBREqual', + 'intersects' : 'MBRIntersects', + 'overlaps' : 'MBROverlaps', + 'same_as' : 'MBREqual', + 'touches' : 'MBRTouches', + 'within' : 'MBRWithin', + } + + gis_terms = dict([(term, None) for term in geometry_functions.keys() + ['isnull']]) + + def geo_db_type(self, f): + return f.geom_type + + def get_geom_placeholder(self, value, srid): + """ + The placeholder here has to include MySQL's WKT constructor. Because + MySQL does not support spatial transformations, there is no need to + modify the placeholder based on the contents of the given value. + """ + if hasattr(value, 'expression'): + placeholder = '%s.%s' % tuple(map(self.quote_name, value.cols[value.expression])) + else: + placeholder = '%s(%%s)' % self.from_text + return placeholder + + def spatial_lookup_sql(self, lvalue, lookup_type, value, field, qn): + alias, col, db_type = lvalue + + geo_col = '%s.%s' % (qn(alias), qn(col)) + + lookup_info = self.geometry_functions.get(lookup_type, False) + if lookup_info: + return "%s(%s, %s)" % (lookup_info, geo_col, + self.get_geom_placeholder(value, field.srid)) + + # TODO: Is this really necessary? MySQL can't handle NULL geometries + # in its spatial indexes anyways. + if lookup_type == 'isnull': + return "%s IS %sNULL" % (geo_col, (not value and 'NOT ' or '')) + + raise TypeError("Got invalid lookup_type: %s" % repr(lookup_type))