Skip to content
Snippets Groups Projects
Commit b901be16 authored by Stephen R. van den Berg's avatar Stephen R. van den Berg
Browse files

pgsql: Improve _sprintf() formatting.

parent 9c553a6c
No related branches found
No related tags found
No related merge requests found
......@@ -1052,10 +1052,11 @@ private void startquery(int forcetext, .pgsql_util.sql_result portal, string q,
q = .sql_util.emulate_bindings(q, bindings, this),
paramValues = .pgsql_util.emptyarray;
else {
int pi = 0, rep = 0;
int pi = 0;
paramValues = allocate(sizeof(bindings));
from = allocate(sizeof(bindings));
array(string) to = allocate(sizeof(bindings));
array(string) litfrom, litto, to = allocate(sizeof(bindings));
litfrom = litto = .pgsql_util.emptyarray;
foreach (bindings; mixed name; mixed value) {
if (stringp(name)) { // Throws if mapping key is empty string
if (name[0] != ':')
......@@ -1077,19 +1078,23 @@ private void startquery(int forcetext, .pgsql_util.sql_result portal, string q,
if (!has_value(q, name))
continue;
}
from[rep] = name;
string rval;
if (multisetp(value)) // multisets are taken literally
rval = indices(value)*","; // and bypass the encoding logic
else {
paramValues[pi++] = value;
rval = sprintf("$%d", pi);
if (multisetp(value)) { // multisets are taken literally
litto += ({indices(value)*","}); // and bypass the encoding logic
litfrom += ({name});
} else {
paramValues[pi] = value;
to[pi] = sprintf("$%d", pi + 1);
from[pi++] = name;
}
to[rep++] = rval;
}
if(rep--)
q = replace(q, from = from[..rep], to = to[..rep]);
paramValues = pi ? paramValues[..pi-1] : .pgsql_util.emptyarray;
if (pi--) {
paramValues = paramValues[.. pi];
q = replace(q, litfrom += from = from[.. pi], litto += to = to[.. pi]);
} else {
paramValues = .pgsql_util.emptyarray;
if (sizeof(litfrom))
q = replace(q, litfrom, litto);
}
from = ({from, to, paramValues});
}
} else
......
......@@ -802,25 +802,28 @@ class sql_result {
int fd = -1;
if (c && c->socket)
catch(fd = c->socket->query_fd());
res = sprintf("sql_result state: %d numrows: %d eof: %d inflight: %d\n"
"query: %O\n"
res = sprintf(
"sql_result state: %d numrows: %d eof: %d inflight: %d\n"
"fd: %O portalname: %O coltypes: %d"
" synctransact: %d laststatus: %s\n"
"stash: %O\n"
#if PG_DEBUGHISTORY > 0
"history: %O\n"
"stash: %O\n"
#endif
"fd: %O portalname: %O datarows: %d"
" synctransact: %d laststatus: %s\n",
_state, index, eoffound, inflight,
qalreadyprinted == this ? "..." : _query,
"history: %O\n"
#endif
"query: %O\n%s\n",
_state, index, eoffound, inflight,
fd, _portalname,
datarowtypes && sizeof(datarowtypes), _synctransact,
statuscmdcomplete
|| (_unnamedstatementkey ? "*parsing*" : ""),
qalreadyprinted == this ? 0
: c && (string)c->stash,
#if PG_DEBUGHISTORY > 0
qalreadyprinted == this ? 0 : c && c->i->history,
qalreadyprinted == this ? 0
: c && (string)c->stash,
#endif
fd, _portalname,
datarowtypes && sizeof(datarowtypes), _synctransact,
statuscmdcomplete
|| (_unnamedstatementkey ? "*parsing*" : ""));
qalreadyprinted == this ? 0 : c && c->i->history,
#endif
qalreadyprinted == this
? "..." : replace(_query, "xxxx\n", "\\n"),
qalreadyprinted == this ? "..." : _showbindings()*"\n");
qalreadyprinted = this;
break;
}
......@@ -852,6 +855,21 @@ class sql_result {
transtype = _transtype;
}
final array(string) _showbindings() {
array(string) msgs = emptyarray;
if (_params) {
array from, to, paramValues;
[from, to, paramValues] = _params;
if (sizeof(paramValues)) {
int i;
string val, fmt = sprintf("%%%ds %%3s %%.61s", max(@map(from, sizeof)));
foreach (paramValues; i; val)
msgs += ({sprintf(fmt, from[i], to[i], sprintf("%O", val))});
}
}
return msgs;
}
//! Returns the command-complete status for this query.
//!
//! @note
......@@ -1110,7 +1128,7 @@ class sql_result {
}
final void _preparebind(array dtoid) {
array(string|int) paramValues =_params ? _params[2] : emptyarray;
array(string|int) paramValues = _params ? _params[2] : emptyarray;
if (sizeof(dtoid) != sizeof(paramValues))
SUSERERROR("Invalid number of bindings, expected %d, got %d\n",
sizeof(dtoid), sizeof(paramValues));
......@@ -1853,20 +1871,7 @@ class proxy {
}
private array(string) showbindings(sql_result portal) {
array(string) msgs = emptyarray;
array from;
if (portal && (from = portal._params)) {
array to, paramValues;
[from, to, paramValues] = from;
if (sizeof(paramValues)) {
string val;
int i;
string fmt = sprintf("%%%ds %%3s %%.61s", max(@map(from, sizeof)));
foreach (paramValues; i; val)
msgs += ({sprintf(fmt, from[i], to[i], sprintf("%O", val))});
}
}
return msgs;
return portal ? portal._showbindings() : emptyarray;
}
private void preplastmessage(mapping(string:string) msgresponse) {
......@@ -1915,8 +1920,8 @@ class proxy {
mixed err;
int terminating = 0;
err = catch {
conxion ci = c; // cache value FIXME sensible?
conxiin cr = ci->i; // cache value FIXME sensible?
conxion ci = c; // cache value
conxiin cr = ci->i; // cache value
#ifdef PG_DEBUG
PD("Processloop\n");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment