diff options
Diffstat (limited to 'src/exchangedb')
-rw-r--r-- | src/exchangedb/Makefile.am | 2 | ||||
-rw-r--r-- | src/exchangedb/pg_commit.c | 58 | ||||
-rw-r--r-- | src/exchangedb/pg_commit.h | 37 | ||||
-rw-r--r-- | src/exchangedb/pg_do_withdraw.c | 86 | ||||
-rw-r--r-- | src/exchangedb/pg_do_withdraw.h | 53 | ||||
-rw-r--r-- | src/exchangedb/pg_iterate_active_signkeys.c | 145 | ||||
-rw-r--r-- | src/exchangedb/pg_iterate_active_signkeys.h | 43 | ||||
-rw-r--r-- | src/exchangedb/plugin_exchangedb_postgres.c | 171 |
8 files changed, 439 insertions, 156 deletions
diff --git a/src/exchangedb/Makefile.am b/src/exchangedb/Makefile.am index 55d749875..55919aebf 100644 --- a/src/exchangedb/Makefile.am +++ b/src/exchangedb/Makefile.am @@ -71,6 +71,8 @@ libtaler_plugin_exchangedb_postgres_la_SOURCES = \ plugin_exchangedb_postgres.c pg_helper.h \ pg_do_reserve_open.c pg_do_reserve_open.h \ pg_do_withdraw.h pg_do_withdraw.c \ + pg_iterate_active_signkeys.h pg_iterate_active_signkeys.c \ + pg_commit.h pg_commit.c \ pg_get_coin_transactions.c pg_get_coin_transactions.h \ pg_get_expired_reserves.c pg_get_expired_reserves.h \ pg_get_purse_request.c pg_get_purse_request.h \ diff --git a/src/exchangedb/pg_commit.c b/src/exchangedb/pg_commit.c new file mode 100644 index 000000000..f1e61ee34 --- /dev/null +++ b/src/exchangedb/pg_commit.c @@ -0,0 +1,58 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_commit.c + * @brief Implementation of the commit function for Postgres + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_commit.h" +#include "pg_helper.h" + + +/** + * Commit the current transaction of a database connection. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @return final transaction status + */ +enum GNUNET_DB_QueryStatus +TEH_PG_commit (void *cls) +{ + struct PostgresClosure *pg = cls; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_end + }; + enum GNUNET_DB_QueryStatus qs; + + GNUNET_break (NULL != pg->transaction_name); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Committing transaction `%s'\n", + pg->transaction_name); + /* used in #postgres_commit */ + PREPARE (pg, + "do_commit", + "COMMIT"); + + qs = GNUNET_PQ_eval_prepared_non_select (pg->conn, + "do_commit", + params); + pg->transaction_name = NULL; + return qs; +} diff --git a/src/exchangedb/pg_commit.h b/src/exchangedb/pg_commit.h new file mode 100644 index 000000000..b1f4f9615 --- /dev/null +++ b/src/exchangedb/pg_commit.h @@ -0,0 +1,37 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_commit.h + * @brief implementation of the commit function for Postgres + * @author Christian Grothoff + */ +#ifndef PG_COMMIT_H +#define PG_COMMIT_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_exchangedb_plugin.h" + +/** + * Commit the current transaction of a database connection. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @return final transaction status + */ +enum GNUNET_DB_QueryStatus +TEH_PG_commit (void *cls); + +#endif diff --git a/src/exchangedb/pg_do_withdraw.c b/src/exchangedb/pg_do_withdraw.c new file mode 100644 index 000000000..87e4dd1d0 --- /dev/null +++ b/src/exchangedb/pg_do_withdraw.c @@ -0,0 +1,86 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_do_withdraw.c + * @brief Implementation of the do_withdraw function for Postgres + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_do_withdraw.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TEH_PG_do_withdraw ( + void *cls, + const struct TALER_CsNonce *nonce, + const struct TALER_EXCHANGEDB_CollectableBlindcoin *collectable, + struct GNUNET_TIME_Timestamp now, + bool *found, + bool *balance_ok, + bool *nonce_ok, + uint64_t *ruuid) +{ + struct PostgresClosure *pg = cls; + struct GNUNET_TIME_Timestamp gc; + struct GNUNET_PQ_QueryParam params[] = { + NULL == nonce + ? GNUNET_PQ_query_param_null () + : GNUNET_PQ_query_param_auto_from_type (nonce), + TALER_PQ_query_param_amount (&collectable->amount_with_fee), + GNUNET_PQ_query_param_auto_from_type (&collectable->denom_pub_hash), + GNUNET_PQ_query_param_auto_from_type (&collectable->reserve_pub), + GNUNET_PQ_query_param_auto_from_type (&collectable->reserve_sig), + GNUNET_PQ_query_param_auto_from_type (&collectable->h_coin_envelope), + TALER_PQ_query_param_blinded_denom_sig (&collectable->sig), + GNUNET_PQ_query_param_timestamp (&now), + GNUNET_PQ_query_param_timestamp (&gc), + GNUNET_PQ_query_param_end + }; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_bool ("reserve_found", + found), + GNUNET_PQ_result_spec_bool ("balance_ok", + balance_ok), + GNUNET_PQ_result_spec_bool ("nonce_ok", + nonce_ok), + GNUNET_PQ_result_spec_uint64 ("ruuid", + ruuid), + GNUNET_PQ_result_spec_end + }; + + PREPARE (pg, + "call_withdraw", + "SELECT " + " reserve_found" + ",balance_ok" + ",nonce_ok" + ",ruuid" + " FROM exchange_do_withdraw" + " ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10);"); + gc = GNUNET_TIME_absolute_to_timestamp ( + GNUNET_TIME_absolute_add (now.abs_time, + pg->legal_reserve_expiration_time)); + return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, + "call_withdraw", + params, + rs); +} + + diff --git a/src/exchangedb/pg_do_withdraw.h b/src/exchangedb/pg_do_withdraw.h new file mode 100644 index 000000000..406785c42 --- /dev/null +++ b/src/exchangedb/pg_do_withdraw.h @@ -0,0 +1,53 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_do_withdraw.h + * @brief implementation of the do_withdraw function for Postgres + * @author Christian Grothoff + */ +#ifndef PG_DO_WITHDRAW_H +#define PG_DO_WITHDRAW_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_exchangedb_plugin.h" + +/** + * Perform withdraw operation, checking for sufficient balance + * and possibly persisting the withdrawal details. + * + * @param cls the `struct PostgresClosure` with the plugin-specific state + * @param nonce client-contributed input for CS denominations that must be checked for idempotency, or NULL for non-CS withdrawals + * @param[in,out] collectable corresponding collectable coin (blind signature) if a coin is found; possibly updated if a (different) signature exists already + * @param now current time (rounded) + * @param[out] found set to true if the reserve was found + * @param[out] balance_ok set to true if the balance was sufficient + * @param[out] nonce_ok set to false if the nonce was reused + * @param[out] ruuid set to the reserve's UUID (reserves table row) + * @return query execution status + */ +enum GNUNET_DB_QueryStatus +TEH_PG_do_withdraw ( + void *cls, + const struct TALER_CsNonce *nonce, + const struct TALER_EXCHANGEDB_CollectableBlindcoin *collectable, + struct GNUNET_TIME_Timestamp now, + bool *found, + bool *balance_ok, + bool *nonce_ok, + uint64_t *ruuid); + +#endif diff --git a/src/exchangedb/pg_iterate_active_signkeys.c b/src/exchangedb/pg_iterate_active_signkeys.c new file mode 100644 index 000000000..b6dac230e --- /dev/null +++ b/src/exchangedb/pg_iterate_active_signkeys.c @@ -0,0 +1,145 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_iterate_active_signkeys.c + * @brief Implementation of the iterate_active_signkeys function for Postgres + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_iterate_active_signkeys.h" +#include "pg_helper.h" + + + +/** + * Closure for #signkeys_cb_helper() + */ +struct SignkeysIteratorContext +{ + /** + * Function to call with the results. + */ + TALER_EXCHANGEDB_ActiveSignkeysCallback cb; + + /** + * Closure to pass to @e cb + */ + void *cb_cls; + +}; + + +/** + * Helper function for #postgres_iterate_active_signkeys(). + * Calls the callback with each signkey. + * + * @param cls a `struct SignkeysIteratorContext` + * @param result db results + * @param num_results number of results in @a result + */ +static void +signkeys_cb_helper (void *cls, + PGresult *result, + unsigned int num_results) +{ + struct SignkeysIteratorContext *dic = cls; + + for (unsigned int i = 0; i<num_results; i++) + { + struct TALER_EXCHANGEDB_SignkeyMetaData meta; + struct TALER_ExchangePublicKeyP exchange_pub; + struct TALER_MasterSignatureP master_sig; + struct GNUNET_PQ_ResultSpec rs[] = { + GNUNET_PQ_result_spec_auto_from_type ("master_sig", + &master_sig), + GNUNET_PQ_result_spec_auto_from_type ("exchange_pub", + &exchange_pub), + GNUNET_PQ_result_spec_timestamp ("valid_from", + &meta.start), + GNUNET_PQ_result_spec_timestamp ("expire_sign", + &meta.expire_sign), + GNUNET_PQ_result_spec_timestamp ("expire_legal", + &meta.expire_legal), + GNUNET_PQ_result_spec_end + }; + + if (GNUNET_OK != + GNUNET_PQ_extract_result (result, + rs, + i)) + { + GNUNET_break (0); + return; + } + dic->cb (dic->cb_cls, + &exchange_pub, + &meta, + &master_sig); + } +} + + +/** + * Function called to invoke @a cb on every non-revoked exchange signing key + * that has been signed by the master key. Revoked and (for signing!) + * expired keys are skipped. Runs in its own read-only transaction. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param cb function to call on each signing key + * @param cb_cls closure for @a cb + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TEH_PG_iterate_active_signkeys (void *cls, + TALER_EXCHANGEDB_ActiveSignkeysCallback cb, + void *cb_cls) +{ + struct PostgresClosure *pg = cls; + struct GNUNET_TIME_Absolute now = {0}; + struct GNUNET_PQ_QueryParam params[] = { + GNUNET_PQ_query_param_absolute_time (&now), + GNUNET_PQ_query_param_end + }; + struct SignkeysIteratorContext dic = { + .cb = cb, + .cb_cls = cb_cls, + }; + + PREPARE (pg, + "select_signkeys", + "SELECT" + " master_sig" + ",exchange_pub" + ",valid_from" + ",expire_sign" + ",expire_legal" + " FROM exchange_sign_keys esk" + " WHERE" + " expire_sign > $1" + " AND NOT EXISTS " + " (SELECT esk_serial " + " FROM signkey_revocations skr" + " WHERE esk.esk_serial = skr.esk_serial);"); + now = GNUNET_TIME_absolute_get (); + return GNUNET_PQ_eval_prepared_multi_select (pg->conn, + "select_signkeys", + params, + &signkeys_cb_helper, + &dic); +} diff --git a/src/exchangedb/pg_iterate_active_signkeys.h b/src/exchangedb/pg_iterate_active_signkeys.h new file mode 100644 index 000000000..b99dfa8df --- /dev/null +++ b/src/exchangedb/pg_iterate_active_signkeys.h @@ -0,0 +1,43 @@ +/* + This file is part of TALER + Copyright (C) 2022 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 <http://www.gnu.org/licenses/> + */ +/** + * @file exchangedb/pg_iterate_active_signkeys.h + * @brief implementation of the iterate_active_signkeys function for Postgres + * @author Christian Grothoff + */ +#ifndef PG_ITERATE_ACTIVE_SIGNKEYS_H +#define PG_ITERATE_ACTIVE_SIGNKEYS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_exchangedb_plugin.h" + +/** + * Function called to invoke @a cb on every non-revoked exchange signing key + * that has been signed by the master key. Revoked and (for signing!) + * expired keys are skipped. Runs in its own read-only transaction. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param cb function to call on each signing key + * @param cb_cls closure for @a cb + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TEH_PG_iterate_active_signkeys (void *cls, + TALER_EXCHANGEDB_ActiveSignkeysCallback cb, + void *cb_cls); + +#endif diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index e28db9dbe..35bd9903e 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -62,6 +62,9 @@ /**WHAT I ADD**/ #include "pg_insert_purse_request.h" +#include "pg_iterate_active_signkeys.h" + +#include "pg_commit.h" /** @@ -427,22 +430,7 @@ prepare_statements (struct PostgresClosure *pg) " FROM denominations" " LEFT JOIN " " denomination_revocations USING (denominations_serial);"), - /* Used in #postgres_iterate_active_signkeys() */ - GNUNET_PQ_make_prepare ( - "select_signkeys", - "SELECT" - " master_sig" - ",exchange_pub" - ",valid_from" - ",expire_sign" - ",expire_legal" - " FROM exchange_sign_keys esk" - " WHERE" - " expire_sign > $1" - " AND NOT EXISTS " - " (SELECT esk_serial " - " FROM signkey_revocations skr" - " WHERE esk.esk_serial = skr.esk_serial);"), + /* Used in #postgres_iterate_auditor_denominations() */ GNUNET_PQ_make_prepare ( "select_auditor_denoms", @@ -1952,11 +1940,7 @@ prepare_statements (struct PostgresClosure *pg) " FROM global_fee" " WHERE end_date > $1" " AND start_date < $2;"), - /* used in #postgres_commit */ - GNUNET_PQ_make_prepare ( - "do_commit", - "COMMIT"), - /* Used in #postgres_begin_shard() */ + /* Used in #postgres_begin_shard() */ GNUNET_PQ_make_prepare ( "get_open_shard", "SELECT" @@ -2591,31 +2575,6 @@ postgres_rollback (void *cls) } -/** - * Commit the current transaction of a database connection. - * - * @param cls the `struct PostgresClosure` with the plugin-specific state - * @return final transaction status - */ -static enum GNUNET_DB_QueryStatus -postgres_commit (void *cls) -{ - struct PostgresClosure *pg = cls; - struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_end - }; - enum GNUNET_DB_QueryStatus qs; - - GNUNET_break (NULL != pg->transaction_name); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Committing transaction `%s'\n", - pg->transaction_name); - qs = GNUNET_PQ_eval_prepared_non_select (pg->conn, - "do_commit", - params); - pg->transaction_name = NULL; - return qs; -} /** @@ -3073,109 +3032,6 @@ postgres_iterate_denominations (void *cls, /** - * Closure for #signkeys_cb_helper() - */ -struct SignkeysIteratorContext -{ - /** - * Function to call with the results. - */ - TALER_EXCHANGEDB_ActiveSignkeysCallback cb; - - /** - * Closure to pass to @e cb - */ - void *cb_cls; - -}; - - -/** - * Helper function for #postgres_iterate_active_signkeys(). - * Calls the callback with each signkey. - * - * @param cls a `struct SignkeysIteratorContext` - * @param result db results - * @param num_results number of results in @a result - */ -static void -signkeys_cb_helper (void *cls, - PGresult *result, - unsigned int num_results) -{ - struct SignkeysIteratorContext *dic = cls; - - for (unsigned int i = 0; i<num_results; i++) - { - struct TALER_EXCHANGEDB_SignkeyMetaData meta; - struct TALER_ExchangePublicKeyP exchange_pub; - struct TALER_MasterSignatureP master_sig; - struct GNUNET_PQ_ResultSpec rs[] = { - GNUNET_PQ_result_spec_auto_from_type ("master_sig", - &master_sig), - GNUNET_PQ_result_spec_auto_from_type ("exchange_pub", - &exchange_pub), - GNUNET_PQ_result_spec_timestamp ("valid_from", - &meta.start), - GNUNET_PQ_result_spec_timestamp ("expire_sign", - &meta.expire_sign), - GNUNET_PQ_result_spec_timestamp ("expire_legal", - &meta.expire_legal), - GNUNET_PQ_result_spec_end - }; - - if (GNUNET_OK != - GNUNET_PQ_extract_result (result, - rs, - i)) - { - GNUNET_break (0); - return; - } - dic->cb (dic->cb_cls, - &exchange_pub, - &meta, - &master_sig); - } -} - - -/** - * Function called to invoke @a cb on every non-revoked exchange signing key - * that has been signed by the master key. Revoked and (for signing!) - * expired keys are skipped. Runs in its own read-only transaction. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param cb function to call on each signing key - * @param cb_cls closure for @a cb - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_iterate_active_signkeys (void *cls, - TALER_EXCHANGEDB_ActiveSignkeysCallback cb, - void *cb_cls) -{ - struct PostgresClosure *pg = cls; - struct GNUNET_TIME_Absolute now = {0}; - struct GNUNET_PQ_QueryParam params[] = { - GNUNET_PQ_query_param_absolute_time (&now), - GNUNET_PQ_query_param_end - }; - struct SignkeysIteratorContext dic = { - .cb = cb, - .cb_cls = cb_cls, - }; - - now = GNUNET_TIME_absolute_get (); - return GNUNET_PQ_eval_prepared_multi_select (pg->conn, - "select_signkeys", - params, - &signkeys_cb_helper, - &dic); -} - - -/** * Closure for #auditors_cb_helper() */ struct AuditorsIteratorContext @@ -3677,7 +3533,7 @@ postgres_reserves_in_insert (void *cls, (We are only run in a larger transaction for performance.) */ enum GNUNET_DB_QueryStatus cs; - cs = postgres_commit (pg); + cs = TEH_PG_commit(pg); if (cs < 0) return cs; if (GNUNET_OK != @@ -3758,7 +3614,7 @@ postgres_reserves_in_insert (void *cls, { enum GNUNET_DB_QueryStatus cs; - cs = postgres_commit (pg); + cs = TEH_PG_commit (pg); if (cs < 0) return cs; if (GNUNET_OK != @@ -9986,7 +9842,7 @@ commit: { enum GNUNET_DB_QueryStatus qs; - qs = postgres_commit (pg); + qs = TEH_PG_commit (pg); switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: @@ -10256,7 +10112,7 @@ postgres_begin_revolving_shard (void *cls, { enum GNUNET_DB_QueryStatus qs; - qs = postgres_commit (pg); + qs = TEH_PG_commit (pg); switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: @@ -12008,7 +11864,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) plugin->start = &postgres_start; plugin->start_read_committed = &postgres_start_read_committed; plugin->start_read_only = &postgres_start_read_only; - plugin->commit = &postgres_commit; + plugin->preflight = &postgres_preflight; plugin->rollback = &postgres_rollback; plugin->event_listen = &postgres_event_listen; @@ -12018,7 +11874,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) plugin->get_denomination_info = &postgres_get_denomination_info; plugin->iterate_denomination_info = &postgres_iterate_denomination_info; plugin->iterate_denominations = &postgres_iterate_denominations; - plugin->iterate_active_signkeys = &postgres_iterate_active_signkeys; + plugin->iterate_active_auditors = &postgres_iterate_active_auditors; plugin->iterate_auditor_denominations = &postgres_iterate_auditor_denominations; @@ -12280,7 +12136,10 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) = &TEH_PG_select_reserve_open_above_serial_id; plugin->insert_purse_request = &TEH_PG_insert_purse_request; - + plugin->iterate_active_signkeys + = &TEH_PG_iterate_active_signkeys; + plugin->commit + = &TEH_PG_commit; return plugin; } |