From 0305cf5f9eb904e7a3ab3e8d39f4974a92a9a0b3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 16 Jan 2020 22:40:12 +0100 Subject: move function to libtalerexchangedb, as planned --- src/exchangedb/Makefile.am | 3 +- src/exchangedb/exchangedb_fees.c | 2 +- src/exchangedb/exchangedb_transactions.c | 142 +++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 src/exchangedb/exchangedb_transactions.c (limited to 'src/exchangedb') diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 1a8665849..c0d6bc669 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -46,8 +46,9 @@ libtalerexchangedb_la_SOURCES = \ exchangedb_auditorkeys.c \ exchangedb_denomkeys.c \ exchangedb_fees.c \ + exchangedb_plugin.c \ exchangedb_signkeys.c \ - exchangedb_plugin.c + exchangedb_transactions.c libtalerexchangedb_la_LIBADD = \ $(top_builddir)/src/util/libtalerutil.la \ diff --git a/src/exchangedb/exchangedb_fees.c b/src/exchangedb/exchangedb_fees.c index 386c5de90..c025604fa 100644 --- a/src/exchangedb/exchangedb_fees.c +++ b/src/exchangedb/exchangedb_fees.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2017 GNUnet e.V. + Copyright (C) 2017 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software diff --git a/src/exchangedb/exchangedb_transactions.c b/src/exchangedb/exchangedb_transactions.c new file mode 100644 index 000000000..2891f0adb --- /dev/null +++ b/src/exchangedb/exchangedb_transactions.c @@ -0,0 +1,142 @@ +/* + This file is part of TALER + Copyright (C) 2017-2020 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + TALER; see the file COPYING. If not, see +*/ +/** + * @file exchangedb/exchangedb_transactions.c + * @brief Logic to compute transaction totals of a transaction list for a coin + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_exchangedb_lib.h" + + +/** + * Calculate the total value of all transactions performed. + * Stores @a off plus the cost of all transactions in @a tl + * in @a ret. + * + * @param tl transaction list to process + * @param off offset to use as the starting value + * @param[out] ret where the resulting total is to be stored + * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors + */ +int +TALER_EXCHANGEDB_calculate_transaction_list_totals (struct + TALER_EXCHANGEDB_TransactionList + *tl, + const struct + TALER_Amount *off, + struct TALER_Amount *ret) +{ + struct TALER_Amount spent = *off; + struct TALER_Amount refunded; + + GNUNET_assert (GNUNET_OK == + TALER_amount_get_zero (spent.currency, + &refunded)); + for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos = + pos->next) + { + switch (pos->type) + { + case TALER_EXCHANGEDB_TT_DEPOSIT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.deposit->amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFRESH_MELT: + /* spent += pos->amount_with_fee */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.melt->session.amount_with_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_REFUND: + /* refunded += pos->refund_amount - pos->refund_fee */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.refund->refund_amount)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + if (GNUNET_OK != + TALER_amount_subtract (&refunded, + &refunded, + &pos->details.refund->refund_fee)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK: + /* refunded += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&refunded, + &refunded, + &pos->details.old_coin_payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH: + /* spent += pos->value */ + if (GNUNET_OK != + TALER_amount_add (&spent, + &spent, + &pos->details.payback_refresh->value)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + break; + } + } + /* spent = spent - refunded */ + if (GNUNET_SYSERR == + TALER_amount_subtract (&spent, + &spent, + &refunded)) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + + *ret = spent; + return GNUNET_OK; +} -- cgit v1.2.3