+ if (v)
+ return 1;
+ else
+ return 0;
+}
+
+int database_match_criteria(struct setting **settings, struct database_criterion *cl)
+{
+ for (; cl; cl = cl->next)
+ if (!match_criterion(settings, cl))
+ break;
+ if (cl) // one of the criteria failed to match -- skip this db
+ return 0;
+ else
+ return 1;
+}
+
+// Cycles through databases, calling a handler function on the ones for
+// which all criteria matched.
+int session_grep_databases(struct session *se, struct database_criterion *cl,
+ void (*fun)(void *context, struct session_database *db))
+{
+ struct session_database *p;
+ int i = 0;
+
+ for (p = se->databases; p; p = p->next)
+ {
+ if (p->settings && p->settings[PZ_ALLOW] && *p->settings[PZ_ALLOW]->value == '0')
+ continue;
+ if (database_match_criteria(p->settings, cl))
+ {
+ (*fun)(se, p);
+ i++;
+ }
+ }
+ return i;
+}
+
+int grep_databases(void *context, struct database_criterion *cl,
+ void (*fun)(void *context, struct database *db))
+{
+ struct database *p;
+ int i = 0;
+
+ for (p = databases; p; p = p->next)
+ if (database_match_criteria(p->settings, cl))
+ {
+ (*fun)(context, p);
+ i++;
+ }