web/lib/django/contrib/gis/db/backends/mysql/operations.py
changeset 29 cc9b7e14412b
--- /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))