diff -r 000000000000 -r 0d40e90630ef web/lib/django/contrib/gis/db/models/sql/subqueries.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/db/models/sql/subqueries.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,39 @@ +from django.contrib.gis.db.backend import SpatialBackend +from django.db.models.query import insert_query + +if SpatialBackend.oracle: + from django.db import connection + from django.db.models.sql.subqueries import InsertQuery + + class OracleGeoInsertQuery(InsertQuery): + def insert_values(self, insert_values, raw_values=False): + """ + This routine is overloaded from InsertQuery so that no parameter is + passed into cx_Oracle for NULL geometries. The reason is that + cx_Oracle has no way to bind Oracle object values (like + MDSYS.SDO_GEOMETRY). + """ + placeholders, values = [], [] + for field, val in insert_values: + if hasattr(field, 'get_placeholder'): + ph = field.get_placeholder(val) + else: + ph = '%s' + + placeholders.append(ph) + self.columns.append(field.column) + + # If 'NULL' for the placeholder, omit appending None + # to the values list (which is used for db params). + if not ph == 'NULL': + values.append(val) + if raw_values: + self.values.extend(values) + else: + self.params += tuple(values) + self.values.extend(placeholders) + + def insert_query(model, values, return_id=False, raw_values=False): + query = OracleGeoInsertQuery(model, connection) + query.insert_values(values, raw_values) + return query.execute_sql(return_id)