donau

Donation authority for GNU Taler (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 36a5d95a44c25ad1a14f905bd02ad26b33dca501
parent 59186c0492279174954e93ba7a14f8f704873b34
Author: Casaburi Johannes <johannes.casaburi@students.bfh.ch>
Date:   Mon,  4 Dec 2023 22:03:50 +0100

[db] fix some errors

Diffstat:
Msrc/donaudb/Makefile.am | 3+--
Msrc/donaudb/donaudb_plugin.c | 81++++++++++++++++++++++++++++++++++++++++---------------------------------------
Dsrc/donaudb/donaudb_transactions.c | 190-------------------------------------------------------------------------------
Msrc/include/donaudb_plugin.h | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 203 insertions(+), 232 deletions(-)

diff --git a/src/donaudb/Makefile.am b/src/donaudb/Makefile.am @@ -88,8 +88,7 @@ lib_LTLIBRARIES = \ libtalerdonaudb.la libtalerdonaudb_la_SOURCES = \ - donaudb_plugin.c \ - donaudb_transactions.c + donaudb_plugin.c libtalerdonaudb_la_LIBADD = \ $(top_builddir)/src/util/libtalerdonauutil.la \ -lgnunetutil \ diff --git a/src/donaudb/donaudb_plugin.c b/src/donaudb/donaudb_plugin.c @@ -21,53 +21,54 @@ */ #include "taler/platform.h" #include "donaudb_plugin.h" +#include <gnunet/gnunet_db_lib.h> #include <ltdl.h> -// struct DONAUDB_Plugin * -// DONAUDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg) -// { -// char *plugin_name; -// char *lib_name; -// struct DONAUDB_Plugin *plugin; +struct DONAUDB_Plugin * +DONAUDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + char *plugin_name; + char *lib_name; + struct DONAUDB_Plugin *plugin; -// if (GNUNET_SYSERR == -// GNUNET_CONFIGURATION_get_value_string (cfg, -// "donau", -// "db", -// &plugin_name)) -// { -// GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, -// "donau", -// "db"); -// return NULL; -// } -// GNUNET_asprintf (&lib_name, -// "libtaler_plugin_donaudb_%s", -// plugin_name); -// GNUNET_free (plugin_name); -// plugin = GNUNET_PLUGIN_load (lib_name, -// (void *) cfg); -// if (NULL != plugin) -// plugin->library_name = lib_name; -// else -// GNUNET_free (lib_name); -// return plugin; -// } + if (GNUNET_SYSERR == + GNUNET_CONFIGURATION_get_value_string (cfg, + "donau", + "db", + &plugin_name)) + { + GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, + "donau", + "db"); + return NULL; + } + GNUNET_asprintf (&lib_name, + "libtaler_plugin_donaudb_%s", + plugin_name); + GNUNET_free (plugin_name); + plugin = GNUNET_PLUGIN_load (lib_name, + (void *) cfg); + if (NULL != plugin) + plugin->library_name = lib_name; + else + GNUNET_free (lib_name); + return plugin; +} -// void -// DONAUDB_plugin_unload (struct DONAUDB_Plugin *plugin) -// { -// char *lib_name; +void +DONAUDB_plugin_unload (struct DONAUDB_Plugin *plugin) +{ + char *lib_name; -// if (NULL == plugin) -// return; -// lib_name = plugin->library_name; -// GNUNET_assert (NULL == GNUNET_PLUGIN_unload (lib_name, -// plugin)); -// GNUNET_free (lib_name); -// } + if (NULL == plugin) + return; + lib_name = plugin->library_name; + GNUNET_assert (NULL == GNUNET_PLUGIN_unload (lib_name, + plugin)); + GNUNET_free (lib_name); +} /* end of donaudb_plugin.c */ diff --git a/src/donaudb/donaudb_transactions.c b/src/donaudb/donaudb_transactions.c @@ -1,190 +0,0 @@ -/* - 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 CHARITYABILITY 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 <http://www.gnu.org/licenses/> -*/ -/** - * @file donaudb/donaudb_transactions.c - * @brief Logic to compute transaction totals of a transaction list for a coin - * @author Christian Grothoff - */ -#include "taler/platform.h" -#include "donaudb_lib.h" - - -// enum GNUNET_GenericReturnValue -// DONAUDB_calculate_transaction_list_totals ( -// struct DONAUDB_TransactionList *tl, -// const struct TALER_Amount *off, -// struct TALER_Amount *ret) -// { -// struct TALER_Amount spent = *off; -// struct TALER_Amount refunded; -// struct TALER_Amount deposit_fee; -// bool have_refund; - -// GNUNET_assert (GNUNET_OK == -// TALER_amount_set_zero (spent.currency, -// &refunded)); -// have_refund = false; -// for (struct DONAUDB_TransactionList *pos = tl; -// NULL != pos; -// pos = pos->next) -// { -// switch (pos->type) -// { -// case DONAUDB_TT_DEPOSIT: -// /* spent += pos->amount_with_fee */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.deposit->amount_with_fee)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// deposit_fee = pos->details.deposit->deposit_fee; -// break; -// case DONAUDB_TT_MELT: -// /* spent += pos->amount_with_fee */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.melt->amount_with_fee)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// break; -// case DONAUDB_TT_REFUND: -// /* refunded += pos->refund_amount - pos->refund_fee */ -// if (0 > -// TALER_amount_add (&refunded, -// &refunded, -// &pos->details.refund->refund_amount)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.refund->refund_fee)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// have_refund = true; -// break; -// case DONAUDB_TT_OLD_COIN_RECOUP: -// /* refunded += pos->value */ -// if (0 > -// TALER_amount_add (&refunded, -// &refunded, -// &pos->details.old_coin_recoup->value)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// break; -// case DONAUDB_TT_RECOUP: -// /* spent += pos->value */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.recoup->value)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// break; -// case DONAUDB_TT_RECOUP_REFRESH: -// /* spent += pos->value */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.recoup_refresh->value)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// break; -// case DONAUDB_TT_PURSE_DEPOSIT: -// /* spent += pos->amount_with_fee */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.purse_deposit->amount)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// deposit_fee = pos->details.purse_deposit->deposit_fee; -// break; -// case DONAUDB_TT_PURSE_REFUND: -// /* refunded += pos->refund_amount - pos->refund_fee */ -// if (0 > -// TALER_amount_add (&refunded, -// &refunded, -// &pos->details.purse_refund->refund_amount)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.purse_refund->refund_fee)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// have_refund = true; -// break; -// case DONAUDB_TT_RESERVE_OPEN: -// /* spent += pos->amount_with_fee */ -// if (0 > -// TALER_amount_add (&spent, -// &spent, -// &pos->details.reserve_open->coin_contribution)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// break; -// } -// } -// if (have_refund) -// { -// /* If we gave any refund, also discount ONE deposit fee */ -// if (0 > -// TALER_amount_add (&refunded, -// &refunded, -// &deposit_fee)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// } -// /* spent = spent - refunded */ -// if (0 > -// TALER_amount_subtract (&spent, -// &spent, -// &refunded)) -// { -// GNUNET_break (0); -// return GNUNET_SYSERR; -// } -// *ret = spent; -// return GNUNET_OK; -// } diff --git a/src/include/donaudb_plugin.h b/src/include/donaudb_plugin.h @@ -125,4 +125,165 @@ typedef void const struct DONAUDB_SignkeyMetaData *meta); +/** + * @brief The plugin API, returned from the plugin's "init" function. + * The argument given to "init" is simply a configuration handle. + */ +struct DONAUDB_Plugin +{ + + /** + * Closure for all callbacks. + */ + void *cls; + + /** + * Name of the library which generated this plugin. Set by the + * plugin loader. + */ + char *library_name; + + + /** + * Drop the Taler tables. This should only be used in testcases. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure + */ + enum GNUNET_GenericReturnValue + (*drop_tables)(void *cls); + + /** + * Create the necessary tables if they are not present + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param support_partitions true to enable partitioning support (disables foreign key constraints) + * @param num_partitions number of partitions to create, + * (0 to not actually use partitions, 1 to only + * setup a default partition, >1 for real partitions) + * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure + */ + enum GNUNET_GenericReturnValue + (*create_tables)(void *cls, + bool support_partitions, + uint32_t num_partitions); + + + /** + * Start a transaction. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param name unique name identifying the transaction (for debugging), + * must point to a constant + * @return #GNUNET_OK on success + */ + enum GNUNET_GenericReturnValue + (*start)(void *cls, + const char *name); + + + /** + * Start a READ COMMITTED transaction. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @param name unique name identifying the transaction (for debugging) + * must point to a constant + * @return #GNUNET_OK on success + */ + enum GNUNET_GenericReturnValue + (*start_read_committed)(void *cls, + const char *name); + + /** + * Start a READ ONLY serializable transaction. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @param name unique name identifying the transaction (for debugging) + * must point to a constant + * @return #GNUNET_OK on success + */ + enum GNUNET_GenericReturnValue + (*start_read_only)(void *cls, + const char *name); + + + /** + * Commit a transaction. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @return transaction status + */ + enum GNUNET_DB_QueryStatus + (*commit)(void *cls); + + + /** + * Do a pre-flight check that we are not in an uncommitted transaction. + * If we are, try to commit the previous transaction and output a warning. + * Does not return anything, as we will continue regardless of the outcome. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @return #GNUNET_OK if everything is fine + * #GNUNET_NO if a transaction was rolled back + * #GNUNET_SYSERR on hard errors + */ + enum GNUNET_GenericReturnValue + (*preflight)(void *cls); + + + /** + * Abort/rollback a transaction. + * + * @param cls the @e cls of this struct with the plugin-specific state + */ + void + (*rollback) (void *cls); + + + /** + * Register callback to be invoked on events of type @a es. + * + * @param cls database context to use + * @param timeout how long to wait at most + * @param es specification of the event to listen for + * @param cb function to call when the event happens, possibly + * multiple times (until cancel is invoked) + * @param cb_cls closure for @a cb + * @return handle useful to cancel the listener + */ + struct GNUNET_DB_EventHandler * + (*event_listen)(void *cls, + struct GNUNET_TIME_Relative timeout, + const struct GNUNET_DB_EventHeaderP *es, + GNUNET_DB_EventCallback cb, + void *cb_cls); + + /** + * Stop notifications. + * + * @param cls database context to use + * @param eh handle to unregister. + */ + void + (*event_listen_cancel)(void *cls, + struct GNUNET_DB_EventHandler *eh); + + + /** + * Notify all that listen on @a es of an event. + * + * @param cls database context to use + * @param es specification of the event to generate + * @param extra additional event data provided + * @param extra_size number of bytes in @a extra + */ + void + (*event_notify)(void *cls, + const struct GNUNET_DB_EventHeaderP *es, + const void *extra, + size_t extra_size); + +}; + + #endif