Commit 551e0aa9 authored by D'Arcy J.M. Cain's avatar D'Arcy J.M. Cain

Fix parameter handling.

Fix a bug where cs.execute('select %d + %d', (1, 2)) would get interpreted
as cs.executemany('select %d + %d', (1, 2))
parent 37d67eb1
...@@ -60,6 +60,7 @@ import exceptions ...@@ -60,6 +60,7 @@ import exceptions
import types import types
import DateTime import DateTime
import time import time
import types
### module constants ### module constants
...@@ -175,9 +176,14 @@ class pgdbCursor: ...@@ -175,9 +176,14 @@ class pgdbCursor:
self.rowcount = -1 self.rowcount = -1
def execute(self, operation, params = None): def execute(self, operation, params = None):
if type(params) == types.TupleType or type(params) == types.ListType: # "The parameters may also be specified as list of
# tuples to e.g. insert multiple rows in a single
# operation, but this kind of usage is depreciated:
if params and type(params) == types.ListType and \
type(params[0]) == types.TupleType:
self.executemany(operation, params) self.executemany(operation, params)
else: else:
# not a list of tuples
self.executemany(operation, (params,)) self.executemany(operation, (params,))
def executemany(self, operation, param_seq): def executemany(self, operation, param_seq):
...@@ -190,7 +196,7 @@ class pgdbCursor: ...@@ -190,7 +196,7 @@ class pgdbCursor:
try: try:
for params in param_seq: for params in param_seq:
if params != None: if params != None:
sql = operation % params sql = _quoteparams(operation, params)
else: else:
sql = operation sql = operation
rows = self.__source.execute(sql) rows = self.__source.execute(sql)
...@@ -251,6 +257,34 @@ class pgdbCursor: ...@@ -251,6 +257,34 @@ class pgdbCursor:
def setoutputsize(self, size, col = 0): def setoutputsize(self, size, col = 0):
pass pass
def _quote(x):
if type(x) == types.StringType:
x = "'" + string.replace(
string.replace(str(x), '\\', '\\\\'), "'", "''") + "'"
elif type(x) in (types.IntType, types.LongType, types.FloatType):
pass
elif x is None:
x = 'NULL'
elif hasattr(x, '__pg_repr__'):
x = x.__pg_repr__()
else:
raise InterfaceError, 'do not know how to handle type %s' % type(x)
return x
def _quoteparams(s, params):
if hasattr(params, 'has_key'):
x = {}
for k, v in params.items():
x[k] = _quote(v)
params = x
else:
params = tuple(map(_quote, params))
return s % params
### connection object ### connection object
class pgdbCnx: class pgdbCnx:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment