+
+}
+
+int ztest_search(void *handle, bend_search_rr *rr)
+{
+ struct session_handle *sh = (struct session_handle*) handle;
+ struct result_set *new_set;
+ const char *db, *db_sep;
+
+ if (rr->num_bases != 1)
+ {
+ rr->errcode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP;
+ return 0;
+ }
+
+ db = rr->basenames[0];
+
+ /* Allow Default, db.* and Slow */
+ if (strcmp_prefix(db, "Default"))
+ ; /* Default is OK in our test */
+ else if (strcmp_prefix(db, "db"))
+ ; /* db.* is OK in our test */
+ else if (check_slow(rr->basenames[0], rr->association))
+ {
+ rr->estimated_hit_count = 1;
+ }
+ else
+ {
+ rr->errcode = YAZ_BIB1_DATABASE_UNAVAILABLE;
+ rr->errstring = rr->basenames[0];
+ return 0;
+ }
+
+ new_set = get_set(sh, rr->setname);
+ if (new_set)
+ {
+ if (!rr->replace_set)
+ {
+ rr->errcode = YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF;
+ return 0;
+ }
+ xfree(new_set->db);
+ }
+ else
+ {
+ new_set = xmalloc(sizeof(*new_set));
+ new_set->next = sh->result_sets;
+ sh->result_sets = new_set;
+ new_set->name = xstrdup(rr->setname);
+ }
+ new_set->hits = 0;
+ new_set->db = xstrdup(db);
+ init_delay(&new_set->search_delay);
+ init_delay(&new_set->present_delay);
+ init_delay(&new_set->fetch_delay);
+
+ db_sep = strchr(db, '?');
+ if (db_sep)
+ {
+ char **names;
+ char **values;
+ int no_parms = yaz_uri_to_array(db_sep+1, rr->stream, &names, &values);
+ int i;
+ for (i = 0; i < no_parms; i++)
+ {
+ const char *name = names[i];
+ const char *value = values[i];
+ if (!strcmp(name, "seed"))
+ srand(atoi(value));
+ else if (!strcmp(name, "search-delay"))
+ parse_delay(&new_set->search_delay, value);
+ else if (!strcmp(name, "present-delay"))
+ parse_delay(&new_set->present_delay, value);
+ else if (!strcmp(name, "fetch-delay"))
+ parse_delay(&new_set->fetch_delay, value);
+ else
+ {
+ rr->errcode = YAZ_BIB1_SERVICE_UNSUPP_FOR_THIS_DATABASE;
+ rr->errstring = odr_strdup(rr->stream, name);
+ }
+ }
+ }
+
+ echo_extra_args(rr->stream, rr->extra_args, &rr->extra_response_data);