From 85ea9507595f93505d0b921f9bdcaf7408126f68 Mon Sep 17 00:00:00 2001 From: Justin Bronn Date: Thu, 30 Aug 2007 12:58:04 +0000 Subject: [PATCH] gis: fixed deprecated `backend` references in _get_sql_clause(); quote_name() no longer a GeoQuerySet attribute; PostGIS db creation now tries to use `pg_config` to obtain the POSTGIS_SQL_PATH. git-svn-id: http://code.djangoproject.com/svn/django/branches/gis@6026 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/gis/db/backend/__init__.py | 8 +++-- .../gis/db/backend/postgis/creation.py | 31 +++++++++++++------ django/contrib/gis/db/models/query.py | 24 +++++++------- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/django/contrib/gis/db/backend/__init__.py b/django/contrib/gis/db/backend/__init__.py index 06a5d3e736..50f7fbc34c 100644 --- a/django/contrib/gis/db/backend/__init__.py +++ b/django/contrib/gis/db/backend/__init__.py @@ -13,9 +13,9 @@ """ from django.conf import settings from django.db import connection -from django.db.models.query import LOOKUP_SEPARATOR, field_choices, find_field, FieldFound, QUERY_TERMS, get_where_clause +from django.db.models.query import field_choices, find_field, get_where_clause, \ + FieldFound, LOOKUP_SEPARATOR, QUERY_TERMS from django.utils.datastructures import SortedDict -qn = connection.ops.quote_name if settings.DATABASE_ENGINE == 'postgresql_psycopg2': # PostGIS is the spatial database, getting the rquired modules, renaming as necessary. @@ -30,7 +30,7 @@ else: # parse_lookup() and lookup_inner() are modified from their django/db/models/query.py # counterparts to support constructing SQL for geographic queries. # -# Status: Synced with r5609. +# Status: Synced with r5982. # def parse_lookup(kwarg_items, opts): # Helper function that handles converting API kwargs @@ -90,6 +90,7 @@ def parse_lookup(kwarg_items, opts): return joins, where, params def lookup_inner(path, lookup_type, value, opts, table, column): + qn = connection.ops.quote_name joins, where, params = SortedDict(), [], [] current_opts = opts current_table = table @@ -246,6 +247,7 @@ def lookup_inner(path, lookup_type, value, opts, table, column): else: # Last query term was a normal field. column = field.column + db_type = field.db_type() # If the field is a geometry field, then the WHERE clause will need to be obtained # with the get_geo_where_clause() diff --git a/django/contrib/gis/db/backend/postgis/creation.py b/django/contrib/gis/db/backend/postgis/creation.py index dfd62a841e..82977792c4 100644 --- a/django/contrib/gis/db/backend/postgis/creation.py +++ b/django/contrib/gis/db/backend/postgis/creation.py @@ -6,7 +6,7 @@ from commands import getstatusoutput import os, re, sys def create_lang(db_name, verbosity=1): - "This sets up the pl/pgsql language on the given database." + "Sets up the pl/pgsql language on the given database." # Getting the command-line options for the shell command options = get_cmd_options(db_name) @@ -50,8 +50,11 @@ def _create_with_cursor(db_name, verbosity=1, autoclobber=False): created_regex = re.compile(r'^createdb: database creation failed: ERROR: database ".+" already exists') def _create_with_shell(db_name, verbosity=1, autoclobber=False): - """If no spatial database already exists, then using a cursor will not work. Thus, a - `createdb` command will be issued through the shell to bootstrap the database.""" + """ + If no spatial database already exists, then using a cursor will not work. + Thus, a `createdb` command will be issued through the shell to bootstrap + creation of the spatial database. + """ # Getting the command-line options for the shell command options = get_cmd_options(False) @@ -80,7 +83,7 @@ def _create_with_shell(db_name, verbosity=1, autoclobber=False): raise Exception, 'Unknown error occurred in creating database: %s' % output def create_spatial_db(test=False, verbosity=1, autoclobber=False, interactive=False): - "This Python routine creates a spatial database based on settings.py." + "Creates a spatial database based on the settings." # Making sure we're using PostgreSQL and psycopg2 if settings.DATABASE_ENGINE != 'postgresql_psycopg2': @@ -119,7 +122,10 @@ def create_spatial_db(test=False, verbosity=1, autoclobber=False, interactive=Fa cursor = connection.cursor() def drop_db(db_name=False, test=False): - "Using the cursor, drops the given database. All exceptions will be propagated up." + """ + Drops the given database (defaults to what is returned from get_spatial_db(). + All exceptions are propagated up to the caller. + """ if not db_name: db_name = get_spatial_db(test=test) cursor = connection.cursor() cursor.execute("DROP DATABASE %s" % connection.ops.quote_name(db_name)) @@ -138,8 +144,10 @@ def get_cmd_options(db_name): return options def get_spatial_db(test=False): - """This routine returns the name of the spatial database. - Set the 'test' keyword for the test spatial database name.""" + """ + Returns the name of the spatial database. The 'test' keyword may be set + to return the test spatial database name. + """ if test: if settings.TEST_DATABASE_NAME: test_db_name = settings.TEST_DATABASE_NAME @@ -152,7 +160,10 @@ def get_spatial_db(test=False): return settings.DATABASE_NAME def load_postgis_sql(db_name, verbosity=1): - "This routine loads up the PostGIS SQL files lwpostgis.sql and spatial_ref_sys.sql." + """" + This routine loads up the PostGIS SQL files lwpostgis.sql and + spatial_ref_sys.sql. + """ # Getting the path to the PostGIS SQL try: @@ -160,7 +171,9 @@ def load_postgis_sql(db_name, verbosity=1): # PostGIS SQL files are located sql_path = settings.POSTGIS_SQL_PATH except AttributeError: - sql_path = '/usr/local/share' + status, sql_path = getstatusoutput('pg_config --sharedir') + if status != 0: + sql_path = '/usr/local/share' # The PostGIS SQL post-creation files. lwpostgis_file = os.path.join(sql_path, 'lwpostgis.sql') diff --git a/django/contrib/gis/db/models/query.py b/django/contrib/gis/db/models/query.py index b8d77da94f..5963d28560 100644 --- a/django/contrib/gis/db/models/query.py +++ b/django/contrib/gis/db/models/query.py @@ -17,8 +17,6 @@ class GeoQ(Q): class GeoQuerySet(QuerySet): "Geographical-enabled QuerySet object." - quote_name = connection.ops.quote_name - #### Overloaded QuerySet Routines #### def __init__(self, model=None): super(GeoQuerySet, self).__init__(model=model) @@ -47,6 +45,7 @@ class GeoQuerySet(QuerySet): return clone def _get_sql_clause(self): + qn = connection.ops.quote_name opts = self.model._meta # Construct the fundamental parts of the query: SELECT X FROM Y WHERE Z. @@ -81,10 +80,10 @@ class GeoQuerySet(QuerySet): # Add any additional SELECTs. if self._select: - select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), self.quote_name(s[0])) for s in self._select.items()]) + select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), qn(s[0])) for s in self._select.items()]) # Start composing the body of the SQL statement. - sql = [" FROM", self.quote_name(opts.db_table)] + sql = [" FROM", qn(opts.db_table)] # Compose the join dictionary into SQL describing the joins. if joins: @@ -107,7 +106,7 @@ class GeoQuerySet(QuerySet): ordering_to_use = opts.ordering for f in handle_legacy_orderlist(ordering_to_use): if f == '?': # Special case. - order_by.append(backend.get_random_function_sql()) + order_by.append(connection.ops.random_function_sql()) else: if f.startswith('-'): col_name = f[1:] @@ -117,21 +116,21 @@ class GeoQuerySet(QuerySet): order = "ASC" if "." in col_name: table_prefix, col_name = col_name.split('.', 1) - table_prefix = self.quote_name(table_prefix) + '.' + table_prefix = qn(table_prefix) + '.' else: # Use the database table as a column prefix if it wasn't given, # and if the requested column isn't a custom SELECT. if "." not in col_name and col_name not in (self._select or ()): - table_prefix = self.quote_name(opts.db_table) + '.' + table_prefix = qn(opts.db_table) + '.' else: table_prefix = '' - order_by.append('%s%s %s' % (table_prefix, self.quote_name(orderfield2column(col_name, opts)), order)) + order_by.append('%s%s %s' % (table_prefix, qn(orderfield2column(col_name, opts)), order)) if order_by: sql.append("ORDER BY " + ", ".join(order_by)) # LIMIT and OFFSET clauses if self._limit is not None: - sql.append("%s " % backend.get_limit_offset_sql(self._limit, self._offset)) + sql.append("%s " % connection.ops.limit_offset_sql(self._limit, self._offset)) else: assert self._offset is None, "'offset' is not allowed without 'limit'" @@ -144,8 +143,9 @@ class GeoQuerySet(QuerySet): #### Methods specific to the GeoQuerySet #### def _field_column(self, field): - return "%s.%s" % (self.quote_name(self.model._meta.db_table), - self.quote_name(field.column)) + qn = connection.ops.quote_name + return "%s.%s" % (qn(self.model._meta.db_table), + qn(field.column)) def kml(self, field_name, precision=8): """Returns KML representation of the given field name in a `kml` @@ -176,7 +176,7 @@ class GeoQuerySet(QuerySet): # override the geometry column returned from the database. self._custom_select[field.column] = \ '(ST_Transform(%s, %s)) AS %s' % (self._field_column(field), srid, - self.quote_name(field.column)) + connection.ops.quote_name(field.column)) return self._clone()