1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
6 * \file zoom-memcached.c
7 * \brief Implements query/record caching using memcached
18 #include <yaz/yaz-util.h>
19 #include <yaz/xmalloc.h>
21 #include <yaz/diagbib1.h>
23 void ZOOM_memcached_init(ZOOM_connection c)
25 #if HAVE_LIBMEMCACHED_MEMCACHED_H
30 void ZOOM_memcached_destroy(ZOOM_connection c)
32 #if HAVE_LIBMEMCACHED_MEMCACHED_H
34 memcached_free(c->mc_st);
38 int ZOOM_memcached_configure(ZOOM_connection c)
41 #if HAVE_LIBMEMCACHED_MEMCACHED_H
44 memcached_free(c->mc_st);
48 val = ZOOM_options_get(c->options, "memcached");
51 #if HAVE_LIBMEMCACHED_MEMCACHED_H
52 c->mc_st = memcached(val, strlen(val));
55 ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, val);
59 ZOOM_set_error(c, ZOOM_ERROR_MEMCACHED, "not enabled");
66 void ZOOM_memcached_resultset(ZOOM_resultset r, ZOOM_query q)
68 #if HAVE_LIBMEMCACHED_MEMCACHED_H
69 ZOOM_connection c = r->connection;
70 r->mc_key = wrbuf_alloc();
71 wrbuf_puts(r->mc_key, "0;");
72 wrbuf_puts(r->mc_key, c->host_port);
73 wrbuf_puts(r->mc_key, ";");
75 wrbuf_puts(r->mc_key, c->user);
76 wrbuf_puts(r->mc_key, ";");
78 wrbuf_puts(r->mc_key, c->group);
79 wrbuf_puts(r->mc_key, ";");
81 wrbuf_sha1_puts(r->mc_key, c->password, 1);
82 wrbuf_puts(r->mc_key, ";");
84 WRBUF w = wrbuf_alloc();
85 ZOOM_query_get_hash(q, w);
86 wrbuf_sha1_puts(r->mc_key, wrbuf_cstr(w), 1);
89 wrbuf_puts(r->mc_key, ";");
91 wrbuf_puts(r->mc_key, r->req_facets);
95 void ZOOM_memcached_search(ZOOM_connection c, ZOOM_resultset resultset)
97 #if HAVE_LIBMEMCACHED_MEMCACHED_H
98 /* TODO: add sorting */
99 if (c->mc_st && resultset->live_set == 0)
103 memcached_return_t rc;
104 char *v = memcached_get(c->mc_st, wrbuf_buf(resultset->mc_key),
105 wrbuf_len(resultset->mc_key),
106 &v_len, &flags, &rc);
110 WRBUF w = wrbuf_alloc();
112 wrbuf_write(w, v, v_len);
114 resultset->size = odr_atoi(wrbuf_cstr(w));
116 yaz_log(YLOG_LOG, "For key %s got value %s",
117 wrbuf_cstr(resultset->mc_key), wrbuf_cstr(w));
120 event = ZOOM_Event_create(ZOOM_EVENT_RECV_SEARCH);
121 ZOOM_connection_put_event(c, event);
122 resultset->live_set = 1;
128 void ZOOM_memcached_hitcount(ZOOM_connection c, ZOOM_resultset resultset)
130 #if HAVE_LIBMEMCACHED_MEMCACHED_H
131 if (c->mc_st && resultset->live_set == 0)
134 memcached_return_t rc;
135 time_t expiration = 36000;
138 sprintf(str, ODR_INT_PRINTF, resultset->size);
139 rc = memcached_set(c->mc_st,
140 wrbuf_buf(resultset->mc_key),wrbuf_len(resultset->mc_key),
141 str, strlen(str), expiration, flags);
142 yaz_log(YLOG_LOG, "Store hit count key=%s value=%s rc=%u %s",
143 wrbuf_cstr(resultset->mc_key), str, (unsigned) rc,
144 memcached_last_error_message(c->mc_st));
149 void ZOOM_memcached_add(ZOOM_resultset r, Z_NamePlusRecord *npr,
151 const char *syntax, const char *elementSetName,
153 Z_SRW_diagnostic *diag)
155 #if HAVE_LIBMEMCACHED_MEMCACHED_H
156 if (r->connection->mc_st &&
157 !diag && npr->which == Z_NamePlusRecord_databaseRecord)
159 WRBUF k = wrbuf_alloc();
161 memcached_return_t rc;
162 time_t expiration = 36000;
163 ODR odr = odr_createmem(ODR_ENCODE);
167 z_NamePlusRecord(odr, &npr, 0, 0);
168 rec_buf = odr_getbuf(odr, &rec_len, 0);
170 wrbuf_write(k, wrbuf_buf(r->mc_key), wrbuf_len(r->mc_key));
171 wrbuf_printf(k, ";%d;%s;%s;%s", pos,
172 syntax ? syntax : "",
173 elementSetName ? elementSetName : "",
174 schema ? schema : "");
175 rc = memcached_set(r->connection->mc_st,
176 wrbuf_buf(k),wrbuf_len(k),
180 yaz_log(YLOG_LOG, "Store record lkey=%s len=%d rc=%u %s",
181 wrbuf_cstr(k), rec_len, (unsigned) rc,
182 memcached_last_error_message(r->connection->mc_st));
189 Z_NamePlusRecord *ZOOM_memcached_lookup(ZOOM_resultset r, int pos,
191 const char *elementSetName,
194 #if HAVE_LIBMEMCACHED_MEMCACHED_H
195 if (r->connection && r->connection->mc_st)
197 WRBUF k = wrbuf_alloc();
201 memcached_return_t rc;
203 wrbuf_write(k, wrbuf_buf(r->mc_key), wrbuf_len(r->mc_key));
204 wrbuf_printf(k, ";%d;%s;%s;%s", pos,
205 syntax ? syntax : "",
206 elementSetName ? elementSetName : "",
207 schema ? schema : "");
209 yaz_log(YLOG_LOG, "Lookup record %s", wrbuf_cstr(k));
210 v_buf = memcached_get(r->connection->mc_st, wrbuf_buf(k), wrbuf_len(k),
211 &v_len, &flags, &rc);
215 Z_NamePlusRecord *npr = 0;
217 odr_setbuf(r->odr, v_buf, v_len, 0);
218 z_NamePlusRecord(r->odr, &npr, 0, 0);
221 yaz_log(YLOG_LOG, "returned memcached copy");
232 * c-file-style: "Stroustrup"
233 * indent-tabs-mode: nil
235 * vim: shiftwidth=4 tabstop=8 expandtab