2009-03-31 01:15:49 +08:00
|
|
|
"""
|
|
|
|
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()
|
2008-08-06 02:13:06 +08:00
|
|
|
|
|
|
|
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):
|
2009-03-31 01:15:49 +08:00
|
|
|
if isinstance(val, unicode): val = val.encode('ascii')
|
2008-08-06 02:13:06 +08:00
|
|
|
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)
|