39 memcached_free(c->mc_st);
43 redisFree(c->redis_c);
48 static memcached_st *create_memcached(
const char *conf,
49 int *expire_search,
int *expire_record)
53 memcached_st *mc = memcached_create(0);
55 memcached_return_t rc;
58 for (i = 0; mc && i < num; i++)
62 char *host = darray[i] + 9;
63 char *port = strchr(host,
':');
64 char *weight = strstr(host,
"/?");
72 rc = memcached_server_add(mc, host, port ? atoi(port) : 11211);
74 host, (
unsigned) rc, memcached_strerror(mc, rc));
75 if (rc != MEMCACHED_SUCCESS)
83 *expire_search = atoi(darray[i] + 9);
84 *expire_record = 600 + *expire_search;
99 static redisContext *create_redis(
const char *conf,
100 int *expire_search,
int *expire_record)
105 redisContext *context = 0;
108 for (i = 0; i < num; i++)
112 struct timeval timeout = { 1, 500000 };
113 char *host = darray[i] + 9;
114 char *port = strchr(host,
':');
117 context = redisConnectWithTimeout(host,
118 port ? atoi(port) : 6379,
123 *expire_search = atoi(darray[i] + 9);
124 *expire_record = 600 + *expire_search;
138 redisFree(c->redis_c);
142 #if HAVE_LIBMEMCACHED
145 memcached_free(c->mc_st);
154 c->redis_c = create_redis(val,
156 if (c->redis_c == 0 || c->redis_c->err)
159 "could not create redis");
171 #if HAVE_LIBMEMCACHED
176 "could not create memcached");
179 memcached_behavior_set(c->mc_st, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1);
233 if (c->redis_c && resultset->
live_set == 0)
241 reply = redisCommandArgv(c->redis_c, 2, argv, 0);
243 if (reply && reply->type == REDIS_REPLY_STRING)
245 char *v = reply->str;
246 int v_len = reply->len;
248 size_t lead_len = strlen(v) + 1;
255 if (v_len > lead_len)
258 int oi_len = v_len - lead_len;
263 freeReplyObject(reply);
274 freeReplyObject(reply);
277 #if HAVE_LIBMEMCACHED
278 if (c->mc_st && resultset->
live_set == 0)
282 memcached_return_t rc;
285 &v_len, &flags, &rc);
290 size_t lead_len = strlen(v) + 1;
297 if (v_len > lead_len)
300 int oi_len = v_len - lead_len;
321 static void expire_redis(redisContext *redis_c,
322 const char *buf,
size_t len,
int exp)
329 sprintf(key_val,
"%d", exp);
336 argvlen[2] = strlen(key_val);
337 reply = redisCommandArgv(redis_c, 3, argv, argvlen);
338 freeReplyObject(reply);
346 if (c->redis_c && resultset->
live_set == 0)
365 memcpy(key + strlen(str) + 1, oi_buf, oi_len);
376 argvlen[2] = strlen(str) + 1 + oi_len;
377 reply = redisCommandArgv(c->redis_c, 3, argv, argvlen);
378 freeReplyObject(reply);
380 expire_redis(c->redis_c,
387 #if HAVE_LIBMEMCACHED
388 if (c->mc_st && resultset->
live_set == 0)
391 memcached_return_t rc;
409 memcpy(key + strlen(str) + 1, oi_buf, oi_len);
411 rc = memcached_set(c->mc_st,
414 key, strlen(str) + 1 + oi_len,
416 yaz_log(
YLOG_LOG,
"Store hit count key=%s value=%s oi_len=%d rc=%u %s",
418 memcached_strerror(c->mc_st, rc));
426 const char *syntax,
const char *elementSetName,
448 syntax ? syntax :
"",
449 elementSetName ? elementSetName :
"",
450 schema ? schema :
"");
461 reply = redisCommandArgv(r->
connection->redis_c, 3, argv, argvlen);
464 freeReplyObject(reply);
466 expire_redis(r->
connection->redis_c, argv[1], argvlen[1],
472 argvlen[2] = rec_len;
474 reply = redisCommandArgv(r->
connection->redis_c, 3, argv, argvlen);
477 freeReplyObject(reply);
479 expire_redis(r->
connection->redis_c, argv[1], argvlen[1],
487 #if HAVE_LIBMEMCACHED
494 memcached_return_t rc;
504 syntax ? syntax :
"",
505 elementSetName ? elementSetName :
"",
506 schema ? schema :
"");
517 memcached_strerror(r->
connection->mc_st, rc));
526 memcached_strerror(r->
connection->mc_st, rc));
537 const char *elementSetName,
550 syntax ? syntax :
"",
551 elementSetName ? elementSetName :
"",
552 schema ? schema :
"");
559 reply1 = redisCommandArgv(r->
connection->redis_c, 2, argv, argvlen);
562 if (reply1 && reply1->type == REDIS_REPLY_STRING)
565 char *sha1_buf = reply1->str;
566 int sha1_len = reply1->len;
573 argvlen[1] = sha1_len;
575 reply2 = redisCommandArgv(r->
connection->redis_c, 2, argv, argvlen);
576 if (reply2 && reply2->type == REDIS_REPLY_STRING)
579 char *v_buf = reply2->str;
580 int v_len = reply2->len;
586 freeReplyObject(reply2);
587 freeReplyObject(reply1);
590 freeReplyObject(reply2);
592 freeReplyObject(reply1);
595 #if HAVE_LIBMEMCACHED
602 memcached_return_t rc;
606 syntax ? syntax :
"",
607 elementSetName ? elementSetName :
"",
608 schema ? schema :
"");
611 sha1_buf = memcached_get(r->
connection->mc_st,
613 &sha1_len, &flags, &rc);
622 v_buf = memcached_get(r->
connection->mc_st, sha1_buf, sha1_len,
623 &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
void nmem_strsplit_blank(NMEM nmem, const char *dstr, char ***darray, int *num)
splits string into sub strings delimited by blanks
ODR odr_createmem(int direction)
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
char * odr_getbuf(ODR o, int *len, int *size)
Odr_int odr_atoi(const char *s)
void * odr_malloc(ODR o, size_t size)
ZOOM_connection connection
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
WRBUF wrbuf_alloc(void)
construct WRBUF
void wrbuf_printf(WRBUF b, const char *fmt,...)
writes printf result to WRBUF
const char * wrbuf_cstr(WRBUF b)
returns WRBUF content as C-string
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)
Z_NamePlusRecord * ZOOM_memcached_lookup(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
void ZOOM_memcached_destroy(ZOOM_connection c)
int ZOOM_memcached_configure(ZOOM_connection c)
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.
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)
ZOOM_options_get(ZOOM_options opt, const char *name)
#define ZOOM_EVENT_RECV_SEARCH