Extend get_org_info (snippets) to return original string YAZ-836
[yaz-moved-to-github.git] / src / zoom-memcached.c
index def2ac9..332f5ab 100644 (file)
 #include <yaz/log.h>
 #include <yaz/diagbib1.h>
 
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
-#if HAVE_MEMCACHED_RETURN_T
-#else
-typedef memcached_return memcached_return_t;
-#endif
-#endif
-
 void ZOOM_memcached_init(ZOOM_connection c)
 {
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     c->mc_st = 0;
 #endif
 #if HAVE_HIREDIS
     c->redis_c = 0;
 #endif
+    c->expire_search = 600;
+    c->expire_record = 1200;
 }
 
 void ZOOM_memcached_destroy(ZOOM_connection c)
 {
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (c->mc_st)
         memcached_free(c->mc_st);
 #endif
@@ -49,13 +44,10 @@ void ZOOM_memcached_destroy(ZOOM_connection c)
 #endif
 }
 
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
-/* memcached wrapper.. Because memcached function do not exist in older libs */
-static memcached_st *yaz_memcached_wrap(const char *conf)
+#if HAVE_LIBMEMCACHED
+static memcached_st *create_memcached(const char *conf,
+                                      int *expire_search, int *expire_record)
 {
-#if HAVE_MEMCACHED_FUNC
-    return memcached(conf, strlen(conf));
-#else
     char **darray;
     int i, num;
     memcached_st *mc = memcached_create(0);
@@ -86,6 +78,11 @@ static memcached_st *yaz_memcached_wrap(const char *conf)
                 mc = 0;
             }
         }
+        else if (!yaz_strncasecmp(darray[i], "--EXPIRE=", 9))
+        {
+            *expire_search = atoi(darray[i] + 9);
+            *expire_record = 600 + *expire_search;
+        }
         else
         {
             /* bad directive */
@@ -95,12 +92,12 @@ static memcached_st *yaz_memcached_wrap(const char *conf)
     }
     nmem_destroy(nmem);
     return mc;
-#endif
 }
 #endif
 
 #if HAVE_HIREDIS
-static redisContext *create_redis(const char *conf)
+static redisContext *create_redis(const char *conf,
+                                  int *expire_search, int *expire_record)
 {
     char **darray;
     int i, num;
@@ -121,6 +118,11 @@ static redisContext *create_redis(const char *conf)
                                               port ? atoi(port) : 6379,
                                               timeout);
         }
+        else if (!yaz_strncasecmp(darray[i], "--EXPIRE=", 9))
+        {
+            *expire_search = atoi(darray[i] + 9);
+            *expire_record = 600 + *expire_search;
+        }
     }
     nmem_destroy(nmem);
     return context;
@@ -137,7 +139,7 @@ int ZOOM_memcached_configure(ZOOM_connection c)
         c->redis_c = 0;
     }
 #endif
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (c->mc_st)
     {
         memcached_free(c->mc_st);
@@ -149,7 +151,8 @@ int ZOOM_memcached_configure(ZOOM_connection c)
     if (val && *val)
     {
 #if HAVE_HIREDIS
-        c->redis_c = create_redis(val);
+        c->redis_c = create_redis(val,
+                                  &c->expire_search, &c->expire_record);
         if (c->redis_c == 0 || c->redis_c->err)
         {
             ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED,
@@ -165,8 +168,8 @@ int ZOOM_memcached_configure(ZOOM_connection c)
     val = ZOOM_options_get(c->options, "memcached");
     if (val && *val)
     {
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
-        c->mc_st = yaz_memcached_wrap(val);
+#if HAVE_LIBMEMCACHED
+        c->mc_st = create_memcached(val, &c->expire_search, &c->expire_record);
         if (!c->mc_st)
         {
             ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED,
@@ -271,10 +274,11 @@ void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset)
             ZOOM_connection_put_event(c, event);
             resultset->live_set = 1;
         }
-        freeReplyObject(reply);
+        if (reply)
+            freeReplyObject(reply);
     }
 #endif
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (c->mc_st && resultset->live_set == 0)
     {
         size_t v_len;
@@ -317,6 +321,28 @@ void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset)
 #endif
 }
 
+#if HAVE_HIREDIS
+static void expire_redis(redisContext *redis_c,
+                         const char *buf, size_t len, int exp)
+{
+    redisReply *reply;
+    const char *argv[3];
+    size_t argvlen[3];
+    char key_val[20];
+
+    sprintf(key_val, "%d", exp);
+
+    argv[0] = "EXPIRE";
+    argvlen[0] = 6;
+    argv[1] = buf;
+    argvlen[1] = len;
+    argv[2] = key_val;
+    argvlen[2] = strlen(key_val);
+    reply = redisCommandArgv(redis_c, 3, argv, argvlen);
+    freeReplyObject(reply);
+}
+#endif
+
 void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset,
                              Z_OtherInformation *oi, const char *precision)
 {
@@ -355,15 +381,18 @@ void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset,
             reply = redisCommandArgv(c->redis_c, 3, argv, argvlen);
             freeReplyObject(reply);
         }
