From f302d46bd2cb10ca97749c204bcc64d6fb78ef50 Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Wed, 3 Nov 2010 17:48:26 +0200 Subject: [PATCH] pgsocket: handle connection lifetime --- usual/pgsocket.c | 17 +++++++++++++++++ usual/pgsocket.h | 3 +++ 2 files changed, 20 insertions(+) diff --git a/usual/pgsocket.c b/usual/pgsocket.c index dc423c2..414217b 100644 --- a/usual/pgsocket.c +++ b/usual/pgsocket.c @@ -63,6 +63,9 @@ struct PgSocket { /* temp place for resultset */ PGresult *last_result; + + usec_t connect_time; + usec_t lifetime; }; /* report event to user callback */ @@ -197,6 +200,7 @@ static void connect_cb(int sock, short flags, void *arg) wait_event(db, EV_READ, connect_cb); break; case PGRES_POLLING_OK: + db->connect_time = get_time_usec(); send_event(db, PGS_CONNECT_OK); break; default: @@ -250,6 +254,11 @@ void pgs_set_event_base(struct PgSocket *pgs, struct event_base *base) pgs->base = base; } +void pgs_set_lifetime(struct PgSocket *pgs, double lifetime) +{ + pgs->lifetime = USEC * lifetime; +} + void pgs_connect(struct PgSocket *db) { if (db->con) @@ -304,6 +313,14 @@ void pgs_sleep(struct PgSocket *db, double timeout) Assert(!db->wait_type); + if (db->con && db->lifetime) { + usec_t now = get_time_usec(); + if (db->connect_time + db->lifetime < now) { + pgs_disconnect(db); + db->reconnect = true; + } + } + tv.tv_sec = timeout; tv.tv_usec = (timeout - tv.tv_sec) * USEC; diff --git a/usual/pgsocket.h b/usual/pgsocket.h index 77da143..d878298 100644 --- a/usual/pgsocket.h +++ b/usual/pgsocket.h @@ -63,6 +63,9 @@ void pgs_free(struct PgSocket *db); /** Change the event base for PgSocket */ void pgs_set_event_base(struct PgSocket *pgs, struct event_base *base); +/** Set connection lifetime (in seconds) */ +void pgs_set_lifetime(struct PgSocket *pgs, double lifetime); + /** Launch connection */ void pgs_connect(struct PgSocket *db); -- 2.39.5