* Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zoom-c.c,v 1.67 2006-04-01 07:21:12 adam Exp $
+ * $Id: zoom-c.c,v 1.74 2006-06-02 13:08:27 adam Exp $
*/
/**
* \file zoom-c.c
assert (0);
}
xfree (task);
+
+ if (!c->tasks)
+ {
+ ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_END);
+ ZOOM_connection_put_event(c, event);
+ }
}
}
ZOOM_resultset ZOOM_resultset_create ()
{
+ int i;
ZOOM_resultset r = (ZOOM_resultset) xmalloc (sizeof(*r));
initlog();
r->schema = 0;
r->count = 0;
r->step = 0;
- r->record_cache = 0;
+ for (i = 0; i<RECORD_HASH_SIZE; i++)
+ r->record_hash[i] = 0;
r->r_sort_spec = 0;
r->query = 0;
r->connection = 0;
ZOOM_API(void)
ZOOM_resultset_cache_reset(ZOOM_resultset r)
{
- ZOOM_record_cache rc;
-
- for (rc = r->record_cache; rc; rc = rc->next)
+ int i;
+ for (i = 0; i<RECORD_HASH_SIZE; i++)
{
- if (rc->rec.wrbuf_marc)
- wrbuf_free (rc->rec.wrbuf_marc, 1);
- if (rc->rec.wrbuf_iconv)
- wrbuf_free (rc->rec.wrbuf_iconv, 1);
- if (rc->rec.wrbuf_opac)
- wrbuf_free (rc->rec.wrbuf_opac, 1);
+ ZOOM_record_cache rc;
+ for (rc = r->record_hash[i]; rc; rc = rc->next)
+ {
+ if (rc->rec.wrbuf_marc)
+ wrbuf_free (rc->rec.wrbuf_marc, 1);
+ if (rc->rec.wrbuf_iconv)
+ wrbuf_free (rc->rec.wrbuf_iconv, 1);
+ if (rc->rec.wrbuf_opac)
+ wrbuf_free (rc->rec.wrbuf_opac, 1);
+ }
+ r->record_hash[i] = 0;
}
- r->record_cache = 0;
}
ZOOM_API(void)
if (!r)
return ;
- yaz_log(log_api, "%p ZOOM_resultset_records r=%p start=%d count=%d",
- r, r, start, count);
+ yaz_log(log_api, "%p ZOOM_resultset_records r=%p start=%ld count=%ld",
+ r, r, (long) start, (long) count);
if (count && recs)
force_present = 1;
ZOOM_resultset_retrieve (r, force_present, start, count);
ZOOM_options_get(c->options, "implementationName"),
odr_prepend(c->odr_out, "ZOOM-C", ireq->implementationName));
- version = odr_strdup(c->odr_out, "$Revision: 1.67 $");
+ version = odr_strdup(c->odr_out, "$Revision: 1.74 $");
if (strlen(version) > 10) /* check for unexpanded CVS strings */
version[strlen(version)-2] = '\0';
ireq->implementationVersion = odr_prepend(c->odr_out,
#if HAVE_XML2
static zoom_ret send_srw (ZOOM_connection c, Z_SRW_PDU *sr)
{
- Z_SOAP_Handler h[2] = {
- {"http://www.loc.gov/zing/srw/", 0, (Z_SOAP_fun) yaz_srw_codec},
- {0, 0, 0}
- };
- ODR o = odr_createmem(ODR_ENCODE);
- int ret;
- Z_SOAP *p = (Z_SOAP*) odr_malloc(o, sizeof(*p));
Z_GDU *gdu;
ZOOM_Event event;
- gdu = z_get_HTTP_Request(c->odr_out);
- gdu->u.HTTP_Request->path = c->path;
-
- if (c->host_port)
- {
- const char *cp0 = strstr(c->host_port, "://");
- const char *cp1 = 0;
- if (cp0)
- cp0 = cp0+3;
- else
- cp0 = c->host_port;
-
- cp1 = strchr(cp0, '/');
- if (!cp1)
- cp1 = cp0+strlen(cp0);
-
- if (cp0 && cp1)
- {
- char *h = (char*) odr_malloc(c->odr_out, cp1 - cp0 + 1);
- memcpy (h, cp0, cp1 - cp0);
- h[cp1-cp0] = '\0';
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "Host", h);
- }
- }
+ gdu = z_get_HTTP_Request_host_path(c->odr_out, c->host_port, c->path);
if (c->sru_mode == zoom_sru_get)
{
}
else if (c->sru_mode == zoom_sru_soap)
{
- z_HTTP_header_add_content_type(c->odr_out,
- &gdu->u.HTTP_Request->headers,
- "text/xml", c->charset);
-
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "SOAPAction", "\"\"");
- p->which = Z_SOAP_generic;
- p->u.generic = (Z_SOAP_Generic *) odr_malloc(o, sizeof(*p->u.generic));
- p->u.generic->no = 0;
- p->u.generic->ns = 0;
- p->u.generic->p = sr;
- p->ns = "http://schemas.xmlsoap.org/soap/envelope/";
-
- ret = z_soap_codec_enc(o, &p,
- &gdu->u.HTTP_Request->content_buf,
- &gdu->u.HTTP_Request->content_len, h,
- c->charset);
-
+ yaz_sru_post_encode(gdu->u.HTTP_Request, sr, c->odr_out, c->charset);
}
if (!z_GDU(c->odr_out, &gdu, 0, 0))
return zoom_complete;
c->buf_out = odr_getbuf(c->odr_out, &c->len_out, 0);
- odr_destroy(o);
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
if (!rec)
{
- ZOOM_resultset_retrieve (r, 1, pos, 1);
+ /*
+ * MIKE: I think force_sync should always be zero, but I don't
+ * want to make this change until I get the go-ahead from
+ * Adam, in case something depends on the old synchronous
+ * behaviour.
+ */
+ int force_sync = 1;
+ if (getenv("ZOOM_RECORD_NO_FORCE_SYNC")) force_sync = 0;
+ ZOOM_resultset_retrieve (r, force_sync, pos, 1);
rec = ZOOM_resultset_record_immediate (r, pos);
}
return rec;
}
return 0;
}
- else if (!strcmp (type, "xml") || !strcmp(type, "oai"))
+ else if (!strcmp (type, "xml"))
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
oident *ent = oid_getentbyoid(r->direct_reference);
const char *ret_buf;
int marc_decode_type = YAZ_MARC_MARCXML;
- if (!strcmp(type, "oai"))
- marc_decode_type = YAZ_MARC_OAIMARC;
switch (ent->value)
{
case VAL_SOIF:
return strcmp(v1, v2);
}
+static size_t record_hash(int pos)
+{
+ if (pos < 0)
+ pos = 0;
+ return pos % RECORD_HASH_SIZE;
+}
+
static void record_cache_add (ZOOM_resultset r, Z_NamePlusRecord *npr,
int pos)
{
ZOOM_Event event = ZOOM_Event_create(ZOOM_EVENT_RECV_RECORD);
ZOOM_connection_put_event(r->connection, event);
- for (rc = r->record_cache; rc; rc = rc->next)
+ for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
{
if (pos == rc->pos)
{
rc->schema = 0;
rc->pos = pos;
- rc->next = r->record_cache;
- r->record_cache = rc;
+ rc->next = r->record_hash[record_hash(pos)];
+ r->record_hash[record_hash(pos)] = rc;
}
static ZOOM_record record_cache_lookup (ZOOM_resultset r, int pos)
const char *syntax =
ZOOM_resultset_option_get (r, "preferredRecordSyntax");
- for (rc = r->record_cache; rc; rc = rc->next)
+ for (rc = r->record_hash[record_hash(pos)]; rc; rc = rc->next)
{
if (pos == rc->pos)
{
event = ZOOM_Event_create (ZOOM_EVENT_SEND_APDU);
ZOOM_connection_put_event (c, event);
- return do_write_ex (c, c->tasks->u.package->buf_out,
- c->tasks->u.package->len_out);
+ c->buf_out = c->tasks->u.package->buf_out;
+ c->len_out = c->tasks->u.package->len_out;
+
+ return do_write(c);
}
static zoom_ret send_scan (ZOOM_connection c)