Only terms that looks a numeric is used.. Returns -1 if
no sub tree has a hit count term
*/
-static int get_term_hit(Z_RPNStructure *s)
+static Odr_int get_term_hit(Z_RPNStructure *s)
{
- int h = -1;
+ Odr_int h = -1;
switch(s->which)
{
case Z_RPNStructure_simple:
{
Odr_oct *oct = apt->term->u.general;
if (oct->len > 0 && oct->buf[0] >= '0' && oct->buf[0] <= '9')
- h = atoi_n((const char *) oct->buf, oct->len);
+ {
+ char *endptr;
+ WRBUF hits_str = wrbuf_alloc();
+ wrbuf_write(hits_str, (const char *) oct->buf, oct->len);
+#ifdef WIN32
+ h = _strtoui64(wrbuf_cstr(hits_str), &endptr, 10);
+#else
+ h = strtoll(wrbuf_cstr(hits_str), &endptr, 10);
+#endif
+ wrbuf_destroy(hits_str);
+ }
}
}
break;
have a way to trigger a certain hit count. Good for testing of
client applications etc
*/
-static int get_hit_count(Z_Query *q)
+static Odr_int get_hit_count(Z_Query *q)
{
- int h = -1;
+ Odr_int h = -1;
if (q->which == Z_Query_type_1 || q->which == Z_Query_type_101)
h = get_term_hit(q->u.type_1->RPNStructure);
if (h == -1)
return h;
}
-int ztest_search(void *handle, bend_search_rr *rr)
+/** \brief checks if it's a dummy Slow database..
+ \param basename database name to check
+ \param association backend association (or NULL if not available)
+ \retval 1 is slow database
+ \retval 0 is not a slow database
+
+ The Slow database is for testing.. It allows us to simulate
+ a slow server...
+*/
+static int check_slow(const char *basename, bend_association association)
{
- if (rr->num_bases != 1)
- {
- rr->errcode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP;
- return 0;
- }
- /* Throw Database unavailable if other than Default or Slow */
- if (!yaz_matchstr(rr->basenames[0], "Default"))
- ; /* Default is OK in our test */
- else if(!yaz_matchstr(rr->basenames[0], "Slow"))
+ if (strncmp(basename, "Slow", 4) == 0)
{
#if HAVE_UNISTD_H
+ int i, w = 3;
+ if (basename[4])
+ sscanf(basename+4, "%d", &w);
/* wait up to 3 seconds and check if connection is still alive */
- int i;
- for (i = 0; i<3; i++)
+ for (i = 0; i < w; i++)
{
- if (!bend_assoc_is_alive(rr->association))
+ if (association && !bend_assoc_is_alive(association))
{
yaz_log(YLOG_LOG, "search aborted");
break;
sleep(1);
}
#endif
+ return 1;
+ }
+ return 0;
+}
+
+int ztest_search(void *handle, bend_search_rr *rr)
+{
+ if (rr->num_bases != 1)
+ {
+ rr->errcode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP;
+ return 0;
+ }
+ /* Throw Database unavailable if other than Default or Slow */
+ if (!yaz_matchstr(rr->basenames[0], "Default"))
+ ; /* Default is OK in our test */
+ else if (check_slow(rr->basenames[0], rr->association))
+ {
rr->estimated_hit_count = 1;
}
else
return 0;
}
+ if (rr->extra_args)
+ {
+ Z_SRW_extra_arg *a;
+ WRBUF response_xml = wrbuf_alloc();
+ wrbuf_puts(response_xml, "<extra>");
+ for (a = rr->extra_args; a; a = a->next)
+ {
+ wrbuf_puts(response_xml, "<extra name=\"");
+ wrbuf_xmlputs(response_xml, a->name);
+ wrbuf_puts(response_xml, "\"");
+ if (a->value)
+ {
+ wrbuf_puts(response_xml, " value=\"");
+ wrbuf_xmlputs(response_xml, a->value);
+ wrbuf_puts(response_xml, "\"");
+ }
+ wrbuf_puts(response_xml, "/>");
+ }
+ wrbuf_puts(response_xml, "</extra>");
+ rr->extra_response_data =
+ odr_strdup(rr->stream, wrbuf_cstr(response_xml));
+ wrbuf_destroy(response_xml);
+ }
rr->hits = get_hit_count(rr->query);
return 0;
}
if (rr->esr->packageName)
yaz_log(log_level, "packagename: %s", rr->esr->packageName);
- yaz_log(log_level, "Waitaction: %d", *rr->esr->waitAction);
+ yaz_log(log_level, "Waitaction: " ODR_INT_PRINTF, *rr->esr->waitAction);
- yaz_log(log_level, "function: %d", *rr->esr->function);
+ yaz_log(log_level, "function: " ODR_INT_PRINTF, *rr->esr->function);
if (!rr->esr->taskSpecificParameters)
{
{
yaz_log(log_level, "resultsetItem");
yaz_log(log_level, "setId: %s", n->resultSetItem->resultSetId);
- yaz_log(log_level, "item: %d", *n->resultSetItem->item);
+ yaz_log(log_level, "item: " ODR_INT_PRINTF, *n->resultSetItem->item);
}
if (n->itemRequest)
{
}
if (item_req)
{
- yaz_log(log_level, "ILL protocol version = %d",
+ yaz_log(log_level, "ILL protocol version = "
+ ODR_INT_PRINTF,
*item_req->protocol_version_num);
}
}
yaz_log(log_level, " specialUpdate");
break;
default:
- yaz_log(log_level, " unknown (%d)", *toKeep->action);
+ yaz_log(log_level, " unknown (" ODR_INT_PRINTF ")",
+ *toKeep->action);
}
}
if (toKeep->databaseName)
ext->u.update->u.taskPackage->originPart = keep;
ext->u.update->u.taskPackage->targetPart = targetPart;
- keep->action = (int *) odr_malloc(rr->stream, sizeof(int));
- *keep->action = *toKeep->action;
+ keep->action = odr_intdup(rr->stream, *toKeep->action);
keep->databaseName =
odr_strdup(rr->stream, toKeep->databaseName);
keep->schema = 0;
/* Throw Database unavailable if other than Default or Slow */
if (!yaz_matchstr(q->basenames[0], "Default"))
; /* Default is OK in our test */
- else if(!yaz_matchstr(q->basenames[0], "Slow"))
- {
-#if HAVE_UNISTD_H
- sleep(3);
-#endif
+ else if (check_slow(q->basenames[0], 0 /* no assoc for scan */))
;
- }
else
{
q->errcode = YAZ_BIB1_DATABASE_UNAVAILABLE;