fix(extra):object type error, change to only support string or str-able params
This commit is contained in:
@ -1142,7 +1142,7 @@ def register_composite(name, conn_or_curs, globally=False, factory=None):
|
|||||||
return caster
|
return caster
|
||||||
|
|
||||||
|
|
||||||
def _paginate(seq, page_size):
|
def _paginate(seq, page_size, to_byte=False):
|
||||||
"""Consume an iterable and return it in chunks.
|
"""Consume an iterable and return it in chunks.
|
||||||
|
|
||||||
Every chunk is at most `page_size`. Never return an empty chunk.
|
Every chunk is at most `page_size`. Never return an empty chunk.
|
||||||
@ -1152,7 +1152,16 @@ def _paginate(seq, page_size):
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
for i in range(page_size):
|
for i in range(page_size):
|
||||||
page.append(next(it))
|
if not to_byte:
|
||||||
|
page.append(next(it))
|
||||||
|
continue
|
||||||
|
vs = next(it)
|
||||||
|
if isinstance(vs, (list, tuple)):
|
||||||
|
# Ignore None object
|
||||||
|
# Serialized params to bytes
|
||||||
|
page.append(list(map(lambda v: v if v is None else str(v).encode('utf-8'), vs)))
|
||||||
|
else:
|
||||||
|
page.append(vs)
|
||||||
yield page
|
yield page
|
||||||
page = []
|
page = []
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
@ -1308,16 +1317,17 @@ def execute_prepared_batch(cur, prepared_statement_name, args_list, page_size=10
|
|||||||
r"""
|
r"""
|
||||||
[openGauss libpq only]
|
[openGauss libpq only]
|
||||||
|
|
||||||
Execute prepared statement with api `PQexecPreparedBatch` (new api in openGauss)
|
Execute prepared statement with api `PQexecPreparedBatch` (new api in openGauss's libpq.so)
|
||||||
|
|
||||||
Param:
|
Arguments:
|
||||||
argslist: 2d list, do nothing if empty
|
argslist: Two-dimensional list, if empty, return directly
|
||||||
|
Each parameter in the argument list must be a string or be string-able(should implements `__str__` magic method)
|
||||||
"""
|
"""
|
||||||
if len(args_list) == 0:
|
if len(args_list) == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
nparams = len(args_list[0])
|
nparams = len(args_list[0])
|
||||||
for page in _paginate(args_list, page_size=page_size):
|
for page in _paginate(args_list, page_size=page_size, to_byte=True):
|
||||||
cur.execute_prepared_batch(prepared_statement_name, nparams, len(page), page)
|
cur.execute_prepared_batch(prepared_statement_name, nparams, len(page), page)
|
||||||
|
|
||||||
|
|
||||||
@ -1325,14 +1335,15 @@ def execute_params_batch(cur, sql_format, args_list, page_size=100):
|
|||||||
r"""
|
r"""
|
||||||
[openGauss libpq only]
|
[openGauss libpq only]
|
||||||
|
|
||||||
Execute sql with api `PQexecParamsBatch` (new api in openGauss)
|
Execute sql with api `PQexecParamsBatch` (new api in openGauss's libpq.so)
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
argslist: 2d list, do nothing if empty
|
argslist: Two-dimensional list, if empty, return directly
|
||||||
|
Each parameter in the argument list must be a string or be string-able(should implements `__str__` magic method)
|
||||||
"""
|
"""
|
||||||
if len(args_list) == 0:
|
if len(args_list) == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
nparams = len(args_list[0])
|
nparams = len(args_list[0])
|
||||||
for page in _paginate(args_list, page_size=page_size):
|
for page in _paginate(args_list, page_size=page_size, to_byte=True):
|
||||||
cur.execute_params_batch(sql_format, nparams, len(page), page)
|
cur.execute_params_batch(sql_format, nparams, len(page), page)
|
||||||
|
|||||||
@ -628,7 +628,7 @@ curs_execute_prepared_batch(cursorObject *self, PyObject *args)
|
|||||||
int nParams = 0, nBatch = 0;
|
int nParams = 0, nBatch = 0;
|
||||||
PyObject *argsList = NULL;
|
PyObject *argsList = NULL;
|
||||||
|
|
||||||
Py_ssize_t rowIdx, colIdx, total;
|
int rowIdx, colIdx, total;
|
||||||
char **paramValues = NULL;
|
char **paramValues = NULL;
|
||||||
PGresult *res = NULL;
|
PGresult *res = NULL;
|
||||||
|
|
||||||
@ -642,7 +642,7 @@ curs_execute_prepared_batch(cursorObject *self, PyObject *args)
|
|||||||
}
|
}
|
||||||
Dprintf("execute_prepared_batch parsed statement_name: %s, nParams: %d, nBatch: %d",
|
Dprintf("execute_prepared_batch parsed statement_name: %s, nParams: %d, nBatch: %d",
|
||||||
stmtName, nParams, nBatch);
|
stmtName, nParams, nBatch);
|
||||||
total = nBatch*nParams;
|
total = nBatch * nParams;
|
||||||
|
|
||||||
EXC_IF_CURS_CLOSED(self);
|
EXC_IF_CURS_CLOSED(self);
|
||||||
EXC_IF_CURS_ASYNC(self, execute_prepared_batch);
|
EXC_IF_CURS_ASYNC(self, execute_prepared_batch);
|
||||||
@ -679,11 +679,12 @@ curs_execute_prepared_batch(cursorObject *self, PyObject *args)
|
|||||||
PyObject *argItem = PySequence_GetItem(rowArgs, colIdx);
|
PyObject *argItem = PySequence_GetItem(rowArgs, colIdx);
|
||||||
|
|
||||||
if (argItem == Py_None) {
|
if (argItem == Py_None) {
|
||||||
paramValues[rowIdx*nParams+colIdx] = "NULL";
|
paramValues[rowIdx * nParams + colIdx] = NULL;
|
||||||
} else {
|
} else {
|
||||||
PyObject *t = microprotocol_getquoted(argItem, self->conn);
|
if (!(argItem = psyco_ensure_bytes(argItem))) {
|
||||||
paramValues[rowIdx*nParams+colIdx] = strdup(Bytes_AsString(t));
|
goto exit;
|
||||||
Py_XDECREF(t);
|
}
|
||||||
|
paramValues[rowIdx * nParams + colIdx] = Bytes_AsString(argItem);
|
||||||
}
|
}
|
||||||
Py_XDECREF(argItem);
|
Py_XDECREF(argItem);
|
||||||
}
|
}
|
||||||
@ -715,7 +716,7 @@ curs_execute_params_batch(cursorObject *self, PyObject *args)
|
|||||||
int nParams = 0, nBatch = 0;
|
int nParams = 0, nBatch = 0;
|
||||||
PyObject *argsList = NULL;
|
PyObject *argsList = NULL;
|
||||||
|
|
||||||
Py_ssize_t rowIdx, colIdx, total;
|
int rowIdx, colIdx, total;
|
||||||
char **paramValues = NULL;
|
char **paramValues = NULL;
|
||||||
PGresult *res = NULL;
|
PGresult *res = NULL;
|
||||||
|
|
||||||
@ -729,7 +730,7 @@ curs_execute_params_batch(cursorObject *self, PyObject *args)
|
|||||||
Dprintf("execute_params_batch parsed sql: %s, nParams: %d, nBatch: %d",
|
Dprintf("execute_params_batch parsed sql: %s, nParams: %d, nBatch: %d",
|
||||||
sql, nParams, nBatch);
|
sql, nParams, nBatch);
|
||||||
|
|
||||||
total = nBatch*nParams;
|
total = nBatch * nParams;
|
||||||
|
|
||||||
EXC_IF_CURS_CLOSED(self);
|
EXC_IF_CURS_CLOSED(self);
|
||||||
EXC_IF_CURS_ASYNC(self, execute_params_batch);
|
EXC_IF_CURS_ASYNC(self, execute_params_batch);
|
||||||
@ -765,11 +766,12 @@ curs_execute_params_batch(cursorObject *self, PyObject *args)
|
|||||||
PyObject *argItem = PySequence_GetItem(rowArgs, colIdx);
|
PyObject *argItem = PySequence_GetItem(rowArgs, colIdx);
|
||||||
|
|
||||||
if (argItem == Py_None) {
|
if (argItem == Py_None) {
|
||||||
paramValues[rowIdx*nParams+colIdx] = "NULL";
|
paramValues[rowIdx * nParams + colIdx] = NULL;
|
||||||
} else {
|
} else {
|
||||||
PyObject *t = microprotocol_getquoted(argItem, self->conn);
|
if (!(argItem = psyco_ensure_bytes(argItem))) {
|
||||||
paramValues[rowIdx*nParams+colIdx] = strdup(Bytes_AsString(t));
|
goto exit;
|
||||||
Py_XDECREF(t);
|
}
|
||||||
|
paramValues[rowIdx * nParams + colIdx] = Bytes_AsString(argItem);
|
||||||
}
|
}
|
||||||
Py_XDECREF(argItem);
|
Py_XDECREF(argItem);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user