#include "bouncer.h"
+
+/*
+ * PostgreSQL type OIDs for result sets
+ */
+#define INT8OID 20
+#define INT4OID 23
+#define TEXTOID 25
+#define NUMERICOID 1700
+
+
void pktbuf_free(PktBuf *buf)
{
if (!buf || buf->fixed_buf)
* 'i' - int4
* 'q' - int8
* 's' - string
+ * 'N' - uint64_t to numeric
* 'T' - usec_t to date
*/
void pktbuf_write_RowDescription(PktBuf *buf, const char *tupdesc, ...)
} else if (tupdesc[i] == 'q') {
pktbuf_put_uint32(buf, INT8OID);
pktbuf_put_uint16(buf, 8);
+ } else if (tupdesc[i] == 'N') {
+ pktbuf_put_uint32(buf, NUMERICOID);
+ pktbuf_put_uint16(buf, -1);
} else if (tupdesc[i] == 'T') {
pktbuf_put_uint32(buf, TEXTOID);
pktbuf_put_uint16(buf, -1);
} else {
fatal("bad tupdesc");
}
- pktbuf_put_uint32(buf, 0);
+ pktbuf_put_uint32(buf, -1);
pktbuf_put_uint16(buf, 0);
}
va_end(ap);
* 'i' - int4
* 'q' - int8
* 's' - string
+ * 'N' - uint64_t to numeric
* 'T' - usec_t to date
*/
void pktbuf_write_DataRow(PktBuf *buf, const char *tupdesc, ...)
if (tupdesc[i] == 'i') {
snprintf(tmp, sizeof(tmp), "%d", va_arg(ap, int));
val = tmp;
- } else if (tupdesc[i] == 'q') {
+ } else if (tupdesc[i] == 'q' || tupdesc[i] == 'N') {
snprintf(tmp, sizeof(tmp), "%" PRIu64, va_arg(ap, uint64_t));
val = tmp;
} else if (tupdesc[i] == 's') {
{
PgStats avg;
calc_average(&avg, stat, old);
- pktbuf_write_DataRow(buf, "sqqqqqqqqqqqqqq", dbname,
+ pktbuf_write_DataRow(buf, "sNNNNNNNNNNNNNN", dbname,
stat->xact_count, stat->query_count,
stat->client_bytes, stat->server_bytes,
stat->xact_time, stat->query_time,
return true;
}
- pktbuf_write_RowDescription(buf, "sqqqqqqqqqqqqqq", "database",
+ pktbuf_write_RowDescription(buf, "sNNNNNNNNNNNNNN", "database",
"total_xact_count", "total_query_count",
"total_received", "total_sent",
"total_xact_time", "total_query_time",
{
PgStats avg;
calc_average(&avg, stat, old);
- pktbuf_write_DataRow(buf, "sqqqqqqq", dbname,
+ pktbuf_write_DataRow(buf, "sNNNNNNN", dbname,
stat->xact_count, stat->query_count,
stat->client_bytes, stat->server_bytes,
stat->xact_time, stat->query_time,
return true;
}
- pktbuf_write_RowDescription(buf, "sqqqqqqq", "database",
+ pktbuf_write_RowDescription(buf, "sNNNNNNN", "database",
"xact_count", "query_count",
"bytes_received", "bytes_sent",
"xact_time", "query_time",
{
PgStats avg;
calc_average(&avg, stat, old);
- pktbuf_write_DataRow(buf, "sqqqqqqq", dbname,
+ pktbuf_write_DataRow(buf, "sNNNNNNN", dbname,
avg.xact_count, avg.query_count,
avg.client_bytes, avg.server_bytes,
avg.xact_time, avg.query_time,
return true;
}
- pktbuf_write_RowDescription(buf, "sqqqqqqq", "database",
+ pktbuf_write_RowDescription(buf, "sNNNNNNN", "database",
"xact_count", "query_count",
"bytes_received", "bytes_sent",
"xact_time", "query_time",
calc_average(&avg, &st_total, &old_total);
- pktbuf_write_RowDescription(buf, "sq", "name", "value");
+ pktbuf_write_RowDescription(buf, "sN", "name", "value");
-#define WTOTAL(name) pktbuf_write_DataRow(buf, "sq", "total_" #name, st_total.name)
-#define WAVG(name) pktbuf_write_DataRow(buf, "sq", "avg_" #name, avg.name)
+#define WTOTAL(name) pktbuf_write_DataRow(buf, "sN", "total_" #name, st_total.name)
+#define WAVG(name) pktbuf_write_DataRow(buf, "sN", "avg_" #name, avg.name)
WTOTAL(xact_count);
WTOTAL(query_count);