From 2ae270ba873a8537c2a27263a6fbc54bedc189b6 Mon Sep 17 00:00:00 2001 From: "Stephen R. van den Berg" <srb@cuci.nl> Date: Fri, 18 May 2018 11:27:33 +0200 Subject: [PATCH] pgsql: Add optional communicationslog per filedescriptor for debugging. --- lib/modules/Sql.pmod/pgsql.h | 3 +++ lib/modules/Sql.pmod/pgsql_util.pmod | 37 +++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/modules/Sql.pmod/pgsql.h b/lib/modules/Sql.pmod/pgsql.h index 95f2b662d9..67d8301899 100644 --- a/lib/modules/Sql.pmod/pgsql.h +++ b/lib/modules/Sql.pmod/pgsql.h @@ -10,6 +10,9 @@ //#define PG_DEBUGRACE 1 //#define PG_STATS 1 // Collect extra usage statistics +#define PG_DEBUGHISTORY 0 // If >0, it is the number of records + // we keep history on the connection + // with the database #define PG_DEADLOCK_SENTINEL 0 // If >0, defines the number seconds // a lock can be held before the deadlock // report is being dumped to stderr diff --git a/lib/modules/Sql.pmod/pgsql_util.pmod b/lib/modules/Sql.pmod/pgsql_util.pmod index 361887e077..fdd19aa21c 100644 --- a/lib/modules/Sql.pmod/pgsql_util.pmod +++ b/lib/modules/Sql.pmod/pgsql_util.pmod @@ -345,6 +345,22 @@ class conxiin { final int procmsg; private int didreadcb; +#if PG_DEBUGHISTORY > 0 + final array history = ({}); + + final int(-1..) input_from(Stdio.Stream stm, void|int(0..) nbytes) { + int oldsize = sizeof(this); + int ret = i::input_from(stm, nbytes); + if (ret) { + Stdio.Buffer tb = Stdio.Buffer(this); + tb->consume(oldsize); + history += ({"<<"+tb->read(ret)}); + history = history[<PG_DEBUGHISTORY - 1 ..]; + } + return ret; + } +#endif + protected final bool range_error(int howmuch) { #ifdef PG_DEBUG if (howmuch < 0) { @@ -426,6 +442,18 @@ class conxion { final int queueinidx = -1; #endif +#if PG_DEBUGHISTORY > 0 + final int(-1..) output_to(Stdio.Stream stm, void|int(0..) nbytes) { + Stdio.Buffer tb = Stdio.Buffer(this); + int ret = o::output_to(stm, nbytes); + if (ret) { + i->history += ({">>" + tb->read(ret)}); + i->history = i->history[<PG_DEBUGHISTORY - 1 ..]; + } + return ret; + } +#endif + private inline void queueup(sql_result portal) { qportals->write(portal); portal->_synctransact = synctransact; PD("%d>%O %d %d Queue portal %d bytes\n", socket->query_fd(), @@ -769,10 +797,17 @@ class sql_result { catch(fd = c->socket->query_fd()); res = sprintf("sql_result state: %d numrows: %d eof: %d inflight: %d\n" "query: %O\n" +#if PG_DEBUGHISTORY > 0 + "history: %O\n" +#endif "fd: %O portalname: %O datarows: %d" " synctransact: %d laststatus: %s\n", _state, index, eoffound, inflight, - qalreadyprinted == this ? "..." : _query, fd, _portalname, + qalreadyprinted == this ? "..." : _query, +#if PG_DEBUGHISTORY > 0 + qalreadyprinted == this ? 0 : c && c->i->history, +#endif + fd, _portalname, datarowtypes && sizeof(datarowtypes), _synctransact, statuscmdcomplete || (_unnamedstatementkey ? "*parsing*" : "")); -- GitLab