YAZ 5.38.1
zoom-record-cache.c
Go to the documentation of this file.
1/* This file is part of the YAZ toolkit.
2 * Copyright (C) Index Data
3 * See the file LICENSE for details.
4 */
9#if HAVE_CONFIG_H
10#include <config.h>
11#endif
12
13#include <assert.h>
14#include <string.h>
15#include <errno.h>
16#include "zoom-p.h"
17
18#include <yaz/diagbib1.h>
19#include <yaz/record_render.h>
20#include <yaz/shptr.h>
21
22#if SHPTR
24#endif
25
28#if SHPTR
29 struct WRBUF_shptr *record_wrbuf;
30#else
32#endif
33
35 const char *schema;
36
37 const char *diag_uri;
38 const char *diag_message;
39 const char *diag_details;
40 const char *diag_set;
41};
42
51
52static size_t record_hash(int pos)
53{
54 if (pos < 0)
55 pos = 0;
56 return pos % RECORD_HASH_SIZE;
57}
58
61 int pos,
62 const char *syntax,
63 const char *elementSetName,
64 const char *schema,
65 Z_SRW_diagnostic *diag)
66{
67 ZOOM_record_cache rc = 0;
68
71
72 for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
73 {
74 if (pos == rc->pos
75 && yaz_strcmp_null(schema, rc->schema) == 0
76 && yaz_strcmp_null(elementSetName,rc->elementSetName) == 0
77 && yaz_strcmp_null(syntax, rc->syntax) == 0)
78 break;
79 }
80 if (!rc)
81 {
82 rc = (ZOOM_record_cache) odr_malloc(r->odr, sizeof(*rc));
83 rc->rec.odr = 0;
84#if SHPTR
85 YAZ_SHPTR_INC(r->record_wrbuf);
86 rc->rec.record_wrbuf = r->record_wrbuf;
87#else
88 rc->rec.wrbuf = 0;
89#endif
90 rc->elementSetName = odr_strdup_null(r->odr, elementSetName);
91
92 rc->syntax = odr_strdup_null(r->odr, syntax);
93
95
96 rc->pos = pos;
97 rc->next = r->record_hash[record_hash(pos)];
98 r->record_hash[record_hash(pos)] = rc;
99
100 }
101
102 rc->rec.npr = npr;
104 rc->rec.diag_set = 0;
105 rc->rec.diag_uri = 0;
106 rc->rec.diag_message = 0;
107 rc->rec.diag_details = 0;
108 if (diag)
109 {
110 if (diag->uri)
111 {
112 const char *cp = strrchr(diag->uri, '/');
113 if (cp)
114 rc->rec.diag_set = odr_strdupn(r->odr, diag->uri, cp - diag->uri);
115 else
116 rc->rec.diag_set = odr_strdup(r->odr, diag->uri);
117 rc->rec.diag_uri = odr_strdup(r->odr, diag->uri);
118 }
119 rc->rec.diag_message = odr_strdup_null(r->odr, diag->message);
120 rc->rec.diag_details = odr_strdup_null(r->odr, diag->details);
121 }
122 return &rc->rec;
123}
124
126 int pos,
127 const char *syntax, const char *elementSetName,
128 const char *schema,
129 Z_SRW_diagnostic *diag)
130{
131 record_cache_add(r, npr, pos, syntax, elementSetName, schema, diag);
132 ZOOM_memcached_add(r, npr, pos, syntax, elementSetName, schema, diag);
133}
134
136 const char *syntax,
137 const char *elementSetName,
138 const char *schema)
139{
141
142 for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
143 {
144 if (pos == rc->pos)
145 {
146 if (yaz_strcmp_null(schema, rc->schema))
147 continue;
148 if (yaz_strcmp_null(elementSetName,rc->elementSetName))
149 continue;
150 if (yaz_strcmp_null(syntax, rc->syntax))
151 continue;
152 return &rc->rec;
153 }
154 }
155 return 0;
156}
157
159 const char *syntax,
160 const char *elementSetName,
161 const char *schema)
162{
164 ZOOM_record rec = ZOOM_record_cache_lookup_i(r, pos, syntax,
165 elementSetName, schema);
166 if (rec)
167 {
170 return rec;
171 }
172 npr = ZOOM_memcached_lookup(r, pos, syntax, elementSetName, schema);
173 if (npr)
174 return record_cache_add(r, npr, pos, syntax, elementSetName,
175 schema, 0);
176 return 0;
177}
178
181{
182 char *buf;
183 int size;
184 ODR odr_enc;
185 ZOOM_record nrec;
186
187 odr_enc = odr_createmem(ODR_ENCODE);
188 if (!z_NamePlusRecord(odr_enc, &srec->npr, 0, 0))
189 return 0;
190 buf = odr_getbuf(odr_enc, &size, 0);
191
192 nrec = (ZOOM_record) xmalloc(sizeof(*nrec));
194#if SHPTR
195 nrec->record_wrbuf = 0;
196#else
197 nrec->wrbuf = 0;
198#endif
199 odr_setbuf(nrec->odr, buf, size, 0);
200 z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0);
201
202 nrec->schema = odr_strdup_null(nrec->odr, srec->schema);
203 nrec->diag_uri = odr_strdup_null(nrec->odr, srec->diag_uri);
204 nrec->diag_message = odr_strdup_null(nrec->odr, srec->diag_message);
205 nrec->diag_details = odr_strdup_null(nrec->odr, srec->diag_details);
206 nrec->diag_set = odr_strdup_null(nrec->odr, srec->diag_set);
207 odr_destroy(odr_enc);
208 return nrec;
209}
210
212{
213 if (!rec)
214 return;
215
216#if SHPTR
217 if (rec->record_wrbuf)
218 YAZ_SHPTR_DEC(rec->record_wrbuf, wrbuf_destroy);
219#else
220 if (rec->wrbuf)
221 wrbuf_destroy(rec->wrbuf);
222#endif
223
224 if (rec->odr)
225 odr_destroy(rec->odr);
226}
227
228ZOOM_API(void)
230{
231 int i;
232 for (i = 0; i<RECORD_HASH_SIZE; i++)
233 {
235 for (rc = r->record_hash[i]; rc; rc = rc->next)
236 {
238 }
239 r->record_hash[i] = 0;
240 }
241}
242
243
244ZOOM_API(const char *)
245 ZOOM_record_get(ZOOM_record rec, const char *type_spec, int *len)
246{
247 WRBUF wrbuf;
248
249 if (len)
250 *len = 0; /* default return */
251
252 if (!rec || !rec->npr)
253 return 0;
254
255#if SHPTR
256 if (!rec->record_wrbuf)
257 {
258 WRBUF w = wrbuf_alloc();
259 YAZ_SHPTR_INIT(rec->record_wrbuf, w);
260 }
261 wrbuf = rec->record_wrbuf->ptr;
262#else
263 if (!rec->wrbuf)
264 rec->wrbuf = wrbuf_alloc();
265 wrbuf = rec->wrbuf;
266#endif
267 return yaz_record_render(rec->npr, rec->schema, wrbuf, type_spec, len);
268}
269
270ZOOM_API(int)
271 ZOOM_record_error(ZOOM_record rec, const char **cp,
272 const char **addinfo, const char **diagset)
273{
275
276 if (!rec)
277 return 0;
278
279 npr = rec->npr;
280 if (rec->diag_uri)
281 {
282 if (cp)
283 *cp = rec->diag_message;
284 if (addinfo)
285 *addinfo = rec->diag_details;
286 if (diagset)
287 *diagset = rec->diag_set;
288 return ZOOM_uri_to_code(rec->diag_uri);
289 }
291 {
292 Z_DiagRec *diag_rec = npr->u.surrogateDiagnostic;
293 int error = YAZ_BIB1_UNSPECIFIED_ERROR;
294 const char *add = 0;
295
296 if (diag_rec->which == Z_DiagRec_defaultFormat)
297 {
298 Z_DefaultDiagFormat *ddf = diag_rec->u.defaultFormat;
299 oid_class oclass;
300
301 error = *ddf->condition;
302 switch (ddf->which)
303 {
304 case Z_DefaultDiagFormat_v2Addinfo:
305 add = ddf->u.v2Addinfo;
306 break;
307 case Z_DefaultDiagFormat_v3Addinfo:
308 add = ddf->u.v3Addinfo;
309 break;
310 }
311 if (diagset)
312 *diagset =
313 yaz_oid_to_string(yaz_oid_std(),
314 ddf->diagnosticSetId, &oclass);
315 }
316 else
317 {
318 if (diagset)
319 *diagset = "Bib-1";
320 }
321 if (addinfo)
322 *addinfo = add ? add : "";
323 if (cp)
324 *cp = diagbib1_str(error);
325 return error;
326 }
327 return 0;
328}
329
330ZOOM_API(void)
332{
334 xfree(rec);
335}
336
337/*
338 * Local variables:
339 * c-basic-offset: 4
340 * c-file-style: "Stroustrup"
341 * indent-tabs-mode: nil
342 * End:
343 * vim: shiftwidth=4 tabstop=8 expandtab
344 */
345
const char * diagbib1_str(int code)
Definition diagbib1.c:192
Diagnostics: Generated by csvtodiag.tcl from ./bib1.csv.
Header for errno utilities.
int yaz_strcmp_null(const char *v1, const char *v2)
strcmp, null may be passed
Definition matchstr.c:95
char * odr_getbuf(ODR o, int *len, int *size)
Definition odr.c:276
ODR odr_createmem(int direction)
Definition odr.c:198
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
Definition odr.c:266
void odr_destroy(ODR o)
Definition odr.c:252
#define ODR_DECODE
Definition odr.h:95
struct odr * ODR
Definition odr.h:121
#define ODR_ENCODE
Definition odr.h:96
void * odr_malloc(ODR o, size_t size)
Definition odr_mem.c:31
char * odr_strdupn(ODR o, const char *str, size_t n)
Definition odr_mem.c:46
char * odr_strdup(ODR o, const char *str)
Definition odr_mem.c:36
char * odr_strdup_null(ODR o, const char *str)
Definition odr_mem.c:41
const char * yaz_record_render(Z_NamePlusRecord *npr, const char *schema, WRBUF wrbuf, const char *type_spec, int *len)
render records (ZOOM style)
Record render header.
Shared pointer macros.
#define YAZ_SHPTR_DEC(p, destroy)
Definition shptr.h:64
#define YAZ_SHPTR_INC(p)
Definition shptr.h:58
#define YAZ_SHPTR_TYPE(type)
Definition shptr.h:41
ZOOM_record_cache next
struct ZOOM_record_p rec
const char * schema
const char * diag_message
const char * diag_uri
const char * diag_set
const char * diag_details
Z_NamePlusRecord * npr
ZOOM_record_cache record_hash[RECORD_HASH_SIZE]
Definition zoom-p.h:143
ZOOM_connection connection
Definition zoom-p.h:145
char * message
Definition srw.h:66
char * details
Definition srw.h:65
char * uri
Definition srw.h:64
string buffer
Definition wrbuf.h:43
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
Definition wrbuf.c:38
WRBUF wrbuf_alloc(void)
construct WRBUF
Definition wrbuf.c:25
struct wrbuf * WRBUF
#define xfree(x)
utility macro which calls xfree_f
Definition xmalloc.h:53
#define xmalloc(x)
utility macro which calls malloc_f
Definition xmalloc.h:49
#define Z_NamePlusRecord_surrogateDiagnostic
Definition z-core.h:714
int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt, const char *name)
Definition z-core.c:593
ZOOM_Event ZOOM_Event_create(int kind)
Definition zoom-event.c:42
void ZOOM_connection_put_event(ZOOM_connection c, ZOOM_Event event)
Definition zoom-event.c:73
Z_NamePlusRecord * ZOOM_memcached_lookup(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
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)
Internal header for ZOOM implementation.
struct ZOOM_record_cache_p * ZOOM_record_cache
Definition zoom-p.h:130
struct ZOOM_Event_p * ZOOM_Event
Definition zoom-p.h:48
ZOOM_record ZOOM_record_cache_lookup(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
#define SHPTR
Definition zoom-p.h:46
void ZOOM_record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr, int pos, const char *syntax, const char *elementSetName, const char *schema, Z_SRW_diagnostic *diag)
#define RECORD_HASH_SIZE
Definition zoom-p.h:132
ZOOM_record ZOOM_record_cache_lookup_i(ZOOM_resultset r, int pos, const char *syntax, const char *elementSetName, const char *schema)
static void ZOOM_record_release(ZOOM_record rec)
static size_t record_hash(int pos)
static ZOOM_record record_cache_add(ZOOM_resultset r, Z_NamePlusRecord *npr, int pos, const char *syntax, const char *elementSetName, const char *schema, Z_SRW_diagnostic *diag)
ZOOM_resultset_cache_reset(ZOOM_resultset r)
struct ZOOM_record_p * ZOOM_record
Definition zoom.h:54
ZOOM_record_clone(ZOOM_record srec)
#define ZOOM_EVENT_RECV_RECORD
Definition zoom.h:159
ZOOM_record_destroy(ZOOM_record rec)
ZOOM_record_get(ZOOM_record rec, const char *type, int *len)
ZOOM_record_error(ZOOM_record rec, const char **msg, const char **addinfo, const char **diagset)
#define ZOOM_API(x)
Definition zoom.h:42
struct ZOOM_resultset_p * ZOOM_resultset
Definition zoom.h:53