Merge with master
[pazpar2-moved-to-github.git] / src / connection.c
index 93b9020..15bfc56 100644 (file)
@@ -103,28 +103,16 @@ struct connection {
 
 static int connection_connect(struct connection *con, iochan_man_t iochan_man);
 
-static int connection_is_idle(struct connection *co)
-{
-    ZOOM_connection link = co->link;
-    int event;
-
-    if (co->state != Conn_Open || !link)
-        return 0;
-
-    if (!ZOOM_connection_is_idle(link))
-        return 0;
-    event = ZOOM_connection_peek_event(link);
-    if (event == ZOOM_EVENT_NONE)
-        return 1;
-    else
-        return 0;
-}
-
 ZOOM_connection connection_get_link(struct connection *co)
 {
     return co->link;
 }
 
+void connection_mark_dead(struct connection *co)
+{ 
+    iochan_settimeout(co->iochan, 1);
+}
+
 // Close connection and recycle structure
 static void connection_destroy(struct connection *co)
 {
@@ -259,6 +247,19 @@ static void non_block_events(struct connection *co)
     }
 }
 
+static void iochan_update(struct connection *co)
+{
+    if (co->link)
+    {
+        int m = ZOOM_connection_get_mask(co->link);
+
+        if (m == 0)
+            m = ZOOM_SELECT_READ;
+        iochan_setflags(co->iochan, m);
+        iochan_setfd(co->iochan, ZOOM_connection_get_socket(co->link));
+    }
+}
+
 void connection_continue(struct connection *co)
 {
     int r = ZOOM_connection_exec_task(co->link);
@@ -271,10 +272,7 @@ void connection_continue(struct connection *co)
         client_unlock(cl);
     }
     else
-    {
-        iochan_setflags(co->iochan, ZOOM_connection_get_mask(co->link));
-        iochan_setfd(co->iochan, ZOOM_connection_get_socket(co->link));
-    }
+        iochan_update(co);
 }
 
 static void connection_handler(IOCHAN iochan, int event)
@@ -302,6 +300,11 @@ static void connection_handler(IOCHAN iochan, int event)
     }
     else
     {
+        if (ZOOM_connection_is_idle(co->link))
+        {
+            connection_destroy(co);
+            return;
+        }
         client_lock(cl);
         non_block_events(co);
 
@@ -310,26 +313,10 @@ static void connection_handler(IOCHAN iochan, int event)
         non_block_events(co);
         client_unlock(cl);
 
-        if (co->link)
-        {
-            iochan_setflags(iochan, ZOOM_connection_get_mask(co->link));
-            iochan_setfd(iochan, ZOOM_connection_get_socket(co->link));
-        }
+        iochan_update(co);
     }
 }
 
-
-// Disassociate connection from client
-static void connection_release(struct connection *co)
-{
-    struct client *cl = co->client;
-
-    if (!cl)
-        return;
-    client_set_connection(cl, 0);
-    co->client = 0;
-}
-
 static int connection_connect(struct connection *con, iochan_man_t iochan_man)
 {
     ZOOM_options zoptions = ZOOM_options_create();
@@ -343,6 +330,7 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
     struct session_database *sdb = client_get_database(con->client);
     const char *apdulog = session_setting_oneval(sdb, PZ_APDULOG);
     const char *memcached = session_setting_oneval(sdb, PZ_MEMCACHED);
+    const char *redis = session_setting_oneval(sdb, PZ_REDIS);
 
     assert(con);
 
@@ -354,6 +342,8 @@ static int connection_connect(struct connection *con, iochan_man_t iochan_man)
         ZOOM_options_set(zoptions, "charset", charset);
     if (memcached && *memcached)
         ZOOM_options_set(zoptions, "memcached", memcached);
+    if (redis && *redis)
+        ZOOM_options_set(zoptions, "redis", redis);
 
     if (con->zproxy)
     {