pgsocket: handle connection lifetime
authorMarko Kreen <markokr@gmail.com>
Wed, 3 Nov 2010 15:48:26 +0000 (17:48 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 3 Nov 2010 15:48:26 +0000 (17:48 +0200)
usual/pgsocket.c
usual/pgsocket.h

index dc423c21abb2d167b7f361e8cbde8e5778f187f3..414217b0ca80386e584352834f65019404a60967 100644 (file)
@@ -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;
 
index 77da14359bcf5d1f2f104b4d197d00376941c37f..d8782982fdcedbe5e0858e0de8c5c4f22fb34a02 100644 (file)
@@ -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);