[srvx-commits] CVS: services/patches log-pgsql.diff,1.1,1.2
Brought to you by:
entrope
From: Entrope <en...@us...> - 2003-09-26 22:08:10
|
Update of /cvsroot/srvx/services/patches In directory sc8-pr-cvs1:/tmp/cvs-serv19482/patches Modified Files: log-pgsql.diff Log Message: update patch for current code buffer queries sent to postgresql, so locked tables (e.g. vacuum) don't cause a ping timeout Index: log-pgsql.diff =================================================================== RCS file: /cvsroot/srvx/services/patches/log-pgsql.diff,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** log-pgsql.diff 1 Sep 2003 15:06:06 -0000 1.1 --- log-pgsql.diff 26 Sep 2003 22:07:56 -0000 1.2 *************** *** 2,15 **** =================================================================== RCS file: /cvsroot/srvx/services/src/Makefile.am,v ! retrieving revision 1.57 ! diff -u -r1.57 Makefile.am ! --- src/Makefile.am 13 Sep 2002 14:11:08 -0000 1.57 ! +++ src/Makefile.am 11 Jul 2003 03:22:15 -0000 ! @@ -8,9 +8,8 @@ ! nickserv.help: nickserv.help.m4 expnhelp ./expnhelp < $(srcdir)/nickserv.help.m4 > $@ ! -srvx_LIBS = @RX_LIBS@ ! EXTRA_srvx_SOURCES = proto-bahamut.c proto-common.c proto-p10.c mod-snoop.c -srvx_LDADD = @MODULE_OBJS@ +srvx_LDADD = @MODULE_OBJS@ -lpq --- 2,13 ---- =================================================================== RCS file: /cvsroot/srvx/services/src/Makefile.am,v ! retrieving revision 1.59 ! diff -u -r1.59 Makefile.am ! --- src/Makefile.am 9 Sep 2003 01:56:55 -0000 1.59 ! +++ src/Makefile.am 26 Sep 2003 22:02:48 -0000 ! @@ -9,7 +9,7 @@ ./expnhelp < $(srcdir)/nickserv.help.m4 > $@ ! EXTRA_srvx_SOURCES = proto-bahamut.c proto-common.c proto-p10.c mod-snoop.c mod-memoserv.c -srvx_LDADD = @MODULE_OBJS@ +srvx_LDADD = @MODULE_OBJS@ -lpq *************** *** 20,36 **** =================================================================== RCS file: /cvsroot/srvx/services/src/log.c,v ! retrieving revision 1.58 ! diff -u -r1.58 log.c ! --- src/log.c 11 Jul 2003 03:16:07 -0000 1.58 ! +++ src/log.c 11 Jul 2003 03:22:17 -0000 ! @@ -22,6 +22,7 @@ #include "log.h" #include "helpfile.h" #include "nickserv.h" +#include <postgresql/libpq-fe.h> struct logDestination; ! @@ -974,6 +975,178 @@ ldIrc_module }; --- 18,35 ---- =================================================================== RCS file: /cvsroot/srvx/services/src/log.c,v ! retrieving revision 1.65 ! diff -u -r1.65 log.c ! --- src/log.c 22 Aug 2003 00:26:21 -0000 1.65 ! +++ src/log.c 26 Sep 2003 22:02:48 -0000 ! @@ -22,6 +22,8 @@ #include "log.h" #include "helpfile.h" #include "nickserv.h" + +#include "ioset.h" +#include <postgresql/libpq-fe.h> struct logDestination; ! @@ -992,6 +994,246 @@ ldIrc_module }; *************** *** 40,48 **** --- 39,104 ---- +struct logDest_pgsql { + struct logDestination base; + + struct string_list queue; + PGconn *conn; + + struct io_fd *fd; + int recurse_level; +}; +static struct logDest_vtable ldPgsql_vtbl; + + +static void ldPgsql_send_next_query(struct logDest_pgsql *ld) { + + int res; + + + + res = PQsendQuery(ld->conn, ld->queue.list[0]); + + if (!res) { + + ld->recurse_level++; + + log_module(MAIN_LOG, LOG_ERROR, "Error sending query \"%s\": %s", ld->queue.list[0], PQerrorMessage(ld->conn)); + + ld->recurse_level--; + + return; + + } + + res = PQflush(ld->conn); + + if (res == EOF) { + + ld->recurse_level++; + + log_module(MAIN_LOG, LOG_ERROR, "Error flushing PgSql output: %s", PQerrorMessage(ld->conn)); + + ld->recurse_level--; + + } + +} + + + +static void ldPgsql_readable(struct io_fd *fd) { + + struct logDest_pgsql *ld = fd->data; + + PGresult *pgres; + + unsigned int ii; + + int res; + + ExecStatusType st; + + + + res = PQconsumeInput(ld->conn); + + if (!res) { + + ld->recurse_level++; + + log_module(MAIN_LOG, LOG_ERROR, "Error consuming PgSql input: %s", PQerrorMessage(ld->conn)); + + ld->recurse_level--; + + } + + if (PQisBusy(ld->conn)) + + return; + + while ((pgres = PQgetResult(ld->conn))) { + + st = PQresultStatus(pgres); + + if (st != PGRES_COMMAND_OK) { + + ld->recurse_level++; + + log_module(MAIN_LOG, LOG_ERROR, "PgSql error in \"%s\": %s", ld->queue.list[0], PQresultErrorMessage(pgres)); + + ld->recurse_level--; + + } + + PQclear(pgres); + + } + + ld->recurse_level++; + + if (ld->queue.used == 1) + + ld->queue.list[1] = NULL; + + log_module(MAIN_LOG, LOG_DEBUG, "pgsql_readable finished %p, next is %p", ld->queue.list[0], ld->queue.list[1]); + + ld->recurse_level--; + + free(ld->queue.list[0]); + + ld->queue.used--; + + for (ii = 0; ii < ld->queue.used; ++ii) + + ld->queue.list[ii] = ld->queue.list[ii+1]; + + if (ld->queue.used) + + ldPgsql_send_next_query(ld); + +} + + +static struct logDestination * +ldPgsql_open(const char *args) { *************** *** 51,61 **** + ld->base.vtbl = &ldPgsql_vtbl; + ld->conn = PQconnectdb(args); ! + ld->recurse_level = 1; + if (!ld->conn) { + log_module(MAIN_LOG, LOG_ERROR, "Unable to allocate pgsql connection"); + } else if (PQstatus(ld->conn) == CONNECTION_BAD) { + log_module(MAIN_LOG, LOG_ERROR, "Pgsql connection failed: %s", PQerrorMessage(ld->conn)); + } ! + ld->recurse_level = 0; + return &ld->base; +} --- 107,128 ---- + ld->base.vtbl = &ldPgsql_vtbl; + ld->conn = PQconnectdb(args); ! + ld->recurse_level++; + if (!ld->conn) { + log_module(MAIN_LOG, LOG_ERROR, "Unable to allocate pgsql connection"); + } else if (PQstatus(ld->conn) == CONNECTION_BAD) { + log_module(MAIN_LOG, LOG_ERROR, "Pgsql connection failed: %s", PQerrorMessage(ld->conn)); + + } else { + + int res; + + res = PQsetnonblocking(ld->conn, 1); + + if (res == -1) + + log_module(MAIN_LOG, LOG_ERROR, "Unable to make pgsql non-blocking"); + + ld->fd = ioset_add(PQsocket(ld->conn)); + + ld->fd->data = ld; + + ld->fd->connected = 1; + + ld->fd->wants_reads = 1; + + ld->fd->readable_cb = ldPgsql_readable; + + while (PQflush(ld->conn)) ; + } ! + ld->recurse_level--; + return &ld->base; +} *************** *** 64,67 **** --- 131,137 ---- +ldPgsql_reopen(struct logDestination *self_) { + struct logDest_pgsql *self = (struct logDest_pgsql*)self_; + + self->recurse_level++; + + log_module(MAIN_LOG, LOG_DEBUG, "pgsql_reopen finished resetting connection with %d queued (head %p)", self->queue.used, self->queue.list[0]); + + self->recurse_level--; + PQreset(self->conn); +} *************** *** 70,74 **** --- 140,154 ---- +ldPgsql_close(struct logDestination *self_) { + struct logDest_pgsql *self = (struct logDest_pgsql*)self_; + + unsigned int ii; + + + PQfinish(self->conn); + + ioset_close(self->fd->fd, 0); + + self->recurse_level++; + + for (ii = 0; ii < self->queue.used; ++ii) { + + log_module(MAIN_LOG, LOG_DEBUG, "pgsql free()'ing leftover log %p", self->queue.list[ii]); + + free(self->queue.list[ii]); + + } + + self->recurse_level--; + + free(self->queue.list); + free(self); +} *************** *** 115,140 **** +static void +pgsql_insert(struct logDest_pgsql *self, char *query) { - + PGresult *res; - + ExecStatusType st; - + + self->recurse_level++; ! + res = PQexec(self->conn, query); ! + if (!res) { ! + log_module(MAIN_LOG, LOG_ERROR, "PgSql error in \"%s\": %s", query, PQerrorMessage(self->conn)); ! + self->recurse_level--; ! + free(query); ! + return; ! + } ! + st = PQresultStatus(res); ! + switch (st) { ! + case PGRES_COMMAND_OK: ! + break; ! + default: ! + log_module(MAIN_LOG, LOG_ERROR, "PgSql error in \"%s\": %s", query, PQresultErrorMessage(res)); ! + break; ! + } + self->recurse_level--; ! + PQclear(res); ! + free(query); +} + --- 195,204 ---- +static void +pgsql_insert(struct logDest_pgsql *self, char *query) { + self->recurse_level++; ! + log_module(MAIN_LOG, LOG_DEBUG, "pgsql_insert(%p, %p=\"%s\")", self, query, query); + self->recurse_level--; ! + string_list_append(&self->queue, query); ! + if (self->queue.used == 1) ! + ldPgsql_send_next_query(self); +} + *************** *** 144,148 **** + struct string_buffer query; + ! + if (self->recurse_level) return; + query.size = 512; + query.list = malloc(query.size); --- 208,213 ---- + struct string_buffer query; + ! + if (self->recurse_level) ! + return; + query.size = 512; + query.list = malloc(query.size); *************** *** 151,155 **** + string_buffer_append_quoted(&query, type->name); + string_buffer_append_printf(&query, "'), %d, srvx_bot_id('", entry->slvl); ! + string_buffer_append_quoted(&query, type->bot->nick); + string_buffer_append_string(&query, "'), '"); + string_buffer_append_time(&query, entry->time); --- 216,220 ---- + string_buffer_append_quoted(&query, type->name); + string_buffer_append_printf(&query, "'), %d, srvx_bot_id('", entry->slvl); ! + string_buffer_append_quoted(&query, entry->bot->nick); + string_buffer_append_string(&query, "'), '"); + string_buffer_append_time(&query, entry->time); *************** *** 169,173 **** + struct string_buffer query; + ! + if (self->recurse_level) return; + query.size = 512; + query.list = malloc(query.size); --- 234,239 ---- + struct string_buffer query; + ! + if (self->recurse_level) ! + return; + query.size = 512; + query.list = malloc(query.size); *************** *** 186,190 **** + struct string_buffer query; + ! + if (self->recurse_level) return; + query.size = 512; + query.list = malloc(query.size); --- 252,257 ---- + struct string_buffer query; + ! + if (self->recurse_level) ! + return; + query.size = 512; + query.list = malloc(query.size); *************** *** 211,215 **** log_init(void) { ! @@ -985,6 +1158,7 @@ dict_insert(log_dest_types, ldFile_vtbl.type_name, &ldFile_vtbl); dict_insert(log_dest_types, ldStd_vtbl.type_name, &ldStd_vtbl); --- 278,282 ---- log_init(void) { ! @@ -1003,6 +1245,7 @@ dict_insert(log_dest_types, ldFile_vtbl.type_name, &ldFile_vtbl); dict_insert(log_dest_types, ldStd_vtbl.type_name, &ldStd_vtbl); *************** *** 217,220 **** + dict_insert(log_dest_types, ldPgsql_vtbl.type_name, &ldPgsql_vtbl); conf_register_reload(log_conf_read); ! log_default = log_register_type("*", NULL, NULL); reg_exit_func(cleanup_logs); --- 284,287 ---- + dict_insert(log_dest_types, ldPgsql_vtbl.type_name, &ldPgsql_vtbl); conf_register_reload(log_conf_read); ! log_default = log_register_type("*", NULL); reg_exit_func(cleanup_logs); |