[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-exchange] 01/08: Finish abstract history builder.
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-exchange] 01/08: Finish abstract history builder. |
Date: |
Mon, 08 Apr 2019 02:44:33 +0200 |
This is an automated email from the git hooks/post-receive script.
marcello pushed a commit to branch master
in repository exchange.
commit eca27d9d913378e2356a6fdc51e95e6ff3f4d7bb
Author: Marcello Stanisci <address@hidden>
AuthorDate: Sun Apr 7 23:31:18 2019 +0200
Finish abstract history builder.
---
src/bank-lib/fakebank.c | 113 +++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 108 insertions(+), 5 deletions(-)
diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c
index 3eea5f8b..0ade934a 100644
--- a/src/bank-lib/fakebank.c
+++ b/src/bank-lib/fakebank.c
@@ -239,13 +239,34 @@ struct TALER_FAKEBANK_Handle
#endif
};
-typedef int (*CheckAdvance)(const struct HistoryArgs *ha,
- struct Transaction *pos);
+/**
+ * Type for a function that decides whether or not
+ * the history-building loop should iterate once again.
+ * Typically called from inside the 'while' condition.
+ *
+ * @param ha history argument.
+ * @param pos current position.
+ * @return GNUNET_YES if the iteration shuold go on.
+ */
+typedef int (*CheckAdvance)
+ (const struct HistoryArgs *ha,
+ struct Transaction *pos);
+
+/**
+ * Type for a function that steps over the next element
+ * in the list of all transactions, after the current @a pos
+ * _got_ included in the result.
+ */
typedef struct Transaction * (*Step)
(const struct HistoryArgs *ha,
const struct Transaction *pos);
+/*
+ * Type for a function that steps over the next element
+ * in the list of all transactions, after the current @a pos
+ * did _not_ get included in the result.
+ */
typedef struct Transaction * (*Skip)
(const struct HistoryArgs *ha,
const struct Transaction *pos);
@@ -953,6 +974,7 @@ handle_history_new (struct TALER_FAKEBANK_Handle *h,
pos = NULL;
}
+ /* Loop starts here. */
}
/**
@@ -1120,10 +1142,12 @@ handle_history_range_step (const struct HistoryArgs *ha)
* @param pos first (included) element in the result set.
* @param ha history arguments.
* @param caller_name which function is building the history.
- * @return MHD response object, or NULL if any error occurs.
+ * @return MHD_YES / MHD_NO, after having enqueued the response
+ * object into MHD.
*/
static struct MHD_response *
-build_history_response (struct Transaction *pos,
+build_history_response (struct MHD_Connection *connection,
+ struct Transaction *pos,
struct HistoryArgs *ha,
Skip skip,
Step step,
@@ -1133,6 +1157,9 @@ build_history_response (struct Transaction *pos,
struct HistoryElement *history_results_head = NULL;
struct HistoryElement *history_results_tail = NULL;
struct HistoryElement *history_element = NULL;
+ json_t *history;
+ json_t *jresponse;
+ int ret;
while (GNUNET_YES == advance (ha,
pos))
@@ -1192,6 +1219,81 @@ build_history_response (struct Transaction *pos,
history_element);
pos = step (ha, pos);
}
+
+ history = json_array ();
+ if (NULL != history_results_head)
+ history_element = history_results_head;
+
+ while (NULL != history_element)
+ {
+ json_array_append_new (history,
+ history_element->element);
+ history_element = history_element->next;
+ if (NULL != history_element)
+ GNUNET_free_non_null (history_element->prev);
+ }
+ GNUNET_free_non_null (history_results_tail);
+
+ if (0 == json_array_size (history))
+ {
+ struct MHD_Response *resp;
+
+ json_decref (history);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Returning empty transaction history\n");
+ resp = MHD_create_response_from_buffer
+ (0,
+ "",
+ MHD_RESPMEM_PERSISTENT);
+ ret = MHD_queue_response (connection,
+ MHD_HTTP_NO_CONTENT,
+ resp);
+ MHD_destroy_response (resp);
+ return ret;
+ }
+
+ jresponse = json_pack ("{s:o}",
+ "data",
+ history);
+ if (NULL == jresponse)
+ {
+ GNUNET_break (0);
+ return MHD_NO;
+ }
+
+ /* Finally build response object */
+ {
+ struct MHD_Response *resp;
+ void *json_str;
+ size_t json_len;
+
+ json_str = json_dumps (jresponse,
+ JSON_INDENT(2));
+ json_decref (jresponse);
+ if (NULL == json_str)
+ {
+ GNUNET_break (0);
+ return MHD_NO;
+ }
+ json_len = strlen (json_str);
+ resp = MHD_create_response_from_buffer (json_len,
+ json_str,
+ MHD_RESPMEM_MUST_FREE);
+ if (NULL == resp)
+ {
+ GNUNET_break (0);
+ free (json_str);
+ return MHD_NO;
+ }
+ (void) MHD_add_response_header (resp,
+ MHD_HTTP_HEADER_CONTENT_TYPE,
+ "application/json");
+ ret = MHD_queue_response (connection,
+ MHD_HTTP_OK,
+ resp);
+ MHD_destroy_response (resp);
+ }
+ return ret;
}
@@ -1255,7 +1357,8 @@ handle_history (struct TALER_FAKEBANK_Handle *h,
(NULL == acc) ||
(NULL == delta) )
{
- /* Invalid request, given that this is fakebank we impolitely just
+ /* Invalid request,
+ given that this is fakebank we impolitely just
kill the connection instead of returning a nice error. */
GNUNET_break (0);
return MHD_NO;
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [taler-exchange] branch master updated (6b6417b1 -> 602093e9), gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 08/08: notes, gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 04/08: Fix compilation warnings, + enable polymorphic /history handler., gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 06/08: Set range pointer., gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 01/08: Finish abstract history builder.,
gnunet <=
- [GNUnet-SVN] [taler-exchange] 05/08: debug message, gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 03/08: Finishing /history-range implementation, untested., gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 02/08: Gather /history implementation(s) in one point., gnunet, 2019/04/07
- [GNUnet-SVN] [taler-exchange] 07/08: Put /history[-range] logic in a dedicate file., gnunet, 2019/04/07