+ int len;
+
+ if (!strcmp(pattern, "*"))
+ return 1;
+ else if (!strncmp(pattern, "*/", 2)) // host wildcard.. what the heck is that for?
+ {
+ char *db = strchr(zurl, '/');
+ if (!db)
+ return 0;
+ if (!strcmp(pattern + 2, db))
+ return 1;
+ else
+ return 0;
+ }
+ else if (*(pattern + (len = strlen(pattern) - 1)) == '*') // db wildcard
+ {
+ if (!strncmp(pattern, zurl, len))
+ return 1;
+ else
+ return 2;
+ }
+ else if (!strcmp(pattern, zurl))
+ return 1;
+ else
+ return 0;
+}
+
+// This will be generalized at some point
+static int match_criterion(struct setting **settings,
+ struct conf_service *service,
+ struct database_criterion *c)
+{
+ int offset = settings_offset(service, c->name);
+ struct database_criterion_value *v;
+
+ if (offset < 0)
+ {
+ yaz_log(YLOG_WARN, "Criterion not found: %s", c->name);
+ return 0;
+ }
+ if (!settings[offset])
+ return 0;
+ for (v = c->values; v; v = v->next)
+ {
+ if (offset == PZ_ID)
+ {
+ if (match_zurl(settings[offset]->value, v->value))
+ break;
+ }
+ else
+ {
+ if (!strcmp(settings[offset]->value, v->value))
+ break;
+ }
+ }
+ if (v)
+ return 1;