X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-memcached.c;h=4ee605b03c5086a142bcbf7c2404b8cf20663913;hp=fbdc886d85b6afe6e4cbeaf5516ebd3173af463d;hb=60f0955d87a511503ce48de0e99f697e112ff3d0;hpb=e2b8bf88befb43e4a189ce3e659c595e5b3af7dc diff --git a/src/zoom-memcached.c b/src/zoom-memcached.c index fbdc886..4ee605b 100644 --- a/src/zoom-memcached.c +++ b/src/zoom-memcached.c @@ -20,14 +20,6 @@ #include #include -#if HAVE_LIBMEMCACHED -#if LIBMEMCACHED_VERSION_HEX >= 0x01000000 -#define HAVE_MEMCACHED_FUNC 1 -#else -#define HAVE_MEMCACHED_FUNC 0 -#endif -#endif - void ZOOM_memcached_init(ZOOM_connection c) { #if HAVE_LIBMEMCACHED @@ -36,6 +28,8 @@ void ZOOM_memcached_init(ZOOM_connection c) #if HAVE_HIREDIS c->redis_c = 0; #endif + c->expire_search = 600; + c->expire_record = 1200; } void ZOOM_memcached_destroy(ZOOM_connection c) @@ -51,12 +45,9 @@ void ZOOM_memcached_destroy(ZOOM_connection c) } #if HAVE_LIBMEMCACHED -/* memcached wrapper.. Because memcached function do not exist in older libs */ -static memcached_st *yaz_memcached_wrap(const char *conf) +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); @@ -87,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 */ @@ -96,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; @@ -122,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; @@ -150,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, @@ -167,7 +169,7 @@ int ZOOM_memcached_configure(ZOOM_connection c) if (val && *val) { #if HAVE_LIBMEMCACHED - c->mc_st = yaz_memcached_wrap(val); + c->mc_st = create_memcached(val, &c->expire_search, &c->expire_record); if (!c->mc_st) { ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, @@ -183,7 +185,7 @@ int ZOOM_memcached_configure(ZOOM_connection c) return 0; } -#if HAVE_GCRYPT_H +#if HAVE_GCRYPT_H || HAVE_NETTLE static void wrbuf_vary_puts(WRBUF w, const char *v) { if (v) @@ -202,7 +204,7 @@ static void wrbuf_vary_puts(WRBUF w, const char *v) void ZOOM_memcached_resultset(ZOOM_resultset r, ZOOM_query q) { -#if HAVE_GCRYPT_H +#if HAVE_GCRYPT_H || HAVE_NETTLE ZOOM_connection c = r->connection; r->mc_key = wrbuf_alloc(); @@ -272,7 +274,8 @@ 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 @@ -318,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) { @@ -356,6 +381,10 @@ 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 @@ -364,7 +393,6 @@ void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset, { uint32_t flags = 0; memcached_return_t rc; - time_t expiration = 36000; char *str; ODR odr = odr_createmem(ODR_ENCODE); char *oi_buf = 0; @@ -387,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)); @@ -438,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; @@ -448,6 +480,9 @@ 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); @@ -461,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; @@ -480,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, @@ -489,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,