+static void client_record_ingest(struct client *cl)
+{
+ const char *msg, *addinfo;
+ ZOOM_record rec = 0;
+ ZOOM_resultset resultset = cl->resultset;
+ struct session *se = client_get_session(cl);
+ xmlDoc *xdoc;
+ int offset = cl->record_offset + 1; /* 0 versus 1 numbered offsets */
+
+ xdoc = client_get_xdoc(cl, offset);
+ if (xdoc)
+ {
+ if (cl->session)
+ {
+ NMEM nmem = nmem_create();
+ int rc = ingest_xml_record(cl, xdoc, offset, nmem, 1);
+ if (rc == -1)
+ {
+ session_log(se, YLOG_WARN,
+ "%s: #%d: failed to ingest xdoc",
+ client_get_id(cl), offset);
+ cl->ingest_failures++;
+ }
+ else if (rc == -2)
+ cl->filtered++;
+ nmem_destroy(nmem);
+ }
+ }
+ else if ((rec = ZOOM_resultset_record_immediate(resultset,
+ cl->record_offset)))
+ {
+ if (cl->session == 0)
+ ; /* no operation */
+ else if (ZOOM_record_error(rec, &msg, &addinfo, 0))
+ {
+ session_log(se, YLOG_WARN, "Record error %s (%s): %s #%d",
+ msg, addinfo, client_get_id(cl), offset);
+ cl->record_failures++;
+ }
+ else
+ {
+ struct session_database *sdb = client_get_database(cl);
+ NMEM nmem = nmem_create();
+ const char *xmlrec;
+ char type[80];
+
+ const char *s = session_setting_oneval(sdb, PZ_NATIVESYNTAX);
+ if (nativesyntax_to_type(s, type, rec))
+ session_log(se, YLOG_WARN, "Failed to determine record type");
+ xmlrec = ZOOM_record_get(rec, type, NULL);
+ if (!xmlrec)
+ {
+ const char *rec_syn = ZOOM_record_get(rec, "syntax", NULL);
+ session_log(se, YLOG_WARN, "%s: #%d: ZOOM_record_get failed",
+ client_get_id(cl), offset);
+ session_log(se, YLOG_LOG, "pz:nativesyntax=%s . "
+ "ZOOM record type=%s . Actual record syntax=%s",
+ s ? s : "null", type,
+ rec_syn ? rec_syn : "null");
+ cl->ingest_failures++;
+ }
+ else
+ {
+ /* OK = 0, -1 = failure, -2 = Filtered */
+ int rc = ingest_record(cl, xmlrec, offset, nmem);
+ if (rc == -1)
+ {
+ const char *rec_syn = ZOOM_record_get(rec, "syntax", NULL);
+ session_log(se, YLOG_WARN,
+ "%s: #%d: failed to ingest record",
+ client_get_id(cl), offset);
+ session_log(se, YLOG_LOG, "pz:nativesyntax=%s . "
+ "ZOOM record type=%s . Actual record syntax=%s",
+ s ? s : "null", type,
+ rec_syn ? rec_syn : "null");
+ cl->ingest_failures++;
+ }
+ else if (rc == -2)
+ cl->filtered++;
+ }
+ nmem_destroy(nmem);
+ }
+ }
+ else
+ {
+ session_log(se, YLOG_WARN, "Got NULL record from %s #%d",
+ client_get_id(cl), offset);
+ }
+ cl->record_offset++;
+}
+
+void client_record_response(struct client *cl, int *got_records)