diff -r 000000000000 -r 0d40e90630ef web/lib/django/contrib/gis/db/backend/util.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/db/backend/util.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,69 @@ +""" +A collection of utility routines and classes used by the spatial +backends. +""" + +def getstatusoutput(cmd): + """ + Executes a shell command on the platform using subprocess.Popen and + return a tuple of the status and stdout output. + """ + from subprocess import Popen, PIPE + # Set stdout and stderr to PIPE because we want to capture stdout and + # prevent stderr from displaying. + p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE) + # We use p.communicate() instead of p.wait() to avoid deadlocks if the + # output buffers exceed POSIX buffer size. + stdout, stderr = p.communicate() + return p.returncode, stdout.strip() + +def gqn(val): + """ + The geographic quote name function; used for quoting tables and + geometries (they use single rather than the double quotes of the + backend quotename function). + """ + if isinstance(val, basestring): + if isinstance(val, unicode): val = val.encode('ascii') + return "'%s'" % val + else: + return str(val) + +class SpatialOperation(object): + """ + Base class for generating spatial SQL. + """ + def __init__(self, function='', operator='', result='', beg_subst='', end_subst=''): + self.function = function + self.operator = operator + self.result = result + self.beg_subst = beg_subst + try: + # Try and put the operator and result into to the + # end substitution. + self.end_subst = end_subst % (operator, result) + except TypeError: + self.end_subst = end_subst + + @property + def sql_subst(self): + return ''.join([self.beg_subst, self.end_subst]) + + def as_sql(self, geo_col): + return self.sql_subst % self.params(geo_col) + + def params(self, geo_col): + return (geo_col, self.operator) + +class SpatialFunction(SpatialOperation): + """ + Base class for generating spatial SQL related to a function. + """ + def __init__(self, func, beg_subst='%s(%s, %%s', end_subst=')', result='', operator=''): + # Getting the function prefix. + kwargs = {'function' : func, 'operator' : operator, 'result' : result, + 'beg_subst' : beg_subst, 'end_subst' : end_subst,} + super(SpatialFunction, self).__init__(**kwargs) + + def params(self, geo_col): + return (self.function, geo_col)