-/**
- * Type of a function to call when we receive a message
- * from the service.
- *
- * @param cls closure
- * @param msg message received, NULL on timeout or fatal error
- */
-static void
-process_result_message (void *cls,
- const struct GNUNET_MessageHeader *msg)
-{
- struct GNUNET_DATASTORE_Handle *h = cls;
- struct GNUNET_DATASTORE_QueueEntry *qe;
- struct ResultContext rc;
- const struct DataMessage *dm;
-
- if (msg == NULL)
- {
- qe = h->queue_head;
- GNUNET_assert (NULL != qe);
- if (qe->was_transmitted == GNUNET_YES)
- {
- rc = qe->qc.rc;
- GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Failed to receive response from database.\n"));
- do_disconnect (h);
- free_queue_entry (qe);
- if (rc.proc != NULL)
- rc.proc (rc.proc_cls,
- NULL, 0, NULL, 0, 0, 0,
- GNUNET_TIME_UNIT_ZERO_ABS, 0);
- }
- else
- process_queue (h);
- return;
- }
- if (ntohs(msg->type) == GNUNET_MESSAGE_TYPE_DATASTORE_DATA_END)
- {
- GNUNET_break (ntohs(msg->size) == sizeof(struct GNUNET_MessageHeader));
- qe = h->queue_head;
- rc = qe->qc.rc;
- GNUNET_assert (GNUNET_YES == qe->was_transmitted);
- free_queue_entry (qe);
-#if DEBUG_DATASTORE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received end of result set, new queue size is %u\n",
- h->queue_size);
-#endif
- if (rc.proc != NULL)
- rc.proc (rc.proc_cls,
- NULL, 0, NULL, 0, 0, 0,
- GNUNET_TIME_UNIT_ZERO_ABS, 0);
- h->retry_time.rel_value = 0;
- h->result_count = 0;
- process_queue (h);
- return;
- }
- qe = h->queue_head;
- rc = qe->qc.rc;
- if (GNUNET_YES != qe->was_transmitted)
- {
- GNUNET_break (0);
- free_queue_entry (qe);
- h->retry_time = GNUNET_TIME_UNIT_ZERO;
- do_disconnect (h);
- if (rc.proc != NULL)
- rc.proc (rc.proc_cls,
- NULL, 0, NULL, 0, 0, 0,
- GNUNET_TIME_UNIT_ZERO_ABS, 0);
- return;
- }
- if ( (ntohs(msg->size) < sizeof(struct DataMessage)) ||
- (ntohs(msg->type) != GNUNET_MESSAGE_TYPE_DATASTORE_DATA) ||
- (ntohs(msg->size) != sizeof(struct DataMessage) + ntohl (((const struct DataMessage*)msg)->size)) )
- {
- GNUNET_break (0);
- free_queue_entry (qe);
- h->retry_time = GNUNET_TIME_UNIT_ZERO;
- do_disconnect (h);
- if (rc.proc != NULL)
- rc.proc (rc.proc_cls,
- NULL, 0, NULL, 0, 0, 0,
- GNUNET_TIME_UNIT_ZERO_ABS, 0);
- return;
- }
- GNUNET_STATISTICS_update (h->stats,
- gettext_noop ("# Results received"),
- 1,
- GNUNET_NO);
- dm = (const struct DataMessage*) msg;
-#if DEBUG_DATASTORE
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Received result %llu with type %u and size %u with key %s\n",
- (unsigned long long) GNUNET_ntohll(dm->uid),
- ntohl(dm->type),
- ntohl(dm->size),
- GNUNET_h2s(&dm->key));
-#endif
- free_queue_entry (qe);
- h->retry_time.rel_value = 0;
- process_queue (h);
- if (rc.proc != NULL)
- rc.proc (rc.proc_cls,
- &dm->key,
- ntohl(dm->size),
- &dm[1],
- ntohl(dm->type),
- ntohl(dm->priority),
- ntohl(dm->anonymity),
- GNUNET_TIME_absolute_ntoh(dm->expiration),
- GNUNET_ntohll(dm->uid));
-}
-