pgsocket: allow to detect whether waiting for send or receive
authorMarko Kreen <markokr@gmail.com>
Wed, 3 Mar 2010 12:07:08 +0000 (14:07 +0200)
committerMarko Kreen <markokr@gmail.com>
Wed, 3 Mar 2010 12:07:08 +0000 (14:07 +0200)
usual/pgsocket.c
usual/pgsocket.h

index d5d1c2e512cdf697fa1e87f16854cf7341ec9af5..fe4da032149a9d9d2ebf06edde937cf9db1ef857 100644 (file)
@@ -43,6 +43,8 @@ struct PgSocket {
        /* track wait state */
        enum WType wait_type;
 
+       uint8_t wait_event; // EV_READ / EV_WRITE
+
        /* should connect after sleep */
        bool reconnect;
 
@@ -81,6 +83,7 @@ static void wait_event(struct PgSocket *db, short ev, libev_cb fn)
                fatal_perror("event_add");
 
        db->wait_type = W_SOCK;
+       db->wait_event = ev;
 }
 
 /* wait timeout from libevent */
@@ -361,3 +364,12 @@ PGconn *pgs_get_connection(struct PgSocket *db)
        return db->con;
 }
 
+bool pgs_waiting_for_reply(struct PgSocket *db)
+{
+       if (!db->con)
+               return false;
+       if (PQstatus(db->con) != CONNECTION_OK)
+               return false;
+       return (db->wait_type == W_SOCK) && (db->wait_event == EV_READ);
+}
+
index b2de947e4309bc091b4157eb70ad986244a88d0a..5d0276e822d472a8c244aca70d14c4c811489067 100644 (file)
@@ -55,5 +55,7 @@ int pgs_connection_valid(struct PgSocket *db);
 
 PGconn *pgs_get_connection(struct PgSocket *db);
 
+bool pgs_waiting_for_reply(struct PgSocket *db);
+
 #endif