+static void ir_searchResponse (void *o, Z_SearchResponse *searchrs)
+{
+ IrTcl_Obj *p = o;
+ IrTcl_SetObj *setobj = p->set_child;
+ Z_Records *zrs = searchrs->records;
+
+ logf (LOG_DEBUG, "Received search response");
+ if (!setobj)
+ {
+ logf (LOG_DEBUG, "Search response, no object!");
+ return;
+ }
+ setobj->searchStatus = searchrs->searchStatus ? 1 : 0;
+ get_referenceId (&setobj->set_inher.referenceId, searchrs->referenceId);
+ setobj->resultCount = *searchrs->resultCount;
+ if (searchrs->presentStatus)
+ setobj->presentStatus = *searchrs->presentStatus;
+ if (searchrs->nextResultSetPosition)
+ setobj->nextResultSetPosition = *searchrs->nextResultSetPosition;
+
+ logf (LOG_DEBUG, "Search response %d, %d hits",
+ setobj->searchStatus, setobj->resultCount);
+ if (zrs)
+ ir_handleRecords (o, zrs);
+ else
+ setobj->recordFlag = 0;
+}
+
+
+static void ir_presentResponse (void *o, Z_PresentResponse *presrs)
+{
+ IrTcl_Obj *p = o;
+ IrTcl_SetObj *setobj = p->set_child;
+ Z_Records *zrs = presrs->records;
+
+ logf (LOG_DEBUG, "Received present response");
+ if (!setobj)
+ {
+ logf (LOG_DEBUG, "Present response, no object!");
+ return;
+ }
+ setobj->presentStatus = *presrs->presentStatus;
+ get_referenceId (&setobj->set_inher.referenceId, presrs->referenceId);
+ setobj->nextResultSetPosition = *presrs->nextResultSetPosition;
+ if (zrs)
+ ir_handleRecords (o, zrs);
+ else
+ {
+ setobj->recordFlag = 0;
+ logf (LOG_DEBUG, "No records!");
+ }
+}
+
+static void ir_scanResponse (void *o, Z_ScanResponse *scanrs)
+{
+ IrTcl_Obj *p = o;
+ IrTcl_ScanObj *scanobj = p->scan_child;
+
+ logf (LOG_DEBUG, "Received scanResponse");
+
+ get_referenceId (&p->set_inher.referenceId, scanrs->referenceId);
+ scanobj->scanStatus = *scanrs->scanStatus;
+ logf (LOG_DEBUG, "scanStatus=%d", scanobj->scanStatus);
+
+ if (scanrs->stepSize)
+ scanobj->stepSize = *scanrs->stepSize;
+ logf (LOG_DEBUG, "stepSize=%d", scanobj->stepSize);
+
+ scanobj->numberOfEntriesReturned = *scanrs->numberOfEntriesReturned;
+ logf (LOG_DEBUG, "numberOfEntriesReturned=%d",
+ scanobj->numberOfEntriesReturned);
+
+ if (scanrs->positionOfTerm)
+ scanobj->positionOfTerm = *scanrs->positionOfTerm;
+ else
+ scanobj->positionOfTerm = -1;
+ logf (LOG_DEBUG, "positionOfTerm=%d", scanobj->positionOfTerm);
+
+ free (scanobj->entries);
+ scanobj->entries = NULL;
+
+ ir_deleteDiags (&scanobj->nonSurrogateDiagnosticList,
+ &scanobj->nonSurrogateDiagnosticNum);
+ if (scanrs->entries)
+ {
+ int i;
+ Z_Entry *ze;
+
+ scanobj->entries_flag = 1;
+ scanobj->which = scanrs->entries->which;
+ switch (scanobj->which)
+ {
+ case Z_ListEntries_entries:
+ scanobj->num_entries = scanrs->entries->u.entries->num_entries;
+ scanobj->entries = malloc (scanobj->num_entries *
+ sizeof(*scanobj->entries));
+ for (i=0; i<scanobj->num_entries; i++)
+ {
+ ze = scanrs->entries->u.entries->entries[i];
+ scanobj->entries[i].which = ze->which;
+ switch (ze->which)
+ {
+ case Z_Entry_termInfo:
+ if (ze->u.termInfo->term->which == Z_Term_general)
+ {
+ int l = ze->u.termInfo->term->u.general->len;
+ scanobj->entries[i].u.term.buf = malloc (1+l);
+ memcpy (scanobj->entries[i].u.term.buf,
+ ze->u.termInfo->term->u.general->buf,
+ l);
+ scanobj->entries[i].u.term.buf[l] = '\0';
+ }
+ else
+ scanobj->entries[i].u.term.buf = NULL;
+ if (ze->u.termInfo->globalOccurrences)
+ scanobj->entries[i].u.term.globalOccurrences =
+ *ze->u.termInfo->globalOccurrences;
+ else
+ scanobj->entries[i].u.term.globalOccurrences = 0;
+ break;
+ case Z_Entry_surrogateDiagnostic:
+ ir_handleDiags (&scanobj->entries[i].u.diag.list,
+ &scanobj->entries[i].u.diag.num,
+ &ze->u.surrogateDiagnostic,
+ 1);
+ break;
+ }
+ }
+ break;
+ case Z_ListEntries_nonSurrogateDiagnostics:
+ ir_handleDiags (&scanobj->nonSurrogateDiagnosticList,
+ &scanobj->nonSurrogateDiagnosticNum,
+ scanrs->entries->u.nonSurrogateDiagnostics->
+ diagRecs,
+ scanrs->entries->u.nonSurrogateDiagnostics->
+ num_diagRecs);
+ break;
+ }
+ }
+ else
+ scanobj->entries_flag = 0;
+}
+