+        expire_redis(c->redis_c,
+                     wrbuf_buf(resultset->mc_key),
+                     wrbuf_len(resultset->mc_key),
+                     c->expire_search);
         odr_destroy(odr);
     }
 #endif
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (c->mc_st && resultset->live_set == 0)
     {
         uint32_t flags = 0;
         memcached_return_t rc;
-        time_t expiration = 36000;
         char *str;
         ODR odr = odr_createmem(ODR_ENCODE);
         char *oi_buf = 0;
@@ -386,7 +415,8 @@ void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset,
         rc = memcached_set(c->mc_st,
                            wrbuf_buf(resultset->mc_key),
                            wrbuf_len(resultset->mc_key),
-                           key, strlen(str) + 1 + oi_len, expiration, flags);
+                           key, strlen(str) + 1 + oi_len,
+                           c->expire_search, flags);
         yaz_log(YLOG_LOG, "Store hit count key=%s value=%s oi_len=%d rc=%u %s",
                 wrbuf_cstr(resultset->mc_key), str, oi_len, (unsigned) rc,
                 memcached_strerror(c->mc_st, rc));
@@ -437,6 +467,9 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
                 wrbuf_cstr(k), wrbuf_cstr(rec_sha1));
         freeReplyObject(reply);
 
+        expire_redis(r->connection->redis_c, argv[1], argvlen[1],
+                     r->connection->expire_search);
+
         argv[1] = wrbuf_buf(rec_sha1);
         argvlen[1] = wrbuf_len(rec_sha1);
         argv[2] = rec_buf;
@@ -447,12 +480,15 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
                 wrbuf_cstr(rec_sha1), rec_len);
         freeReplyObject(reply);
 
+        expire_redis(r->connection->redis_c, argv[1], argvlen[1],
+                     r->connection->expire_record);
+
         odr_destroy(odr);
         wrbuf_destroy(k);
         wrbuf_destroy(rec_sha1);
     }
 #endif
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (r->connection->mc_st &&
         !diag && npr->which == Z_NamePlusRecord_databaseRecord)
     {
@@ -460,7 +496,6 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
         WRBUF rec_sha1 = wrbuf_alloc();
         uint32_t flags = 0;
         memcached_return_t rc;
-        time_t expiration = 36000;
         ODR odr = odr_createmem(ODR_ENCODE);
         char *rec_buf;
         int rec_len;
@@ -479,7 +514,7 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
         rc = memcached_set(r->connection->mc_st,
                            wrbuf_buf(k), wrbuf_len(k),
                            wrbuf_buf(rec_sha1), wrbuf_len(rec_sha1),
-                           expiration, flags);
+                           r->connection->expire_search, flags);
 
         yaz_log(YLOG_LOG, "Store record key=%s val=%s rc=%u %s",
                 wrbuf_cstr(k), wrbuf_cstr(rec_sha1), (unsigned) rc,
@@ -488,7 +523,7 @@ void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
         rc = memcached_add(r->connection->mc_st,
                            wrbuf_buf(rec_sha1), wrbuf_len(rec_sha1),
                            rec_buf, rec_len,
-                           expiration, flags);
+                           r->connection->expire_record, flags);
 
         yaz_log(YLOG_LOG, "Add record key=%s rec_len=%d rc=%u %s",
                 wrbuf_cstr(rec_sha1), rec_len, (unsigned) rc,
@@ -561,7 +596,7 @@ Z_NamePlusRecord *ZOOM_memcached_lookup(ZOOM_resultset r, int pos,
         freeReplyObject(reply1);
     }
 #endif
-#if HAVE_LIBMEMCACHED_MEMCACHED_H
+#if HAVE_LIBMEMCACHED
     if (r->connection && r->connection->mc_st)
     {
         WRBUF k = wrbuf_alloc();