40 memcached_free(c->mc_st);
44 redisFree(c->redis_c);
49static memcached_st *create_memcached(
const char *conf,
50 int *expire_search,
int *expire_record)
54 memcached_st *mc = memcached_create(0);
56 memcached_return_t rc;
59 for (i = 0; mc && i < num; i++)
63 char *host = darray[i] + 9;
64 char *port = strchr(host,
':');
65 char *weight = strstr(host,
"/?");
73 rc = memcached_server_add(mc, host, port ? atoi(port) : 11211);
75 host, (
unsigned) rc, memcached_strerror(mc, rc));
76 if (rc != MEMCACHED_SUCCESS)
84 *expire_search = atoi(darray[i] + 9);
85 *expire_record = 600 + *expire_search;
100static redisContext *create_redis(
const char *conf,
101 int *expire_search,
int *expire_record)
106 redisContext *context = 0;
109 for (i = 0; i < num; i++)
113 struct timeval timeout = { 1, 500000 };
114 char *host = darray[i] + 9;
115 char *port = strchr(host,
':');
118 context = redisConnectWithTimeout(host,
119 port ? atoi(port) : 6379,
124 *expire_search = atoi(darray[i] + 9);
125 *expire_record = 600 + *expire_search;
139 redisFree(c->redis_c);
146 memcached_free(c->mc_st);
155 c->redis_c = create_redis(val,
157 if (c->redis_c == 0 || c->redis_c->err)
160 "could not create redis");
177 "could not create memcached");
180 memcached_behavior_set(c->mc_st, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
234 if (c->redis_c && resultset->
live_set == 0)
242 reply = redisCommandArgv(c->redis_c, 2, argv, 0);
244 if (reply && reply->type == REDIS_REPLY_STRING)
246 char *v = reply->str;
247 int v_len = reply->len;
249 size_t lead_len = strlen(v) + 1;
256 if (v_len > lead_len)
259 int oi_len = v_len - lead_len;
264 freeReplyObject(reply);
275 freeReplyObject(reply);
279 if (c->mc_st && resultset->
live_set == 0)
283 memcached_return_t rc;
286 &v_len, &flags, &rc);
291 size_t lead_len = strlen(v) + 1;
298 if (v_len > lead_len)
301 int oi_len = v_len - lead_len;
322static void expire_redis(redisContext *redis_c,
323 const char *buf,
size_t len,
int exp)
337 argvlen[2] = strlen(key_val);
338 reply = redisCommandArgv(redis_c, 3, argv, argvlen);
339 freeReplyObject(reply);
347 if (c->redis_c && resultset->
live_set == 0)
366 memcpy(key + strlen(str) + 1, oi_buf, oi_len);
377 argvlen[2] = strlen(str) + 1 + oi_len;
378 reply = redisCommandArgv(c->redis_c, 3, argv, argvlen);
379 freeReplyObject(reply);
381 expire_redis(c->redis_c,
389 if (c->mc_st && resultset->
live_set == 0)
392 memcached_return_t rc;
410 memcpy(key + strlen(str) + 1, oi_buf, oi_len);
412 rc = memcached_set(c->mc_st,
415 key, strlen(str) + 1 + oi_len,
417 yaz_log(
YLOG_LOG,
"Store hit count key=%s value=%s oi_len=%d rc=%u %s",
419 memcached_strerror(c->mc_st, rc));
427 const char *syntax,
const char *elementSetName,
449 syntax ? syntax :
"",
450 elementSetName ? elementSetName :
"",
451 schema ? schema :
"");
462 reply = redisCommandArgv(r->
connection->redis_c, 3, argv, argvlen);
465 freeReplyObject(reply);
467 expire_redis(r->
connection->redis_c, argv[1], argvlen[1],
473 argvlen[2] = rec_len;
475 reply = redisCommandArgv(r->
connection->redis_c, 3, argv, argvlen);
478 freeReplyObject(reply);
480 expire_redis(r->
connection->redis_c, argv[1], argvlen[1],
495 memcached_return_t rc;
505 syntax ? syntax :
"",
506 elementSetName ? elementSetName :
"",
507 schema ? schema :
"");
518 memcached_strerror(r->
connection->mc_st, rc));
527 memcached_strerror(r->
connection->mc_st, rc));
538 const char *elementSetName,
551 syntax ? syntax :
"",
552 elementSetName ? elementSetName :
"",
553 schema ? schema :
"");
560 reply1 = redisCommandArgv(r->
connection->redis_c, 2, argv, argvlen);
563 if (reply1 && reply1->type == REDIS_REPLY_STRING)
566 char *sha1_buf = reply1->str;
567 int sha1_len = reply1->len;
574 argvlen[1] = sha1_len;
576 reply2 = redisCommandArgv(r->
connection->redis_c, 2, argv, argvlen);
577 if (reply2 && reply2->type == REDIS_REPLY_STRING)
580 char *v_buf = reply2->str;
581 int v_len = reply2->len;
587 freeReplyObject(reply2);
588 freeReplyObject(reply1);
591 freeReplyObject(reply2);
593 freeReplyObject(reply1);
603 memcached_return_t rc;
607 syntax ? syntax :
"",
608 elementSetName ? elementSetName :
"",
609 schema ? schema :
"");
612 sha1_buf = memcached_get(r->
connection->mc_st,
614 &sha1_len, &flags, &rc);
623 v_buf = memcached_get(r->
connection->mc_st, sha1_buf, sha1_len,
624 &v_len, &flags, &rc);
Diagnostics: Generated by csvtodiag.tcl from ./bib1.csv.
Header for errno utilities.
void yaz_log(int level, const char *fmt,...)
Writes log message.
#define YLOG_WARN
log level: warning
#define YLOG_LOG
log level: log (regular)
int yaz_strncasecmp(const char *s1, const char *s2, size_t n)
ala strncasecmp - no locale
NMEM nmem_create(void)
returns new NMEM handle
void nmem_destroy(NMEM n)
destroys NMEM handle and memory associated with it
struct nmem_control * NMEM
NMEM handle (an opaque pointer to memory).
void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
splits string into sub strings delimited by blanks
char * odr_getbuf(ODR o, int *len, int *size)
ODR odr_createmem(int direction)
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
void * odr_malloc(ODR o, size_t size)
Odr_int odr_atoi(const char *s)
void yaz_snprintf(char *buf, size_t size, const char *fmt,...)
Header for config file reading utilities.
ZOOM_connection connection
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
const char * wrbuf_cstr(WRBUF b)
returns WRBUF content as C-string
WRBUF wrbuf_alloc(void)
construct WRBUF
void wrbuf_printf(WRBUF b, const char *fmt,...)
writes printf result to WRBUF
void wrbuf_puts(WRBUF b, const char *buf)
appends C-string to WRBUF
void wrbuf_write(WRBUF b, const char *buf, size_t size)
append constant size buffer to WRBUF
int wrbuf_sha1_puts(WRBUF b, const char *cp, int hexit)
writes SHA1 text to WRBUF
int wrbuf_sha1_write(WRBUF b, const char *cp, size_t sz, int hexit)
writes SHA1 text to WRBUF
Header for memory handling functions.
Header for common YAZ utilities.
#define Z_NamePlusRecord_databaseRecord
int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt, const char *name)
int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt, const char *name)
void ZOOM_set_error(ZOOM_connection c, int error, const char *addinfo)
ZOOM_Event ZOOM_Event_create(int kind)
void ZOOM_connection_put_event(ZOOM_connection c, ZOOM_Event event)
void ZOOM_memcached_destroy(ZOOM_connection c)
int ZOOM_memcached_configure(ZOOM_connection c)
Z_NamePlusRecord * ZOOM_memcached_lookup(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset, Z_OtherInformation *oi, const char *precision)
void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr, int pos, const char *syntax, const char *elementSetName, const char *schema, Z_SRW_diagnostic *diag)
static void wrbuf_vary_puts(WRBUF w, const char *v)
void ZOOM_memcached_resultset(ZOOM_resultset r, ZOOM_query q)
void ZOOM_memcached_init(ZOOM_connection c)
void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset)
Internal header for ZOOM implementation.
struct ZOOM_Event_p * ZOOM_Event
void ZOOM_handle_search_result(ZOOM_connection c, ZOOM_resultset resultset, Z_OtherInformation *o)
void ZOOM_handle_facet_result(ZOOM_connection c, ZOOM_resultset r, Z_OtherInformation *o)
void ZOOM_query_get_hash(ZOOM_query s, WRBUF w)
#define ZOOM_ERROR_MEMCACHED
ZOOM_resultset_option_get(ZOOM_resultset r, const char *key)
struct ZOOM_query_p * ZOOM_query
struct ZOOM_connection_p * ZOOM_connection
ZOOM_options_get(ZOOM_options opt, const char *name)
#define ZOOM_EVENT_RECV_SEARCH
struct ZOOM_resultset_p * ZOOM_resultset