diff options
| author | Marcello Stanisci <stanisci.m@gmail.com> | 2019-04-08 00:23:07 +0200 | 
|---|---|---|
| committer | Marcello Stanisci <stanisci.m@gmail.com> | 2019-04-08 02:37:45 +0200 | 
| commit | ddb8cdfa7a2d0bb297ab8190fd17575d916beaf4 (patch) | |
| tree | 0b3d792b4d029e7339e0c62702ccc7dfca8b8b26 /src | |
| parent | 3c66bb30b9ad56e934c364379095ec040b9e36e6 (diff) | |
Finishing /history-range implementation, untested.
Diffstat (limited to 'src')
| -rw-r--r-- | src/bank-lib/fakebank.c | 122 | 
1 files changed, 75 insertions, 47 deletions
| diff --git a/src/bank-lib/fakebank.c b/src/bank-lib/fakebank.c index 9d73b7f0..86f4c071 100644 --- a/src/bank-lib/fakebank.c +++ b/src/bank-lib/fakebank.c @@ -241,38 +241,6 @@ struct TALER_FAKEBANK_Handle  /** - * 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); - - -/**   * Check that the @a want_amount was transferred from   * the @a want_debit to the @a want_credit account.  If   * so, set the @a subject to the transfer identifier. @@ -783,6 +751,39 @@ handle_reject (struct TALER_FAKEBANK_Handle *h,   * Serving "/history" starts here. *   ***********************************/ +/** + * 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, +   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 + * _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); + + +  /**   * Decides whether the history builder will advance or not @@ -793,7 +794,7 @@ handle_reject (struct TALER_FAKEBANK_Handle *h,   */  static int  handle_history_advance (const struct HistoryArgs *ha, -                        struct Transaction *pos) +                        const struct Transaction *pos)  {    const struct HistoryRangeIds *hri = ha->range; @@ -858,9 +859,16 @@ handle_history_step (const struct HistoryArgs *ha,   * @return GNUNET_YES/NO to advance/not-advance.   */  static int -handle_history_range_advance (const struct HistoryArgs *ha) +handle_history_range_advance (const struct HistoryArgs *ha, +                              const struct Transaction *pos)  {    const struct HistoryRangeDates *hrd = ha->range; + +  if ( (NULL != pos) && +      (pos->date.abs_value_us <= hrd->end.abs_value_us) ) +    return GNUNET_YES; + +  return GNUNET_NO;  } @@ -874,25 +882,21 @@ handle_history_range_advance (const struct HistoryArgs *ha)   * @return the next element to be processed.   */  static struct Transaction * -handle_history_range_skip (const struct HistoryArgs *ha) +handle_history_range_skip (const struct HistoryArgs *ha, +                           const struct Transaction *pos)  { -  const struct HistoryRangeDates *hrd = ha->range; +  /* Transactions +   * are stored from "head"/older to "tail"/younger.  */ +  return pos->next;  }  /**   * Iterates on the "next" element to be processed.  To   * be used when the current element _gets_ inserted in the result. - * - * @param ha history arguments. - * @param pos current element being processed. - * @return the next element to be processed. + * Same implementation of the "skip" counterpart, as /history-range + * does not have the notion of count/delta.   */ -static struct Transaction * -handle_history_range_step (const struct HistoryArgs *ha) -{ -  const struct HistoryRangeDates *hrd = ha->range; -} - +Step handle_history_range_step = handle_history_range_skip;  /**   * Actual history response builder. @@ -1272,13 +1276,13 @@ handle_history_range (struct TALER_FAKEBANK_Handle *h,                        struct MHD_Connection *connection,                        void **con_cls)  { -    struct HistoryArgs ha;    struct HistoryRangeDates hrd;    const char *start;    const char *end;    long long unsigned int start_stamp;     long long unsigned int end_stamp;  +  struct Transaction *pos;    if (GNUNET_OK != parse_history_common_args (connection,                                                &ha)) @@ -1306,6 +1310,23 @@ handle_history_range (struct TALER_FAKEBANK_Handle *h,    hrd.start.abs_value_us = start_stamp * 1000LL * 1000LL;    hrd.end.abs_value_us = end_stamp * 1000LL * 1000LL; +  ha.range = &hrd; + +  pos = NULL; +  /* hunt for 'pos' in the Transaction(s) LL.  */ +  for (pos = h->transactions_head; +       NULL != pos; +       pos = pos->next) +  { +    if (hrd.start.abs_value_us <= pos->date.abs_value_us) +      break;  +  } +  return build_history_response (connection, +                                 pos, +                                 &ha, +                                 &handle_history_range_skip, +                                 handle_history_range_step, +                                 &handle_history_range_advance);  }  /** @@ -1674,6 +1695,13 @@ handle_mhd_request (void *cls,                            upload_data_size,                            con_cls);    if ( (0 == strcasecmp (url, +                         "/history-range")) && +       (0 == strcasecmp (method, +                         MHD_HTTP_METHOD_GET)) ) +    return handle_history_range (h, +                                 connection, +                                 con_cls); +  if ( (0 == strcasecmp (url,                           "/history")) &&         (0 == strcasecmp (method,                           MHD_HTTP_METHOD_GET)) ) | 
