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