diff options
Diffstat (limited to 'src/auditordb')
104 files changed, 6109 insertions, 2790 deletions
diff --git a/src/auditordb/Makefile.am b/src/auditordb/Makefile.am index eef79256..7ca168d0 100644 --- a/src/auditordb/Makefile.am +++ b/src/auditordb/Makefile.am @@ -33,7 +33,57 @@ plugin_LTLIBRARIES = \  endif  libtaler_plugin_auditordb_postgres_la_SOURCES = \ -  plugin_auditordb_postgres.c +  plugin_auditordb_postgres.c pg_helper.h \ +  pg_insert_auditor_progress_reserve.h pg_insert_auditor_progress_reserve.c \ +  pg_update_auditor_progress_reserve.h pg_update_auditor_progress_reserve.c \ +  pg_get_auditor_progress_reserve.h pg_get_auditor_progress_reserve.c \ +  pg_insert_auditor_progress_purse.h pg_insert_auditor_progress_purse.c \ +  pg_update_auditor_progress_purse.h pg_update_auditor_progress_purse.c \ +  pg_get_auditor_progress_purse.h pg_get_auditor_progress_purse.c \ +  pg_insert_auditor_progress_aggregation.h pg_insert_auditor_progress_aggregation.c \ +  pg_update_auditor_progress_aggregation.h pg_update_auditor_progress_aggregation.c \ +  pg_get_auditor_progress_aggregation.h pg_get_auditor_progress_aggregation.c \ +  pg_insert_auditor_progress_deposit_confirmation.h pg_insert_auditor_progress_deposit_confirmation.c \ +  pg_update_auditor_progress_deposit_confirmation.h pg_update_auditor_progress_deposit_confirmation.c \ +  pg_get_auditor_progress_deposit_confirmation.h pg_get_auditor_progress_deposit_confirmation.c \ +  pg_insert_auditor_progress_coin.h pg_insert_auditor_progress_coin.c \ +  pg_update_auditor_progress_coin.h pg_update_auditor_progress_coin.c \ +  pg_get_auditor_progress_coin.h pg_get_auditor_progress_coin.c \ +  pg_insert_wire_auditor_account_progress.h pg_insert_wire_auditor_account_progress.c \ +  pg_update_wire_auditor_account_progress.h pg_update_wire_auditor_account_progress.c \ +  pg_get_wire_auditor_account_progress.h pg_get_wire_auditor_account_progress.c \ +  pg_insert_wire_auditor_progress.h pg_insert_wire_auditor_progress.c \ +  pg_update_wire_auditor_progress.h pg_update_wire_auditor_progress.c \ +  pg_get_wire_auditor_progress.h pg_get_wire_auditor_progress.c \ +  pg_insert_reserve_info.h pg_insert_reserve_info.c \ +  pg_update_reserve_info.h pg_update_reserve_info.c \ +  pg_del_reserve_info.h pg_del_reserve_info.c \ +  pg_get_reserve_info.h pg_get_reserve_info.c \ +  pg_insert_reserve_summary.h pg_insert_reserve_summary.c \ +  pg_update_reserve_summary.h pg_update_reserve_summary.c \ +  pg_get_reserve_summary.h pg_get_reserve_summary.c \ +  pg_insert_wire_fee_summary.h pg_insert_wire_fee_summary.c \ +  pg_update_wire_fee_summary.h pg_update_wire_fee_summary.c \ +  pg_get_wire_fee_summary.h pg_get_wire_fee_summary.c \ +  pg_insert_denomination_balance.h pg_insert_denomination_balance.c \ +  pg_update_denomination_balance.h pg_update_denomination_balance.c \ +  pg_get_denomination_balance.h pg_get_denomination_balance.c \ +  pg_insert_balance_summary.h pg_insert_balance_summary.c \ +  pg_update_balance_summary.h pg_update_balance_summary.c \ +  pg_get_balance_summary.h pg_get_balance_summary.c \ +  pg_insert_historic_denom_revenue.h pg_insert_historic_denom_revenue.c \ +  pg_select_historic_denom_revenue.h pg_select_historic_denom_revenue.c \ +  pg_insert_historic_reserve_revenue.h pg_insert_historic_reserve_revenue.c \ +  pg_select_historic_reserve_revenue.h pg_select_historic_reserve_revenue.c \ +  pg_insert_predicted_result.h pg_insert_predicted_result.c \ +  pg_update_predicted_result.h pg_update_predicted_result.c \ +  pg_get_predicted_balance.h pg_get_predicted_balance.c \ +  pg_insert_exchange.h pg_insert_exchange.c \ +  pg_list_exchanges.h pg_list_exchanges.c \ +  pg_delete_exchange.h pg_delete_exchange.c \ +  pg_insert_exchange_signkey.h pg_insert_exchange_signkey.c \ +  pg_insert_deposit_confirmation.h pg_insert_deposit_confirmation.c \ +  pg_get_deposit_confirmations.h pg_get_deposit_confirmations.c  libtaler_plugin_auditordb_postgres_la_LIBADD = \    $(LTLIBINTL)  libtaler_plugin_auditordb_postgres_la_LDFLAGS = \ diff --git a/src/auditordb/hdr.h b/src/auditordb/hdr.h new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/auditordb/hdr.h diff --git a/src/auditordb/pg_del_reserve_info.c b/src/auditordb/pg_del_reserve_info.c new file mode 100644 index 00000000..81db98df --- /dev/null +++ b/src/auditordb/pg_del_reserve_info.c @@ -0,0 +1,50 @@ +/* +   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 pg_del_reserve_info.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_del_reserve_info.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_del_reserve_info (void *cls, +                         const struct TALER_ReservePublicKeyP *reserve_pub, +                         const struct TALER_MasterPublicKeyP *master_pub) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_reserves_delete", +           "DELETE" +           " FROM auditor_reserves" +           " WHERE reserve_pub=$1" +           " AND master_pub=$2;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_reserves_delete", +                                             params); +} diff --git a/src/auditordb/pg_del_reserve_info.h b/src/auditordb/pg_del_reserve_info.h new file mode 100644 index 00000000..1bed879d --- /dev/null +++ b/src/auditordb/pg_del_reserve_info.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 pg_del_reserve_info.h + * @brief implementation of the del_reserve_info function + * @author Christian Grothoff + */ +#ifndef PG_DEL_RESERVE_INFO_H +#define PG_DEL_RESERVE_INFO_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Delete information about a reserve. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param reserve_pub public key of the reserve + * @param master_pub master public key of the exchange + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_del_reserve_info (void *cls, +                         const struct TALER_ReservePublicKeyP *reserve_pub, +                         const struct TALER_MasterPublicKeyP *master_pub); + + +#endif diff --git a/src/auditordb/pg_delete_exchange.c b/src/auditordb/pg_delete_exchange.c new file mode 100644 index 00000000..9415335c --- /dev/null +++ b/src/auditordb/pg_delete_exchange.c @@ -0,0 +1,47 @@ +/* +   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 pg_delete_exchange.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_delete_exchange.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_delete_exchange (void *cls, +                        const struct TALER_MasterPublicKeyP *master_pub) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_delete_exchange", +           "DELETE" +           " FROM auditor_exchanges" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_delete_exchange", +                                             params); +} diff --git a/src/auditordb/pg_delete_exchange.h b/src/auditordb/pg_delete_exchange.h new file mode 100644 index 00000000..4b639a62 --- /dev/null +++ b/src/auditordb/pg_delete_exchange.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 pg_delete_exchange.h + * @brief implementation of the delete_exchange function + * @author Christian Grothoff + */ +#ifndef PG_DELETE_EXCHANGE_H +#define PG_DELETE_EXCHANGE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Delete an exchange from the list of exchanges this auditor is auditing. + * Warning: this will cascade and delete all knowledge of this auditor related + * to this exchange! + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_delete_exchange (void *cls, +                        const struct TALER_MasterPublicKeyP *master_pub); + + +#endif diff --git a/src/auditordb/pg_get_auditor_progress_aggregation.c b/src/auditordb/pg_get_auditor_progress_aggregation.c new file mode 100644 index 00000000..a9f89d07 --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_aggregation.c @@ -0,0 +1,56 @@ +/* +   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 pg_get_auditor_progress_aggregation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_auditor_progress_aggregation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_wire_out_serial_id", +                                  &ppa->last_wire_out_serial_id), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_progress_select_aggregation", +           "SELECT" +           " last_wire_out_serial_id" +           " FROM auditor_progress_aggregation" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_progress_select_aggregation", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_auditor_progress_aggregation.h b/src/auditordb/pg_get_auditor_progress_aggregation.h new file mode 100644 index 00000000..b20a00ad --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_aggregation.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 pg_get_auditor_progress_aggregation.h + * @brief implementation of the get_auditor_progress_aggregation function + * @author Christian Grothoff + */ +#ifndef PG_GET_AUDITOR_PROGRESS_AGGREGATION_H +#define PG_GET_AUDITOR_PROGRESS_AGGREGATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] ppa set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointAggregation *ppa); + +#endif diff --git a/src/auditordb/pg_get_auditor_progress_coin.c b/src/auditordb/pg_get_auditor_progress_coin.c new file mode 100644 index 00000000..a160f1cc --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_coin.c @@ -0,0 +1,77 @@ +/* +   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 pg_get_auditor_progress_coin.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_auditor_progress_coin.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_withdraw_serial_id", +                                  &ppc->last_withdraw_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_deposit_serial_id", +                                  &ppc->last_deposit_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_melt_serial_id", +                                  &ppc->last_melt_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id", +                                  &ppc->last_refund_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_recoup_serial_id", +                                  &ppc->last_recoup_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_recoup_refresh_serial_id", +                                  &ppc->last_recoup_refresh_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_deposits_serial_id", +                                  &ppc->last_purse_deposits_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", +                                  &ppc->last_purse_refunds_serial_id), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_progress_select_coin", +           "SELECT" +           " last_withdraw_serial_id" +           ",last_deposit_serial_id" +           ",last_melt_serial_id" +           ",last_refund_serial_id" +           ",last_recoup_serial_id" +           ",last_recoup_refresh_serial_id" +           ",last_purse_deposits_serial_id" +           ",last_purse_decision_serial_id" +           " FROM auditor_progress_coin" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_progress_select_coin", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_auditor_progress_coin.h b/src/auditordb/pg_get_auditor_progress_coin.h new file mode 100644 index 00000000..46f997b3 --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_coin.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 pg_get_auditor_progress_coin.h + * @brief implementation of the get_auditor_progress_coin function + * @author Christian Grothoff + */ +#ifndef PG_GET_AUDITOR_PROGRESS_COIN_H +#define PG_GET_AUDITOR_PROGRESS_COIN_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] ppc set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointCoin *ppc); + +#endif diff --git a/src/auditordb/pg_get_auditor_progress_deposit_confirmation.c b/src/auditordb/pg_get_auditor_progress_deposit_confirmation.c new file mode 100644 index 00000000..f69f4a69 --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_deposit_confirmation.c @@ -0,0 +1,56 @@ +/* +   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 pg_get_auditor_progress_deposit_confirmation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_auditor_progress_deposit_confirmation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_deposit_confirmation_serial_id", +                                  &ppdc->last_deposit_confirmation_serial_id), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_progress_select_deposit_confirmation", +           "SELECT" +           " last_deposit_confirmation_serial_id" +           " FROM auditor_progress_deposit_confirmation" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_progress_select_deposit_confirmation", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_auditor_progress_deposit_confirmation.h b/src/auditordb/pg_get_auditor_progress_deposit_confirmation.h new file mode 100644 index 00000000..3b558d0c --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_deposit_confirmation.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 pg_get_auditor_progress_deposit_confirmation.h + * @brief implementation of the get_auditor_progress_deposit_confirmation function + * @author Christian Grothoff + */ +#ifndef PG_GET_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H +#define PG_GET_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] ppdc set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc); + +#endif diff --git a/src/auditordb/pg_get_auditor_progress_purse.c b/src/auditordb/pg_get_auditor_progress_purse.c new file mode 100644 index 00000000..de8628ce --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_purse.c @@ -0,0 +1,68 @@ +/* +   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 pg_get_auditor_progress_purse.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_auditor_progress_purse.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointPurse *ppp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_purse_request_serial_id", +                                  &ppp->last_purse_request_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", +                                  &ppp->last_purse_decision_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_merges_serial_id", +                                  &ppp->last_purse_merge_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_account_merges_serial_id", +                                  &ppp->last_account_merge_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_deposits_serial_id", +                                  &ppp->last_purse_deposits_serial_id), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_progress_select_purse", +           "SELECT" +           " last_purse_request_serial_id" +           ",last_purse_decision_serial_id" +           ",last_purse_merges_serial_id" +           ",last_account_merges_serial_id" +           ",last_purse_deposits_serial_id" +           " FROM auditor_progress_purse" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_progress_select_purse", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_auditor_progress_purse.h b/src/auditordb/pg_get_auditor_progress_purse.h new file mode 100644 index 00000000..db8d48e8 --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_purse.h @@ -0,0 +1,44 @@ +/* +   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 pg_get_auditor_progress_purse.h + * @brief implementation of the get_auditor_progress_purse function + * @author Christian Grothoff + */ +#ifndef PG_GET_AUDITOR_PROGRESS_PURSE_H +#define PG_GET_AUDITOR_PROGRESS_PURSE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] ppp set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointPurse *ppp); + + +#endif diff --git a/src/auditordb/pg_get_auditor_progress_reserve.c b/src/auditordb/pg_get_auditor_progress_reserve.c new file mode 100644 index 00000000..90923a0f --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_reserve.c @@ -0,0 +1,77 @@ +/* +   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 pg_get_auditor_progress_reserve.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_auditor_progress_reserve.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointReserve *ppr) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_reserve_in_serial_id", +                                  &ppr->last_reserve_in_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", +                                  &ppr->last_reserve_out_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_recoup_serial_id", +                                  &ppr->last_reserve_recoup_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_open_serial_id", +                                  &ppr->last_reserve_open_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_close_serial_id", +                                  &ppr->last_reserve_close_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", +                                  &ppr->last_purse_decisions_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_account_merges_serial_id", +                                  &ppr->last_account_merges_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_history_requests_serial_id", +                                  &ppr->last_history_requests_serial_id), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_progress_select_reserve", +           "SELECT" +           " last_reserve_in_serial_id" +           ",last_reserve_out_serial_id" +           ",last_reserve_recoup_serial_id" +           ",last_reserve_close_serial_id" +           ",last_purse_decision_serial_id" +           ",last_account_merges_serial_id" +           ",last_history_requests_serial_id" +           ",last_reserve_open_serial_id" +           " FROM auditor_progress_reserve" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_progress_select_reserve", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_auditor_progress_reserve.h b/src/auditordb/pg_get_auditor_progress_reserve.h new file mode 100644 index 00000000..6b9cfabe --- /dev/null +++ b/src/auditordb/pg_get_auditor_progress_reserve.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 pg_get_auditor_progress_reserve.h + * @brief implementation of the get_auditor_progress_reserve function + * @author Christian Grothoff + */ +#ifndef PG_GET_AUDITOR_PROGRESS_RESERVE_H +#define PG_GET_AUDITOR_PROGRESS_RESERVE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] ppr set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_ProgressPointReserve *ppr); + +#endif diff --git a/src/auditordb/pg_get_balance_summary.c b/src/auditordb/pg_get_balance_summary.c new file mode 100644 index 00000000..a8ba733b --- /dev/null +++ b/src/auditordb/pg_get_balance_summary.c @@ -0,0 +1,89 @@ +/* +   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 pg_get_balance_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_balance_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_GlobalCoinBalance *dfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", +                                 &dfb->total_escrowed), +    TALER_PQ_RESULT_SPEC_AMOUNT ("deposit_fee_balance", +                                 &dfb->deposit_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("melt_fee_balance", +                                 &dfb->melt_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("refund_fee_balance", +                                 &dfb->refund_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", +                                 &dfb->purse_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("open_deposit_fee_balance", +                                 &dfb->open_deposit_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("risk", +                                 &dfb->risk), +    TALER_PQ_RESULT_SPEC_AMOUNT ("loss", +                                 &dfb->loss), +    TALER_PQ_RESULT_SPEC_AMOUNT ("irregular_loss", +                                 &dfb->irregular_loss), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_balance_summary_select", +           "SELECT" +           " denom_balance_val" +           ",denom_balance_frac" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_deposit_fee_balance_val" +           ",open_deposit_fee_balance_frac" +           ",risk_val" +           ",risk_frac" +           ",loss_val" +           ",loss_frac" +           ",irregular_loss_val" +           ",irregular_loss_frac" +           " FROM auditor_balance_summary" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_balance_summary_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_balance_summary.h b/src/auditordb/pg_get_balance_summary.h new file mode 100644 index 00000000..1fc31109 --- /dev/null +++ b/src/auditordb/pg_get_balance_summary.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 pg_get_balance_summary.h + * @brief implementation of the get_balance_summary function + * @author Christian Grothoff + */ +#ifndef PG_GET_BALANCE_SUMMARY_H +#define PG_GET_BALANCE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about an exchange's denomination balances. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] dfb where to return the denomination balances + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_GlobalCoinBalance *dfb); + +#endif diff --git a/src/auditordb/pg_get_denomination_balance.c b/src/auditordb/pg_get_denomination_balance.c new file mode 100644 index 00000000..10d5a4be --- /dev/null +++ b/src/auditordb/pg_get_denomination_balance.c @@ -0,0 +1,72 @@ +/* +   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 pg_get_denomination_balance.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_denomination_balance.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  struct TALER_AUDITORDB_DenominationCirculationData *dcd) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", +                                 &dcd->denom_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_loss", +                                 &dcd->denom_loss), +    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_risk", +                                 &dcd->denom_risk), +    TALER_PQ_RESULT_SPEC_AMOUNT ("recoup_loss", +                                 &dcd->recoup_loss), +    GNUNET_PQ_result_spec_uint64 ("num_issued", +                                  &dcd->num_issued), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_denomination_pending_select", +           "SELECT" +           " denom_balance_val" +           ",denom_balance_frac" +           ",denom_loss_val" +           ",denom_loss_frac" +           ",num_issued" +           ",denom_risk_val" +           ",denom_risk_frac" +           ",recoup_loss_val" +           ",recoup_loss_frac" +           " FROM auditor_denomination_pending" +           " WHERE denom_pub_hash=$1"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_denomination_pending_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_denomination_balance.h b/src/auditordb/pg_get_denomination_balance.h new file mode 100644 index 00000000..31f37706 --- /dev/null +++ b/src/auditordb/pg_get_denomination_balance.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 pg_get_denomination_balance.h + * @brief implementation of the get_denomination_balance function + * @author Christian Grothoff + */ +#ifndef PG_GET_DENOMINATION_BALANCE_H +#define PG_GET_DENOMINATION_BALANCE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about a denomination key's balances. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param denom_pub_hash hash of the denomination public key + * @param[out] dcd circulation data to initialize + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  struct TALER_AUDITORDB_DenominationCirculationData *dcd); + +#endif diff --git a/src/auditordb/pg_get_deposit_confirmations.c b/src/auditordb/pg_get_deposit_confirmations.c new file mode 100644 index 00000000..ed8a60fb --- /dev/null +++ b/src/auditordb/pg_get_deposit_confirmations.c @@ -0,0 +1,185 @@ +/* +   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 pg_get_deposit_confirmations.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_deposit_confirmations.h" +#include "pg_helper.h" + + +/** + * Closure for #deposit_confirmation_cb(). + */ +struct DepositConfirmationContext +{ + +  /** +   * Master public key that is being used. +   */ +  const struct TALER_MasterPublicKeyP *master_pub; + +  /** +   * Function to call for each deposit confirmation. +   */ +  TALER_AUDITORDB_DepositConfirmationCallback cb; + +  /** +   * Closure for @e cb +   */ +  void *cb_cls; + +  /** +   * Plugin context. +   */ +  struct PostgresClosure *pg; + +  /** +   * Query status to return. +   */ +  enum GNUNET_DB_QueryStatus qs; +}; + + +/** + * Helper function for #postgres_get_deposit_confirmations(). + * To be called with the results of a SELECT statement + * that has returned @a num_results results. + * + * @param cls closure of type `struct DepositConfirmationContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +deposit_confirmation_cb (void *cls, +                         PGresult *result, +                         unsigned int num_results) +{ +  struct DepositConfirmationContext *dcc = cls; +  struct PostgresClosure *pg = dcc->pg; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    uint64_t serial_id; +    struct TALER_AUDITORDB_DepositConfirmation dc = { +      .master_public_key = *dcc->master_pub +    }; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_uint64 ("serial_id", +                                    &serial_id), +      GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", +                                            &dc.h_contract_terms), +      GNUNET_PQ_result_spec_auto_from_type ("h_extensions", +                                            &dc.h_extensions), +      GNUNET_PQ_result_spec_auto_from_type ("h_wire", +                                            &dc.h_wire), +      GNUNET_PQ_result_spec_timestamp ("exchange_timestamp", +                                       &dc.exchange_timestamp), +      GNUNET_PQ_result_spec_timestamp ("refund_deadline", +                                       &dc.refund_deadline), +      GNUNET_PQ_result_spec_timestamp ("wire_deadline", +                                       &dc.wire_deadline), +      TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee", +                                   &dc.amount_without_fee), +      GNUNET_PQ_result_spec_auto_from_type ("coin_pub", +                                            &dc.coin_pub), +      GNUNET_PQ_result_spec_auto_from_type ("merchant_pub", +                                            &dc.merchant), +      GNUNET_PQ_result_spec_auto_from_type ("exchange_sig", +                                            &dc.exchange_sig), +      GNUNET_PQ_result_spec_auto_from_type ("exchange_pub", +                                            &dc.exchange_pub), +      GNUNET_PQ_result_spec_auto_from_type ("master_sig", +                                            &dc.master_sig), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      dcc->qs = GNUNET_DB_STATUS_HARD_ERROR; +      return; +    } +    dcc->qs = i + 1; +    if (GNUNET_OK != +        dcc->cb (dcc->cb_cls, +                 serial_id, +                 &dc)) +      break; +  } +} + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_deposit_confirmations ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_public_key, +  uint64_t start_id, +  TALER_AUDITORDB_DepositConfirmationCallback cb, +  void *cb_cls) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_public_key), +    GNUNET_PQ_query_param_uint64 (&start_id), +    GNUNET_PQ_query_param_end +  }; +  struct DepositConfirmationContext dcc = { +    .master_pub = master_public_key, +    .cb = cb, +    .cb_cls = cb_cls, +    .pg = pg +  }; +  enum GNUNET_DB_QueryStatus qs; + +  PREPARE (pg, +           "auditor_deposit_confirmation_select", +           "SELECT" +           " serial_id" +           ",h_contract_terms" +           ",h_extensions" +           ",h_wire" +           ",exchange_timestamp" +           ",wire_deadline" +           ",refund_deadline" +           ",amount_without_fee_val" +           ",amount_without_fee_frac" +           ",coin_pub" +           ",merchant_pub" +           ",exchange_sig" +           ",exchange_pub" +           ",master_sig"                  /* master_sig could be normalized... */ +           " FROM deposit_confirmations" +           " WHERE master_pub=$1" +           " AND serial_id>$2"); +  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, +                                             "auditor_deposit_confirmation_select", +                                             params, +                                             &deposit_confirmation_cb, +                                             &dcc); +  if (qs > 0) +    return dcc.qs; +  GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs); +  return qs; +} diff --git a/src/auditordb/pg_get_deposit_confirmations.h b/src/auditordb/pg_get_deposit_confirmations.h new file mode 100644 index 00000000..48ee7063 --- /dev/null +++ b/src/auditordb/pg_get_deposit_confirmations.h @@ -0,0 +1,48 @@ +/* +   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 pg_get_deposit_confirmations.h + * @brief implementation of the get_deposit_confirmations function + * @author Christian Grothoff + */ +#ifndef PG_GET_DEPOSIT_CONFIRMATIONS_H +#define PG_GET_DEPOSIT_CONFIRMATIONS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about deposit confirmations from the database. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_public_key for which exchange do we want to get deposit confirmations + * @param start_id row/serial ID where to start the iteration (0 from + *                  the start, exclusive, i.e. serial_ids must start from 1) + * @param cb function to call with results + * @param cb_cls closure for @a cb + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_deposit_confirmations ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_public_key, +  uint64_t start_id, +  TALER_AUDITORDB_DepositConfirmationCallback cb, +  void *cb_cls); + +#endif diff --git a/src/auditordb/pg_get_predicted_balance.c b/src/auditordb/pg_get_predicted_balance.c new file mode 100644 index 00000000..07d1faae --- /dev/null +++ b/src/auditordb/pg_get_predicted_balance.c @@ -0,0 +1,61 @@ +/* +   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 pg_get_predicted_balance.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_predicted_balance.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_predicted_balance (void *cls, +                              const struct TALER_MasterPublicKeyP *master_pub, +                              struct TALER_Amount *balance, +                              struct TALER_Amount *drained) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("balance", +                                 balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("drained", +                                 drained), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_predicted_result_select", +           "SELECT" +           " balance_val" +           ",balance_frac" +           ",drained_val" +           ",drained_frac" +           " FROM auditor_predicted_result" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_predicted_result_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_predicted_balance.h b/src/auditordb/pg_get_predicted_balance.h new file mode 100644 index 00000000..15949fd9 --- /dev/null +++ b/src/auditordb/pg_get_predicted_balance.h @@ -0,0 +1,44 @@ +/* +   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 pg_get_predicted_.h + * @brief implementation of the get_predicted_ function + * @author Christian Grothoff + */ +#ifndef PG_GET_PREDICTED__H +#define PG_GET_PREDICTED__H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get an exchange's predicted balance. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] balance expected bank account balance of the exchange + * @param[out] drained amount drained so far + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_predicted_balance (void *cls, +                              const struct TALER_MasterPublicKeyP *master_pub, +                              struct TALER_Amount *balance, +                              struct TALER_Amount *drained); + +#endif diff --git a/src/auditordb/pg_get_reserve_info.c b/src/auditordb/pg_get_reserve_info.c new file mode 100644 index 00000000..6beb0c8d --- /dev/null +++ b/src/auditordb/pg_get_reserve_info.c @@ -0,0 +1,97 @@ +/* +   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 pg_get_reserve_info.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_reserve_info.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_reserve_info (void *cls, +                         const struct TALER_ReservePublicKeyP *reserve_pub, +                         const struct TALER_MasterPublicKeyP *master_pub, +                         uint64_t *rowid, +                         struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +                         struct GNUNET_TIME_Timestamp *expiration_date, +                         char **sender_account) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", +                                 &rfb->reserve_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_loss", +                                 &rfb->reserve_loss), +    TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", +                                 &rfb->withdraw_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("close_fee_balance", +                                 &rfb->close_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", +                                 &rfb->purse_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("open_fee_balance", +                                 &rfb->open_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("history_fee_balance", +                                 &rfb->history_fee_balance), +    GNUNET_PQ_result_spec_timestamp ("expiration_date", +                                     expiration_date), +    GNUNET_PQ_result_spec_uint64 ("auditor_reserves_rowid", +                                  rowid), +    GNUNET_PQ_result_spec_allow_null ( +      GNUNET_PQ_result_spec_string ("origin_account", +                                    sender_account), +      NULL), +    GNUNET_PQ_result_spec_end +  }; + +  *sender_account = NULL; +  PREPARE (pg, +           "auditor_reserves_select", +           "SELECT" +           " reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_loss_val" +           ",reserve_loss_frac" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",close_fee_balance_val" +           ",close_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_fee_balance_val" +           ",open_fee_balance_frac" +           ",history_fee_balance_val" +           ",history_fee_balance_frac" +           ",expiration_date" +           ",auditor_reserves_rowid" +           ",origin_account" +           " FROM auditor_reserves" +           " WHERE reserve_pub=$1 AND master_pub=$2;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_reserves_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_reserve_info.h b/src/auditordb/pg_get_reserve_info.h new file mode 100644 index 00000000..a04d23c2 --- /dev/null +++ b/src/auditordb/pg_get_reserve_info.h @@ -0,0 +1,51 @@ +/* +   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 pg_get_reserve_info.h + * @brief implementation of the get_reserve_info function + * @author Christian Grothoff + */ +#ifndef PG_GET_RESERVE_INFO_H +#define PG_GET_RESERVE_INFO_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about a reserve. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param reserve_pub public key of the reserve + * @param master_pub master public key of the exchange + * @param[out] rowid which row did we get the information from + * @param[out] rfb where to store the reserve balance summary + * @param[out] expiration_date expiration date of the reserve + * @param[out] sender_account from where did the money in the reserve originally come from + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_reserve_info (void *cls, +                         const struct TALER_ReservePublicKeyP *reserve_pub, +                         const struct TALER_MasterPublicKeyP *master_pub, +                         uint64_t *rowid, +                         struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +                         struct GNUNET_TIME_Timestamp *expiration_date, +                         char **sender_account); + + +#endif diff --git a/src/auditordb/pg_get_reserve_summary.c b/src/auditordb/pg_get_reserve_summary.c new file mode 100644 index 00000000..225d7e6a --- /dev/null +++ b/src/auditordb/pg_get_reserve_summary.c @@ -0,0 +1,88 @@ +/* +   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 pg_get_reserve_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_reserve_summary.h" +#include "pg_helper.h" + + +/** + * Get summary information about all reserves. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param[out] rfb balances are returned here + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_reserve_summary (void *cls, +                            const struct TALER_MasterPublicKeyP *master_pub, +                            struct TALER_AUDITORDB_ReserveFeeBalance *rfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", +                                 &rfb->reserve_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_loss", +                                 &rfb->reserve_loss), +    TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", +                                 &rfb->withdraw_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("close_fee_balance", +                                 &rfb->close_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", +                                 &rfb->purse_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("open_fee_balance", +                                 &rfb->open_fee_balance), +    TALER_PQ_RESULT_SPEC_AMOUNT ("history_fee_balance", +                                 &rfb->history_fee_balance), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_reserve_balance_select", +           "SELECT" +           " reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_loss_val" +           ",reserve_loss_frac" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",close_fee_balance_val" +           ",close_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_fee_balance_val" +           ",open_fee_balance_frac" +           ",history_fee_balance_val" +           ",history_fee_balance_frac" +           " FROM auditor_reserve_balance" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_reserve_balance_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_reserve_summary.h b/src/auditordb/pg_get_reserve_summary.h new file mode 100644 index 00000000..d9a3ea5a --- /dev/null +++ b/src/auditordb/pg_get_reserve_summary.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 pg_get_reserve_summary.h + * @brief implementation of the get_reserve_summary function + * @author Christian Grothoff + */ +#ifndef PG_GET_RESERVE_SUMMARY_H +#define PG_GET_RESERVE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get summary information about all reserves. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param[out] rfb balances are returned here + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_reserve_summary (void *cls, +                            const struct TALER_MasterPublicKeyP *master_pub, +                            struct TALER_AUDITORDB_ReserveFeeBalance *rfb); + + +#endif diff --git a/src/auditordb/pg_get_wire_auditor_account_progress.c b/src/auditordb/pg_get_wire_auditor_account_progress.c new file mode 100644 index 00000000..147fffa7 --- /dev/null +++ b/src/auditordb/pg_get_wire_auditor_account_progress.c @@ -0,0 +1,68 @@ +/* +   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 pg_get_wire_auditor_account_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_wire_auditor_account_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_string (account_name), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_uint64 ("last_wire_reserve_in_serial_id", +                                  &pp->last_reserve_in_serial_id), +    GNUNET_PQ_result_spec_uint64 ("last_wire_wire_out_serial_id", +                                  &pp->last_wire_out_serial_id), +    GNUNET_PQ_result_spec_uint64 ("wire_in_off", +                                  &bapp->in_wire_off), +    GNUNET_PQ_result_spec_uint64 ("wire_out_off", +                                  &bapp->out_wire_off), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "wire_auditor_account_progress_select", +           "SELECT" +           " last_wire_reserve_in_serial_id" +           ",last_wire_wire_out_serial_id" +           ",wire_in_off" +           ",wire_out_off" +           " FROM wire_auditor_account_progress" +           " WHERE master_pub=$1 AND account_name=$2;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "wire_auditor_account_progress_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_wire_auditor_account_progress.h b/src/auditordb/pg_get_wire_auditor_account_progress.h new file mode 100644 index 00000000..ab1d2bb9 --- /dev/null +++ b/src/auditordb/pg_get_wire_auditor_account_progress.h @@ -0,0 +1,48 @@ +/* +   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 pg_get_wire_auditor_account_progress.h + * @brief implementation of the get_wire_auditor_account_progress function + * @author Christian Grothoff + */ +#ifndef PG_GET_WIRE_AUDITOR_ACCOUNT_PROGRESS_H +#define PG_GET_WIRE_AUDITOR_ACCOUNT_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param account_name name of the wire account we are auditing + * @param[out] pp where is the auditor in processing + * @param[out] bapp how far are we in the wire transaction histories + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  struct TALER_AUDITORDB_BankAccountProgressPoint *bapp); + + +#endif diff --git a/src/auditordb/pg_get_wire_auditor_progress.c b/src/auditordb/pg_get_wire_auditor_progress.c new file mode 100644 index 00000000..c5caf3f0 --- /dev/null +++ b/src/auditordb/pg_get_wire_auditor_progress.c @@ -0,0 +1,59 @@ +/* +   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 pg_get_wire_auditor_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_wire_auditor_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_WireProgressPoint *pp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    GNUNET_PQ_result_spec_timestamp ("last_timestamp", +                                     &pp->last_timestamp), +    GNUNET_PQ_result_spec_uint64 ("last_reserve_close_uuid", +                                  &pp->last_reserve_close_uuid), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "wire_auditor_progress_select", +           "SELECT" +           " last_timestamp" +           ",last_reserve_close_uuid" +           " FROM wire_auditor_progress" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "wire_auditor_progress_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_wire_auditor_progress.h b/src/auditordb/pg_get_wire_auditor_progress.h new file mode 100644 index 00000000..dec554ac --- /dev/null +++ b/src/auditordb/pg_get_wire_auditor_progress.h @@ -0,0 +1,44 @@ +/* +   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 pg_get_wire_auditor_progress.h + * @brief implementation of the get_wire_auditor_progress function + * @author Christian Grothoff + */ +#ifndef PG_GET_WIRE_AUDITOR_PROGRESS_H +#define PG_GET_WIRE_AUDITOR_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get information about the progress of the auditor. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param[out] pp set to where the auditor is in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct TALER_AUDITORDB_WireProgressPoint *pp); + + +#endif diff --git a/src/auditordb/pg_get_wire_fee_summary.c b/src/auditordb/pg_get_wire_fee_summary.c new file mode 100644 index 00000000..8b48a4d4 --- /dev/null +++ b/src/auditordb/pg_get_wire_fee_summary.c @@ -0,0 +1,64 @@ +/* +   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 pg_get_wire_fee_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_get_wire_fee_summary.h" +#include "pg_helper.h" + + +/** + * Get summary information about an exchanges wire fee balance. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param[out] wire_fee_balance set amount the exchange gained in wire fees + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_fee_summary (void *cls, +                             const struct TALER_MasterPublicKeyP *master_pub, +                             struct TALER_Amount *wire_fee_balance) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct GNUNET_PQ_ResultSpec rs[] = { +    TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee_balance", +                                 wire_fee_balance), +    GNUNET_PQ_result_spec_end +  }; + +  PREPARE (pg, +           "auditor_wire_fee_balance_select", +           "SELECT" +           " wire_fee_balance_val" +           ",wire_fee_balance_frac" +           " FROM auditor_wire_fee_balance" +           " WHERE master_pub=$1;"); +  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, +                                                   "auditor_wire_fee_balance_select", +                                                   params, +                                                   rs); +} diff --git a/src/auditordb/pg_get_wire_fee_summary.h b/src/auditordb/pg_get_wire_fee_summary.h new file mode 100644 index 00000000..c6e5bacd --- /dev/null +++ b/src/auditordb/pg_get_wire_fee_summary.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 pg_get_wire_fee_summary.h + * @brief implementation of the get_wire_fee_summary function + * @author Christian Grothoff + */ +#ifndef PG_GET_WIRE_FEE_SUMMARY_H +#define PG_GET_WIRE_FEE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Get summary information about an exchanges wire fee balance. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param[out] wire_fee_balance set amount the exchange gained in wire fees + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_get_wire_fee_summary (void *cls, +                             const struct TALER_MasterPublicKeyP *master_pub, +                             struct TALER_Amount *wire_fee_balance); + + +#endif diff --git a/src/auditordb/pg_helper.h b/src/auditordb/pg_helper.h new file mode 100644 index 00000000..7ebe5a17 --- /dev/null +++ b/src/auditordb/pg_helper.h @@ -0,0 +1,130 @@ +/* +   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 pg_helper.h + * @brief shared internal definitions for postgres DB plugin + * @author Christian Grothoff + */ +#ifndef PG_HELPER_H +#define PG_HELPER_H + + +#include "taler_auditordb_plugin.h" + + +/** + * Type of the "cls" argument given to each of the functions in + * our API. + */ +struct PostgresClosure +{ + +  /** +   * Postgres connection handle. +   */ +  struct GNUNET_PQ_Context *conn; + +  /** +   * Name of the ongoing transaction, used to debug cases where +   * a transaction is not properly terminated via COMMIT or +   * ROLLBACK. +   */ +  const char *transaction_name; + +  /** +   * Our configuration. +   */ +  const struct GNUNET_CONFIGURATION_Handle *cfg; + +  /** +   * How often have we connected to the DB so far? +   */ +  unsigned long long prep_gen; + +  /** +   * Which currency should we assume all amounts to be in? +   */ +  char *currency; +}; + + +/** + * Prepares SQL statement @a sql under @a name for + * connection @a pg once. + * Returns with #GNUNET_DB_STATUS_HARD_ERROR on failure. + * + * @param pg a `struct PostgresClosure` + * @param name name to prepare the statement under + * @param sql actual SQL text + */ +#define PREPARE(pg,name,sql)                      \ +  do {                                            \ +    static struct {                               \ +      unsigned long long cnt;                     \ +      struct PostgresClosure *pg;                 \ +    } preps[2]; /* 2 ctrs for taler-auditor-sync*/ \ +    unsigned int off = 0;                         \ +                                                  \ +    while ( (NULL != preps[off].pg) &&            \ +            (pg != preps[off].pg) &&              \ +            (off < sizeof(preps) / sizeof(*preps)) ) \ +    off++;                                      \ +    GNUNET_assert (off <                          \ +                   sizeof(preps) / sizeof(*preps)); \ +    if (preps[off].cnt < pg->prep_gen)            \ +    {                                             \ +      struct GNUNET_PQ_PreparedStatement ps[] = { \ +        GNUNET_PQ_make_prepare (name, sql),       \ +        GNUNET_PQ_PREPARED_STATEMENT_END          \ +      };                                          \ +                                                  \ +      if (GNUNET_OK !=                            \ +          GNUNET_PQ_prepare_statements (pg->conn, \ +                                        ps))      \ +      {                                           \ +        GNUNET_break (0);                         \ +        return GNUNET_DB_STATUS_HARD_ERROR;       \ +      }                                           \ +      preps[off].pg = pg;                         \ +      preps[off].cnt = pg->prep_gen;              \ +    }                                             \ +  } while (0) + + +/** + * Wrapper macro to add the currency from the plugin's state + * when fetching amounts from the database. + * + * @param field name of the database field to fetch amount from + * @param[out] amountp pointer to amount to set + */ +#define TALER_PQ_RESULT_SPEC_AMOUNT(field,amountp) TALER_PQ_result_spec_amount ( \ +    field,pg->currency,amountp) + + +/** + * Wrapper macro to add the currency from the plugin's state + * when fetching amounts from the database.  NBO variant. + * + * @param field name of the database field to fetch amount from + * @param[out] amountp pointer to amount to set + */ +#define TALER_PQ_RESULT_SPEC_AMOUNT_NBO(field,                          \ +                                        amountp) TALER_PQ_result_spec_amount_nbo ( \ +    field,pg->currency,amountp) + + +#endif diff --git a/src/auditordb/pg_insert_auditor_progress_aggregation.c b/src/auditordb/pg_insert_auditor_progress_aggregation.c new file mode 100644 index 00000000..f119548f --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_aggregation.c @@ -0,0 +1,51 @@ +/* +   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 pg_insert_auditor_progress_aggregation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_auditor_progress_aggregation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_insert_aggregation", +           "INSERT INTO auditor_progress_aggregation " +           "(master_pub" +           ",last_wire_out_serial_id" +           ") VALUES ($1,$2);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_insert_aggregation", +                                             params); +} diff --git a/src/auditordb/pg_insert_auditor_progress_aggregation.h b/src/auditordb/pg_insert_auditor_progress_aggregation.h new file mode 100644 index 00000000..74d4b6fd --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_aggregation.h @@ -0,0 +1,45 @@ +/* +   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 pg_insert_auditor_progress_aggregation.h + * @brief implementation of the insert_auditor_progress_aggregation function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_AUDITOR_PROGRESS_AGGREGATION_H +#define PG_INSERT_AUDITOR_PROGRESS_AGGREGATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa); + + +#endif diff --git a/src/auditordb/pg_insert_auditor_progress_coin.c b/src/auditordb/pg_insert_auditor_progress_coin.c new file mode 100644 index 00000000..aec745c5 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_coin.c @@ -0,0 +1,65 @@ +/* +   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 pg_insert_auditor_progress_coin.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_auditor_progress_coin.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_refresh_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_deposits_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_refunds_serial_id), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_insert_coin", +           "INSERT INTO auditor_progress_coin " +           "(master_pub" +           ",last_withdraw_serial_id" +           ",last_deposit_serial_id" +           ",last_melt_serial_id" +           ",last_refund_serial_id" +           ",last_recoup_serial_id" +           ",last_recoup_refresh_serial_id" +           ",last_purse_deposits_serial_id" +           ",last_purse_decision_serial_id" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_insert_coin", +                                             params); +} diff --git a/src/auditordb/pg_insert_auditor_progress_coin.h b/src/auditordb/pg_insert_auditor_progress_coin.h new file mode 100644 index 00000000..57f728cb --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_coin.h @@ -0,0 +1,44 @@ +/* +   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 pg_insert_auditor_progress_coin.h + * @brief implementation of the insert_auditor_progress_coin function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_AUDITOR_PROGRESS_COIN_H +#define PG_INSERT_AUDITOR_PROGRESS_COIN_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppc where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointCoin *ppc); + +#endif diff --git a/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.c b/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.c new file mode 100644 index 00000000..4f4c7390 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.c @@ -0,0 +1,51 @@ +/* +   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 pg_insert_auditor_progress_deposit_confirmation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_auditor_progress_deposit_confirmation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_uint64 (&ppdc->last_deposit_confirmation_serial_id), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_insert_deposit_confirmation", +           "INSERT INTO auditor_progress_deposit_confirmation " +           "(master_pub" +           ",last_deposit_confirmation_serial_id" +           ") VALUES ($1,$2);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_insert_deposit_confirmation", +                                             params); +} diff --git a/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.h b/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.h new file mode 100644 index 00000000..21a5ed28 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_deposit_confirmation.h @@ -0,0 +1,44 @@ +/* +   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 pg_insert_auditor_progress_deposit_confirmation.h + * @brief implementation of the insert_auditor_progress_deposit_confirmation function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H +#define PG_INSERT_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppdc where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc); + +#endif diff --git a/src/auditordb/pg_insert_auditor_progress_purse.c b/src/auditordb/pg_insert_auditor_progress_purse.c new file mode 100644 index 00000000..fa4f0bd2 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_purse.c @@ -0,0 +1,59 @@ +/* +   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 pg_insert_auditor_progress_purse.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_auditor_progress_purse.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointPurse *ppp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_request_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_decision_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_merge_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_account_merge_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_deposits_serial_id), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_insert_purse", +           "INSERT INTO auditor_progress_purse " +           "(master_pub" +           ",last_purse_request_serial_id" +           ",last_purse_decision_serial_id" +           ",last_purse_merges_serial_id" +           ",last_account_merges_serial_id" +           ",last_purse_deposits_serial_id" +           ") VALUES ($1,$2,$3,$4,$5,$6);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_insert_purse", +                                             params); +} diff --git a/src/auditordb/pg_insert_auditor_progress_purse.h b/src/auditordb/pg_insert_auditor_progress_purse.h new file mode 100644 index 00000000..d364f2f0 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_purse.h @@ -0,0 +1,44 @@ +/* +   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 pg_insert_auditor_progress_purse.h + * @brief implementation of the insert_auditor_progress_purse function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_AUDITOR_PROGRESS_PURSE_H +#define PG_INSERT_AUDITOR_PROGRESS_PURSE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppp where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointPurse *ppp); + +#endif diff --git a/src/auditordb/pg_insert_auditor_progress_reserve.c b/src/auditordb/pg_insert_auditor_progress_reserve.c new file mode 100644 index 00000000..864ca6f0 --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_reserve.c @@ -0,0 +1,65 @@ +/* +   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 pg_insert_auditor_progress_reserve.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_auditor_progress_reserve.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointReserve *ppr) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_recoup_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_open_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_purse_decisions_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_account_merges_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_history_requests_serial_id), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_insert_reserve", +           "INSERT INTO auditor_progress_reserve " +           "(master_pub" +           ",last_reserve_in_serial_id" +           ",last_reserve_out_serial_id" +           ",last_reserve_recoup_serial_id" +           ",last_reserve_open_serial_id" +           ",last_reserve_close_serial_id" +           ",last_purse_decision_serial_id" +           ",last_account_merges_serial_id" +           ",last_history_requests_serial_id" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_insert_reserve", +                                             params); +} diff --git a/src/auditordb/pg_insert_auditor_progress_reserve.h b/src/auditordb/pg_insert_auditor_progress_reserve.h new file mode 100644 index 00000000..d1e4d04e --- /dev/null +++ b/src/auditordb/pg_insert_auditor_progress_reserve.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 pg_insert_auditor_progress_reserve.h + * @brief implementation of the insert_auditor_progress_reserve function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_AUDITOR_PROGRESS_RESERVE_H +#define PG_INSERT_AUDITOR_PROGRESS_RESERVE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppr where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointReserve *ppr); + +#endif diff --git a/src/auditordb/pg_insert_balance_summary.c b/src/auditordb/pg_insert_balance_summary.c new file mode 100644 index 00000000..a965eefa --- /dev/null +++ b/src/auditordb/pg_insert_balance_summary.c @@ -0,0 +1,77 @@ +/* +   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 pg_insert_balance_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_balance_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    TALER_PQ_query_param_amount (&dfb->total_escrowed), +    TALER_PQ_query_param_amount (&dfb->deposit_fee_balance), +    TALER_PQ_query_param_amount (&dfb->melt_fee_balance), +    TALER_PQ_query_param_amount (&dfb->refund_fee_balance), +    TALER_PQ_query_param_amount (&dfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&dfb->open_deposit_fee_balance), +    TALER_PQ_query_param_amount (&dfb->risk), +    TALER_PQ_query_param_amount (&dfb->loss), +    TALER_PQ_query_param_amount (&dfb->irregular_loss), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_balance_summary_insert", +           "INSERT INTO auditor_balance_summary " +           "(master_pub" +           ",denom_balance_val" +           ",denom_balance_frac" +           ",deposit_fee_balance_val" +           ",deposit_fee_balance_frac" +           ",melt_fee_balance_val" +           ",melt_fee_balance_frac" +           ",refund_fee_balance_val" +           ",refund_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_deposit_fee_balance_val" +           ",open_deposit_fee_balance_frac" +           ",risk_val" +           ",risk_frac" +           ",loss_val" +           ",loss_frac" +           ",irregular_loss_val" +           ",irregular_loss_frac" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10," +           "          $11,$12,$13,$14,$15,$16,$17,$18,$19);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_balance_summary_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_balance_summary.h b/src/auditordb/pg_insert_balance_summary.h new file mode 100644 index 00000000..ee00ae7f --- /dev/null +++ b/src/auditordb/pg_insert_balance_summary.h @@ -0,0 +1,44 @@ +/* +   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 pg_insert_balance_summary.h + * @brief implementation of the insert_balance_summary function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_BALANCE_SUMMARY_H +#define PG_INSERT_BALANCE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about an exchange's denomination balances.  There + * must not be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param dfb denomination balance data to store + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb); + +#endif diff --git a/src/auditordb/pg_insert_denomination_balance.c b/src/auditordb/pg_insert_denomination_balance.c new file mode 100644 index 00000000..324c872a --- /dev/null +++ b/src/auditordb/pg_insert_denomination_balance.c @@ -0,0 +1,65 @@ +/* +   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 pg_insert_denomination_balance.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_denomination_balance.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  const struct TALER_AUDITORDB_DenominationCirculationData *dcd) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), +    TALER_PQ_query_param_amount (&dcd->denom_balance), +    TALER_PQ_query_param_amount (&dcd->denom_loss), +    GNUNET_PQ_query_param_uint64 (&dcd->num_issued), +    TALER_PQ_query_param_amount (&dcd->denom_risk), +    TALER_PQ_query_param_amount (&dcd->recoup_loss), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_denomination_pending_insert", +           "INSERT INTO auditor_denomination_pending " +           "(denom_pub_hash" +           ",denom_balance_val" +           ",denom_balance_frac" +           ",denom_loss_val" +           ",denom_loss_frac" +           ",num_issued" +           ",denom_risk_val" +           ",denom_risk_frac" +           ",recoup_loss_val" +           ",recoup_loss_frac" +           ") VALUES (" +           "$1,$2,$3,$4,$5,$6,$7,$8,$9,$10" +           ");"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_denomination_pending_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_denomination_balance.h b/src/auditordb/pg_insert_denomination_balance.h new file mode 100644 index 00000000..90776367 --- /dev/null +++ b/src/auditordb/pg_insert_denomination_balance.h @@ -0,0 +1,45 @@ +/* +   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 pg_insert_denomination_balance.h + * @brief implementation of the insert_denomination_balance function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_DENOMINATION_BALANCE_H +#define PG_INSERT_DENOMINATION_BALANCE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about a denomination key's balances.  There + * must not be an existing record for the denomination key. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param denom_pub_hash hash of the denomination public key + * @param dcd circulation data to store + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  const struct TALER_AUDITORDB_DenominationCirculationData *dcd); + + +#endif diff --git a/src/auditordb/pg_insert_deposit_confirmation.c b/src/auditordb/pg_insert_deposit_confirmation.c new file mode 100644 index 00000000..cc52ba4e --- /dev/null +++ b/src/auditordb/pg_insert_deposit_confirmation.c @@ -0,0 +1,73 @@ +/* +   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 pg_insert_deposit_confirmation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_deposit_confirmation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_deposit_confirmation ( +  void *cls, +  const struct TALER_AUDITORDB_DepositConfirmation *dc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (&dc->master_public_key), +    GNUNET_PQ_query_param_auto_from_type (&dc->h_contract_terms), +    GNUNET_PQ_query_param_auto_from_type (&dc->h_extensions), +    GNUNET_PQ_query_param_auto_from_type (&dc->h_wire), +    GNUNET_PQ_query_param_timestamp (&dc->exchange_timestamp), +    GNUNET_PQ_query_param_timestamp (&dc->wire_deadline), +    GNUNET_PQ_query_param_timestamp (&dc->refund_deadline), +    TALER_PQ_query_param_amount (&dc->amount_without_fee), +    GNUNET_PQ_query_param_auto_from_type (&dc->coin_pub), +    GNUNET_PQ_query_param_auto_from_type (&dc->merchant), +    GNUNET_PQ_query_param_auto_from_type (&dc->exchange_sig), +    GNUNET_PQ_query_param_auto_from_type (&dc->exchange_pub), +    GNUNET_PQ_query_param_auto_from_type (&dc->master_sig), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_deposit_confirmation_insert", +           "INSERT INTO deposit_confirmations " +           "(master_pub" +           ",h_contract_terms" +           ",h_extensions" +           ",h_wire" +           ",exchange_timestamp" +           ",wire_deadline" +           ",refund_deadline" +           ",amount_without_fee_val" +           ",amount_without_fee_frac" +           ",coin_pub" +           ",merchant_pub" +           ",exchange_sig" +           ",exchange_pub" +           ",master_sig"                  /* master_sig could be normalized... */ +           ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_deposit_confirmation_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_deposit_confirmation.h b/src/auditordb/pg_insert_deposit_confirmation.h new file mode 100644 index 00000000..f3d11e3c --- /dev/null +++ b/src/auditordb/pg_insert_deposit_confirmation.h @@ -0,0 +1,42 @@ +/* +   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 pg_insert_deposit_confirmation.h + * @brief implementation of the insert_deposit_confirmation function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_DEPOSIT_CONFIRMATION_H +#define PG_INSERT_DEPOSIT_CONFIRMATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about a deposit confirmation into the database. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param dc deposit confirmation information to store + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_deposit_confirmation ( +  void *cls, +  const struct TALER_AUDITORDB_DepositConfirmation *dc); + + +#endif diff --git a/src/auditordb/pg_insert_exchange.c b/src/auditordb/pg_insert_exchange.c new file mode 100644 index 00000000..bc84ad77 --- /dev/null +++ b/src/auditordb/pg_insert_exchange.c @@ -0,0 +1,49 @@ +/* +   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 pg_insert_exchange.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_exchange.h" +#include "pg_helper.h" + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_exchange (void *cls, +                        const struct TALER_MasterPublicKeyP *master_pub, +                        const char *exchange_url) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_string (exchange_url), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_insert_exchange", +           "INSERT INTO auditor_exchanges " +           "(master_pub" +           ",exchange_url" +           ") VALUES ($1,$2);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_insert_exchange", +                                             params); +} diff --git a/src/auditordb/pg_insert_exchange.h b/src/auditordb/pg_insert_exchange.h new file mode 100644 index 00000000..c06f2115 --- /dev/null +++ b/src/auditordb/pg_insert_exchange.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 pg_insert_exchange.h + * @brief implementation of the insert_exchange function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_EXCHANGE_H +#define PG_INSERT_EXCHANGE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about an exchange this auditor will be auditing. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param exchange_url public (base) URL of the API of the exchange + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_exchange (void *cls, +                        const struct TALER_MasterPublicKeyP *master_pub, +                        const char *exchange_url); + + +#endif diff --git a/src/auditordb/pg_insert_exchange_signkey.c b/src/auditordb/pg_insert_exchange_signkey.c new file mode 100644 index 00000000..fa310f2e --- /dev/null +++ b/src/auditordb/pg_insert_exchange_signkey.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 pg_insert_exchange_signkey.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_exchange_signkey.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_exchange_signkey ( +  void *cls, +  const struct TALER_AUDITORDB_ExchangeSigningKey *sk) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (&sk->master_public_key), +    GNUNET_PQ_query_param_timestamp (&sk->ep_start), +    GNUNET_PQ_query_param_timestamp (&sk->ep_expire), +    GNUNET_PQ_query_param_timestamp (&sk->ep_end), +    GNUNET_PQ_query_param_auto_from_type (&sk->exchange_pub), +    GNUNET_PQ_query_param_auto_from_type (&sk->master_sig), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_insert_exchange_signkey", +           "INSERT INTO auditor_exchange_signkeys " +           "(master_pub" +           ",ep_start" +           ",ep_expire" +           ",ep_end" +           ",exchange_pub" +           ",master_sig" +           ") VALUES ($1,$2,$3,$4,$5,$6);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_insert_exchange_signkey", +                                             params); +} diff --git a/src/auditordb/pg_insert_exchange_signkey.h b/src/auditordb/pg_insert_exchange_signkey.h new file mode 100644 index 00000000..1c1eefe3 --- /dev/null +++ b/src/auditordb/pg_insert_exchange_signkey.h @@ -0,0 +1,41 @@ +/* +   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 pg_insert_exchange_signkey.h + * @brief implementation of the insert_exchange_signkey function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_EXCHANGE_SIGNKEY_H +#define PG_INSERT_EXCHANGE_SIGNKEY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + +/** + * Insert information about a signing key of the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param sk signing key information to store + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_exchange_signkey ( +  void *cls, +  const struct TALER_AUDITORDB_ExchangeSigningKey *sk); + + +#endif diff --git a/src/auditordb/pg_insert_historic_denom_revenue.c b/src/auditordb/pg_insert_historic_denom_revenue.c new file mode 100644 index 00000000..d44d3734 --- /dev/null +++ b/src/auditordb/pg_insert_historic_denom_revenue.c @@ -0,0 +1,62 @@ +/* +   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 pg_insert_historic_denom_revenue.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_historic_denom_revenue.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_historic_denom_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_DenominationHashP *denom_pub_hash, +  struct GNUNET_TIME_Timestamp revenue_timestamp, +  const struct TALER_Amount *revenue_balance, +  const struct TALER_Amount *loss_balance) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), +    GNUNET_PQ_query_param_timestamp (&revenue_timestamp), +    TALER_PQ_query_param_amount (revenue_balance), +    TALER_PQ_query_param_amount (loss_balance), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_historic_denomination_revenue_insert", +           "INSERT INTO auditor_historic_denomination_revenue" +           "(master_pub" +           ",denom_pub_hash" +           ",revenue_timestamp" +           ",revenue_balance_val" +           ",revenue_balance_frac" +           ",loss_balance_val" +           ",loss_balance_frac" +           ") VALUES ($1,$2,$3,$4,$5,$6,$7);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_historic_denomination_revenue_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_historic_denom_revenue.h b/src/auditordb/pg_insert_historic_denom_revenue.h new file mode 100644 index 00000000..2f8e005d --- /dev/null +++ b/src/auditordb/pg_insert_historic_denom_revenue.h @@ -0,0 +1,52 @@ +/* +   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 pg_insert_historic_denom_revenue.h + * @brief implementation of the insert_historic_denom_revenue function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_HISTORIC_DENOM_REVENUE_H +#define PG_INSERT_HISTORIC_DENOM_REVENUE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about an exchange's historic + * revenue about a denomination key. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param denom_pub_hash hash of the denomination key + * @param revenue_timestamp when did this profit get realized + * @param revenue_balance what was the total profit made from + *                        deposit fees, melting fees, refresh fees + *                        and coins that were never returned? + * @param loss_balance total losses suffered by the exchange at the time + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_historic_denom_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_DenominationHashP *denom_pub_hash, +  struct GNUNET_TIME_Timestamp revenue_timestamp, +  const struct TALER_Amount *revenue_balance, +  const struct TALER_Amount *loss_balance); + +#endif diff --git a/src/auditordb/pg_insert_historic_reserve_revenue.c b/src/auditordb/pg_insert_historic_reserve_revenue.c new file mode 100644 index 00000000..8218aab7 --- /dev/null +++ b/src/auditordb/pg_insert_historic_reserve_revenue.c @@ -0,0 +1,57 @@ +/* +   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 pg_insert_historic_reserve_revenue.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_historic_reserve_revenue.h" +#include "pg_helper.h" + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_historic_reserve_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct GNUNET_TIME_Timestamp start_time, +  struct GNUNET_TIME_Timestamp end_time, +  const struct TALER_Amount *reserve_profits) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_timestamp (&start_time), +    GNUNET_PQ_query_param_timestamp (&end_time), +    TALER_PQ_query_param_amount (reserve_profits), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_historic_reserve_summary_insert", +           "INSERT INTO auditor_historic_reserve_summary" +           "(master_pub" +           ",start_date" +           ",end_date" +           ",reserve_profits_val" +           ",reserve_profits_frac" +           ") VALUES ($1,$2,$3,$4,$5);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_historic_reserve_summary_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_historic_reserve_revenue.h b/src/auditordb/pg_insert_historic_reserve_revenue.h new file mode 100644 index 00000000..d6c29ed0 --- /dev/null +++ b/src/auditordb/pg_insert_historic_reserve_revenue.h @@ -0,0 +1,47 @@ +/* +   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 pg_insert_historic_reserve_revenue.h + * @brief implementation of the insert_historic_reserve_revenue function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_HISTORIC_RESERVE_REVENUE_H +#define PG_INSERT_HISTORIC_RESERVE_REVENUE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about an exchange's historic revenue from reserves. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param start_time beginning of aggregated time interval + * @param end_time end of aggregated time interval + * @param reserve_profits total profits made + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_historic_reserve_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  struct GNUNET_TIME_Timestamp start_time, +  struct GNUNET_TIME_Timestamp end_time, +  const struct TALER_Amount *reserve_profits); + +#endif diff --git a/src/auditordb/pg_insert_predicted_result.c b/src/auditordb/pg_insert_predicted_result.c new file mode 100644 index 00000000..4e8e5420 --- /dev/null +++ b/src/auditordb/pg_insert_predicted_result.c @@ -0,0 +1,56 @@ +/* +   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 pg_insert_predicted_result.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_predicted_result.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_predicted_result ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *balance, +  const struct TALER_Amount *drained) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    TALER_PQ_query_param_amount (balance), +    TALER_PQ_query_param_amount (drained), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_predicted_result_insert", +           "INSERT INTO auditor_predicted_result" +           "(master_pub" +           ",balance_val" +           ",balance_frac" +           ",drained_val" +           ",drained_frac" +           ") VALUES ($1,$2,$3,$4,$5);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_predicted_result_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_predicted_result.h b/src/auditordb/pg_insert_predicted_result.h new file mode 100644 index 00000000..ef9f4c3b --- /dev/null +++ b/src/auditordb/pg_insert_predicted_result.h @@ -0,0 +1,46 @@ +/* +   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 pg_insert_predicted_result.h + * @brief implementation of the insert_predicted_result function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_PREDICTED_RESULT_H +#define PG_INSERT_PREDICTED_RESULT_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the predicted exchange's bank + * account balance. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param balance what the bank account balance of the exchange should show + * @param drained amount that was drained in profits + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_predicted_result ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *balance, +  const struct TALER_Amount *drained); + +#endif diff --git a/src/auditordb/pg_insert_reserve_info.c b/src/auditordb/pg_insert_reserve_info.c new file mode 100644 index 00000000..22b17819 --- /dev/null +++ b/src/auditordb/pg_insert_reserve_info.c @@ -0,0 +1,84 @@ +/* +   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 pg_insert_reserve_info.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_reserve_info.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_reserve_info ( +  void *cls, +  const struct TALER_ReservePublicKeyP *reserve_pub, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +  struct GNUNET_TIME_Timestamp expiration_date, +  const char *origin_account) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    TALER_PQ_query_param_amount (&rfb->reserve_balance), +    TALER_PQ_query_param_amount (&rfb->reserve_loss), +    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), +    TALER_PQ_query_param_amount (&rfb->close_fee_balance), +    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&rfb->open_fee_balance), +    TALER_PQ_query_param_amount (&rfb->history_fee_balance), +    GNUNET_PQ_query_param_timestamp (&expiration_date), +    NULL == origin_account +    ? GNUNET_PQ_query_param_null () +    : GNUNET_PQ_query_param_string (origin_account), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_reserves_insert", +           "INSERT INTO auditor_reserves " +           "(reserve_pub" +           ",master_pub" +           ",reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_loss_val" +           ",reserve_loss_frac" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",close_fee_balance_val" +           ",close_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_fee_balance_val" +           ",open_fee_balance_frac" +           ",history_fee_balance_val" +           ",history_fee_balance_frac" +           ",expiration_date" +           ",origin_account" + +           ") VALUES " +           "($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18);"); + +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_reserves_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_reserve_info.h b/src/auditordb/pg_insert_reserve_info.h new file mode 100644 index 00000000..5b5aa67e --- /dev/null +++ b/src/auditordb/pg_insert_reserve_info.h @@ -0,0 +1,50 @@ +/* +   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 pg_insert_reserve_info.h + * @brief implementation of the insert_reserve_info function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_RESERVE_INFO_H +#define PG_INSERT_RESERVE_INFO_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about a reserve.  There must not be an + * existing record for the reserve. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param reserve_pub public key of the reserve + * @param master_pub master public key of the exchange + * @param rfb balance amounts for the reserve + * @param expiration_date when will the reserve expire + * @param origin_account where did the money in the reserve originally come from + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_reserve_info ( +  void *cls, +  const struct TALER_ReservePublicKeyP *reserve_pub, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +  struct GNUNET_TIME_Timestamp expiration_date, +  const char *origin_account); + +#endif diff --git a/src/auditordb/pg_insert_reserve_summary.c b/src/auditordb/pg_insert_reserve_summary.c new file mode 100644 index 00000000..bcae388f --- /dev/null +++ b/src/auditordb/pg_insert_reserve_summary.c @@ -0,0 +1,75 @@ +/* +   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 pg_insert_reserve_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_reserve_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_reserve_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    TALER_PQ_query_param_amount (&rfb->reserve_balance), +    TALER_PQ_query_param_amount (&rfb->reserve_loss), +    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), +    TALER_PQ_query_param_amount (&rfb->close_fee_balance), +    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&rfb->open_fee_balance), +    TALER_PQ_query_param_amount (&rfb->history_fee_balance), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_reserve_balance_insert", +           "INSERT INTO auditor_reserve_balance" +           "(master_pub" +           ",reserve_balance_val" +           ",reserve_balance_frac" +           ",reserve_loss_val" +           ",reserve_loss_frac" +           ",withdraw_fee_balance_val" +           ",withdraw_fee_balance_frac" +           ",close_fee_balance_val" +           ",close_fee_balance_frac" +           ",purse_fee_balance_val" +           ",purse_fee_balance_frac" +           ",open_fee_balance_val" +           ",open_fee_balance_frac" +           ",history_fee_balance_val" +           ",history_fee_balance_frac" +           ") VALUES " +           "($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15)"); +  GNUNET_assert (GNUNET_YES == +                 TALER_amount_cmp_currency (&rfb->reserve_balance, +                                            &rfb->withdraw_fee_balance)); + +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_reserve_balance_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_reserve_summary.h b/src/auditordb/pg_insert_reserve_summary.h new file mode 100644 index 00000000..b5e20076 --- /dev/null +++ b/src/auditordb/pg_insert_reserve_summary.h @@ -0,0 +1,45 @@ +/* +   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 pg_insert_reserve_summary.h + * @brief implementation of the insert_reserve_summary function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_RESERVE_SUMMARY_H +#define PG_INSERT_RESERVE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about all reserves.  There must not be an + * existing record for the @a master_pub. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param rfb balances to be stored for the reserve + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_reserve_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb); + + +#endif diff --git a/src/auditordb/pg_insert_wire_auditor_account_progress.c b/src/auditordb/pg_insert_wire_auditor_account_progress.c new file mode 100644 index 00000000..b0e416a4 --- /dev/null +++ b/src/auditordb/pg_insert_wire_auditor_account_progress.c @@ -0,0 +1,61 @@ +/* +   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 pg_insert_wire_auditor_account_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_wire_auditor_account_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_string (account_name), +    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&bapp->in_wire_off), +    GNUNET_PQ_query_param_uint64 (&bapp->out_wire_off), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "wire_auditor_account_progress_insert", +           "INSERT INTO wire_auditor_account_progress " +           "(master_pub" +           ",account_name" +           ",last_wire_reserve_in_serial_id" +           ",last_wire_wire_out_serial_id" +           ",wire_in_off" +           ",wire_out_off" +           ") VALUES ($1,$2,$3,$4,$5,$6);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "wire_auditor_account_progress_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_wire_auditor_account_progress.h b/src/auditordb/pg_insert_wire_auditor_account_progress.h new file mode 100644 index 00000000..72c2b595 --- /dev/null +++ b/src/auditordb/pg_insert_wire_auditor_account_progress.h @@ -0,0 +1,48 @@ +/* +   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 pg_insert_wire_auditor_account_progress.h + * @brief implementation of the insert_wire_auditor_account_progress function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_WIRE_AUDITOR_ACCOUNT_PROGRESS_H +#define PG_INSERT_WIRE_AUDITOR_ACCOUNT_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param account_name name of the wire account we are auditing + * @param pp how far are we in the auditor's tables + * @param bapp progress in wire transaction histories + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp); + +#endif diff --git a/src/auditordb/pg_insert_wire_auditor_progress.c b/src/auditordb/pg_insert_wire_auditor_progress.c new file mode 100644 index 00000000..7853d3ff --- /dev/null +++ b/src/auditordb/pg_insert_wire_auditor_progress.c @@ -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 pg_insert_wire_auditor_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_wire_auditor_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_WireProgressPoint *pp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_timestamp (&pp->last_timestamp), +    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_uuid), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "wire_auditor_progress_insert", +           "INSERT INTO wire_auditor_progress " +           "(master_pub" +           ",last_timestamp" +           ",last_reserve_close_uuid" +           ") VALUES ($1,$2,$3);"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "wire_auditor_progress_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_wire_auditor_progress.h b/src/auditordb/pg_insert_wire_auditor_progress.h new file mode 100644 index 00000000..1e3b6080 --- /dev/null +++ b/src/auditordb/pg_insert_wire_auditor_progress.h @@ -0,0 +1,45 @@ +/* +   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 pg_insert_wire_auditor_progress.h + * @brief implementation of the insert_wire_auditor_progress function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_WIRE_AUDITOR_PROGRESS_H +#define PG_INSERT_WIRE_AUDITOR_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about the auditor's progress with an exchange's + * data. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param pp where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_WireProgressPoint *pp); + + +#endif diff --git a/src/auditordb/pg_insert_wire_fee_summary.c b/src/auditordb/pg_insert_wire_fee_summary.c new file mode 100644 index 00000000..2de51a7c --- /dev/null +++ b/src/auditordb/pg_insert_wire_fee_summary.c @@ -0,0 +1,52 @@ +/* +   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 pg_insert_wire_fee_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_insert_wire_fee_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_fee_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *wire_fee_balance) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    TALER_PQ_query_param_amount (wire_fee_balance), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_wire_fee_balance_insert", +           "INSERT INTO auditor_wire_fee_balance" +           "(master_pub" +           ",wire_fee_balance_val" +           ",wire_fee_balance_frac" +           ") VALUES ($1,$2,$3)"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_wire_fee_balance_insert", +                                             params); +} diff --git a/src/auditordb/pg_insert_wire_fee_summary.h b/src/auditordb/pg_insert_wire_fee_summary.h new file mode 100644 index 00000000..9c969fb6 --- /dev/null +++ b/src/auditordb/pg_insert_wire_fee_summary.h @@ -0,0 +1,44 @@ +/* +   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 pg_insert_wire_fee_summary.h + * @brief implementation of the insert_wire_fee_summary function + * @author Christian Grothoff + */ +#ifndef PG_INSERT_WIRE_FEE_SUMMARY_H +#define PG_INSERT_WIRE_FEE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about exchange's wire fee balance. There must not be an + * existing record for the same @a master_pub. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param wire_fee_balance amount the exchange gained in wire fees + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_insert_wire_fee_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *wire_fee_balance); + +#endif diff --git a/src/auditordb/pg_list_exchanges.c b/src/auditordb/pg_list_exchanges.c new file mode 100644 index 00000000..964c0192 --- /dev/null +++ b/src/auditordb/pg_list_exchanges.c @@ -0,0 +1,126 @@ +/* +   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 pg_list_exchanges.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_list_exchanges.h" +#include "pg_helper.h" + + +/** + * Closure for #exchange_info_cb(). + */ +struct ExchangeInfoContext +{ + +  /** +   * Function to call for each exchange. +   */ +  TALER_AUDITORDB_ExchangeCallback cb; + +  /** +   * Closure for @e cb +   */ +  void *cb_cls; + +  /** +   * Query status to return. +   */ +  enum GNUNET_DB_QueryStatus qs; +}; + + +/** + * Helper function for #postgres_list_exchanges(). + * To be called with the results of a SELECT statement + * that has returned @a num_results results. + * + * @param cls closure of type `struct ExchangeInfoContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +exchange_info_cb (void *cls, +                  PGresult *result, +                  unsigned int num_results) +{ +  struct ExchangeInfoContext *eic = cls; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    struct TALER_MasterPublicKeyP master_pub; +    char *exchange_url; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("master_pub", &master_pub), +      GNUNET_PQ_result_spec_string ("exchange_url", &exchange_url), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      eic->qs = GNUNET_DB_STATUS_HARD_ERROR; +      return; +    } +    eic->qs = i + 1; +    eic->cb (eic->cb_cls, +             &master_pub, +             exchange_url); +    GNUNET_free (exchange_url); +  } +} + + +enum GNUNET_DB_QueryStatus +TAH_PG_list_exchanges (void *cls, +                       TALER_AUDITORDB_ExchangeCallback cb, +                       void *cb_cls) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_end +  }; +  struct ExchangeInfoContext eic = { +    .cb = cb, +    .cb_cls = cb_cls +  }; +  enum GNUNET_DB_QueryStatus qs; + +  PREPARE (pg, +           "auditor_list_exchanges", +           "SELECT" +           " master_pub" +           ",exchange_url" +           " FROM auditor_exchanges"); +  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, +                                             "auditor_list_exchanges", +                                             params, +                                             &exchange_info_cb, +                                             &eic); +  if (qs > 0) +    return eic.qs; +  GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs); +  return qs; +} diff --git a/src/auditordb/pg_list_exchanges.h b/src/auditordb/pg_list_exchanges.h new file mode 100644 index 00000000..4396603e --- /dev/null +++ b/src/auditordb/pg_list_exchanges.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 pg_list_exchanges.h + * @brief implementation of the list_exchanges function + * @author Christian Grothoff + */ +#ifndef PG_LIST_EXCHANGES_H +#define PG_LIST_EXCHANGES_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Obtain information about exchanges this auditor is auditing. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param cb function to call with the results + * @param cb_cls closure for @a cb + * @return query result status + */ +enum GNUNET_DB_QueryStatus +TAH_PG_list_exchanges (void *cls, +                       TALER_AUDITORDB_ExchangeCallback cb, +                       void *cb_cls); + + +#endif diff --git a/src/auditordb/pg_select_historic_denom_revenue.c b/src/auditordb/pg_select_historic_denom_revenue.c new file mode 100644 index 00000000..efeb81b1 --- /dev/null +++ b/src/auditordb/pg_select_historic_denom_revenue.c @@ -0,0 +1,151 @@ +/* +   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 pg_select_historic_denom_revenue.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_select_historic_denom_revenue.h" +#include "pg_helper.h" + + +/** + * Closure for #historic_denom_revenue_cb(). + */ +struct HistoricDenomRevenueContext +{ +  /** +   * Function to call for each result. +   */ +  TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb; + +  /** +   * Closure for @e cb. +   */ +  void *cb_cls; + +  /** +   * Plugin context. +   */ +  struct PostgresClosure *pg; + +  /** +   * Number of results processed. +   */ +  enum GNUNET_DB_QueryStatus qs; +}; + + +/** + * Helper function for #postgres_select_historic_denom_revenue(). + * To be called with the results of a SELECT statement + * that has returned @a num_results results. + * + * @param cls closure of type `struct HistoricRevenueContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +historic_denom_revenue_cb (void *cls, +                           PGresult *result, +                           unsigned int num_results) +{ +  struct HistoricDenomRevenueContext *hrc = cls; +  struct PostgresClosure *pg = hrc->pg; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    struct TALER_DenominationHashP denom_pub_hash; +    struct GNUNET_TIME_Timestamp revenue_timestamp; +    struct TALER_Amount revenue_balance; +    struct TALER_Amount loss; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", +                                            &denom_pub_hash), +      GNUNET_PQ_result_spec_timestamp ("revenue_timestamp", +                                       &revenue_timestamp), +      TALER_PQ_RESULT_SPEC_AMOUNT ("revenue_balance", +                                   &revenue_balance), +      TALER_PQ_RESULT_SPEC_AMOUNT ("loss_balance", +                                   &loss), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      hrc->qs = GNUNET_DB_STATUS_HARD_ERROR; +      return; +    } + +    hrc->qs = i + 1; +    if (GNUNET_OK != +        hrc->cb (hrc->cb_cls, +                 &denom_pub_hash, +                 revenue_timestamp, +                 &revenue_balance, +                 &loss)) +      break; +  } +} + + +enum GNUNET_DB_QueryStatus +TAH_PG_select_historic_denom_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb, +  void *cb_cls) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  struct HistoricDenomRevenueContext hrc = { +    .cb = cb, +    .cb_cls = cb_cls, +    .pg = pg +  }; +  enum GNUNET_DB_QueryStatus qs; + +  PREPARE (pg, +           "auditor_historic_denomination_revenue_select", +           "SELECT" +           " denom_pub_hash" +           ",revenue_timestamp" +           ",revenue_balance_val" +           ",revenue_balance_frac" +           ",loss_balance_val" +           ",loss_balance_frac" +           " FROM auditor_historic_denomination_revenue" +           " WHERE master_pub=$1;"); +  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, +                                             "auditor_historic_denomination_revenue_select", +                                             params, +                                             &historic_denom_revenue_cb, +                                             &hrc); +  if (qs <= 0) +    return qs; +  return hrc.qs; +} diff --git a/src/auditordb/pg_select_historic_denom_revenue.h b/src/auditordb/pg_select_historic_denom_revenue.h new file mode 100644 index 00000000..68afcd01 --- /dev/null +++ b/src/auditordb/pg_select_historic_denom_revenue.h @@ -0,0 +1,46 @@ +/* +   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 pg_select_historic_denom_revenue.h + * @brief implementation of the select_historic_denom_revenue function + * @author Christian Grothoff + */ +#ifndef PG_SELECT_HISTORIC_DENOM_REVENUE_H +#define PG_SELECT_HISTORIC_DENOM_REVENUE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Obtain all of the historic denomination key revenue + * of the given @a master_pub. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param cb function to call with the results + * @param cb_cls closure for @a cb + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_select_historic_denom_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb, +  void *cb_cls); + +#endif diff --git a/src/auditordb/pg_select_historic_reserve_revenue.c b/src/auditordb/pg_select_historic_reserve_revenue.c new file mode 100644 index 00000000..e3172f9f --- /dev/null +++ b/src/auditordb/pg_select_historic_reserve_revenue.c @@ -0,0 +1,144 @@ +/* +   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 pg_select_historic_reserve_revenue.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_select_historic_reserve_revenue.h" +#include "pg_helper.h" + + +/** + * Closure for #historic_reserve_revenue_cb(). + */ +struct HistoricReserveRevenueContext +{ +  /** +   * Function to call for each result. +   */ +  TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb; + +  /** +   * Closure for @e cb. +   */ +  void *cb_cls; + +  /** +   * Plugin context. +   */ +  struct PostgresClosure *pg; + +  /** +   * Number of results processed. +   */ +  enum GNUNET_DB_QueryStatus qs; +}; + + +/** + * Helper function for #postgres_select_historic_reserve_revenue(). + * To be called with the results of a SELECT statement + * that has returned @a num_results results. + * + * @param cls closure of type `struct HistoricRevenueContext *` + * @param result the postgres result + * @param num_results the number of results in @a result + */ +static void +historic_reserve_revenue_cb (void *cls, +                             PGresult *result, +                             unsigned int num_results) +{ +  struct HistoricReserveRevenueContext *hrc = cls; +  struct PostgresClosure *pg = hrc->pg; + +  for (unsigned int i = 0; i < num_results; i++) +  { +    struct GNUNET_TIME_Timestamp start_date; +    struct GNUNET_TIME_Timestamp end_date; +    struct TALER_Amount reserve_profits; +    struct GNUNET_PQ_ResultSpec rs[] = { +      GNUNET_PQ_result_spec_timestamp ("start_date", +                                       &start_date), +      GNUNET_PQ_result_spec_timestamp ("end_date", +                                       &end_date), +      TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_profits", +                                   &reserve_profits), +      GNUNET_PQ_result_spec_end +    }; + +    if (GNUNET_OK != +        GNUNET_PQ_extract_result (result, +                                  rs, +                                  i)) +    { +      GNUNET_break (0); +      hrc->qs = GNUNET_DB_STATUS_HARD_ERROR; +      return; +    } +    hrc->qs = i + 1; +    if (GNUNET_OK != +        hrc->cb (hrc->cb_cls, +                 start_date, +                 end_date, +                 &reserve_profits)) +      break; +  } +} + + +enum GNUNET_DB_QueryStatus +TAH_PG_select_historic_reserve_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb, +  void *cb_cls) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; +  enum GNUNET_DB_QueryStatus qs; +  struct HistoricReserveRevenueContext hrc = { +    .cb = cb, +    .cb_cls = cb_cls, +    .pg = pg +  }; + +  PREPARE (pg, +           "auditor_historic_reserve_summary_select", +           "SELECT" +           " start_date" +           ",end_date" +           ",reserve_profits_val" +           ",reserve_profits_frac" +           " FROM auditor_historic_reserve_summary" +           " WHERE master_pub=$1;"); +  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, +                                             "auditor_historic_reserve_summary_select", +                                             params, +                                             &historic_reserve_revenue_cb, +                                             &hrc); +  if (0 >= qs) +    return qs; +  return hrc.qs; +} diff --git a/src/auditordb/pg_select_historic_reserve_revenue.h b/src/auditordb/pg_select_historic_reserve_revenue.h new file mode 100644 index 00000000..87a6b06a --- /dev/null +++ b/src/auditordb/pg_select_historic_reserve_revenue.h @@ -0,0 +1,45 @@ +/* +   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 pg_select_historic_reserve_revenue.h + * @brief implementation of the select_historic_reserve_revenue function + * @author Christian Grothoff + */ +#ifndef PG_SELECT_HISTORIC_RESERVE_REVENUE_H +#define PG_SELECT_HISTORIC_RESERVE_REVENUE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + +/** + * Return information about an exchange's historic revenue from reserves. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param cb function to call with results + * @param cb_cls closure for @a cb + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_select_historic_reserve_revenue ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb, +  void *cb_cls); + + +#endif diff --git a/src/auditordb/pg_update_auditor_progress_aggregation.c b/src/auditordb/pg_update_auditor_progress_aggregation.c new file mode 100644 index 00000000..24404e4a --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_aggregation.c @@ -0,0 +1,50 @@ +/* +   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 pg_update_auditor_progress_aggregation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_auditor_progress_aggregation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_update_aggregation", +           "UPDATE auditor_progress_aggregation SET " +           " last_wire_out_serial_id=$1" +           " WHERE master_pub=$2"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_update_aggregation", +                                             params); +} diff --git a/src/auditordb/pg_update_auditor_progress_aggregation.h b/src/auditordb/pg_update_auditor_progress_aggregation.h new file mode 100644 index 00000000..f8917ca7 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_aggregation.h @@ -0,0 +1,44 @@ +/* +   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 pg_update_auditor_progress_aggregation.h + * @brief implementation of the update_auditor_progress_aggregation function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_AUDITOR_PROGRESS_AGGREGATION_H +#define PG_UPDATE_AUDITOR_PROGRESS_AGGREGATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppa where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_aggregation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa); + +#endif diff --git a/src/auditordb/pg_update_auditor_progress_coin.c b/src/auditordb/pg_update_auditor_progress_coin.c new file mode 100644 index 00000000..1d7e0152 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_coin.c @@ -0,0 +1,64 @@ +/* +   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 pg_update_auditor_progress_coin.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_auditor_progress_coin.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointCoin *ppc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_refresh_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_deposits_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_refunds_serial_id), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_update_coin", +           "UPDATE auditor_progress_coin SET " +           " last_withdraw_serial_id=$1" +           ",last_deposit_serial_id=$2" +           ",last_melt_serial_id=$3" +           ",last_refund_serial_id=$4" +           ",last_recoup_serial_id=$5" +           ",last_recoup_refresh_serial_id=$6" +           ",last_purse_deposits_serial_id=$7" +           ",last_purse_decision_serial_id=$8" +           " WHERE master_pub=$9"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_update_coin", +                                             params); +} diff --git a/src/auditordb/pg_update_auditor_progress_coin.h b/src/auditordb/pg_update_auditor_progress_coin.h new file mode 100644 index 00000000..0ce7f149 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_coin.h @@ -0,0 +1,44 @@ +/* +   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 pg_update_auditor_progress_coin.h + * @brief implementation of the update_auditor_progress_coin function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_AUDITOR_PROGRESS_COIN_H +#define PG_UPDATE_AUDITOR_PROGRESS_COIN_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppc where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_coin ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointCoin *ppc); + +#endif diff --git a/src/auditordb/pg_update_auditor_progress_deposit_confirmation.c b/src/auditordb/pg_update_auditor_progress_deposit_confirmation.c new file mode 100644 index 00000000..9a244f5f --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_deposit_confirmation.c @@ -0,0 +1,50 @@ +/* +   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 pg_update_auditor_progress_deposit_confirmation.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_auditor_progress_deposit_confirmation.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&ppdc->last_deposit_confirmation_serial_id), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_update_deposit_confirmation", +           "UPDATE auditor_progress_deposit_confirmation SET " +           " last_deposit_confirmation_serial_id=$1" +           " WHERE master_pub=$2"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_update_deposit_confirmation", +                                             params); +} diff --git a/src/auditordb/pg_update_auditor_progress_deposit_confirmation.h b/src/auditordb/pg_update_auditor_progress_deposit_confirmation.h new file mode 100644 index 00000000..7927e485 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_deposit_confirmation.h @@ -0,0 +1,45 @@ +/* +   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 pg_update_auditor_progress_deposit_confirmation.h + * @brief implementation of the update_auditor_progress_deposit_confirmation function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H +#define PG_UPDATE_AUDITOR_PROGRESS_DEPOSIT_CONFIRMATION_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppdc where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_deposit_confirmation ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc); + + +#endif diff --git a/src/auditordb/pg_update_auditor_progress_purse.c b/src/auditordb/pg_update_auditor_progress_purse.c new file mode 100644 index 00000000..c8fb6466 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_purse.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 pg_update_auditor_progress_purse.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_auditor_progress_purse.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointPurse *ppp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_request_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_decision_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_merge_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_account_merge_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_deposits_serial_id), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_update_purse", +           "UPDATE auditor_progress_purse SET " +           " last_purse_request_serial_id=$1" +           ",last_purse_decision_serial_id=$2" +           ",last_purse_merges_serial_id=$3" +           ",last_account_merges_serial_id=$4" +           ",last_purse_deposits_serial_id=$5" +           " WHERE master_pub=$6"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_update_purse", +                                             params); +} diff --git a/src/auditordb/pg_update_auditor_progress_purse.h b/src/auditordb/pg_update_auditor_progress_purse.h new file mode 100644 index 00000000..12a643e5 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_purse.h @@ -0,0 +1,44 @@ +/* +   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 pg_update_auditor_progress_purse.h + * @brief implementation of the update_auditor_progress_purse function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_AUDITOR_PROGRESS_PURSE_H +#define PG_UPDATE_AUDITOR_PROGRESS_PURSE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppp where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_purse ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointPurse *ppp); + +#endif diff --git a/src/auditordb/pg_update_auditor_progress_reserve.c b/src/auditordb/pg_update_auditor_progress_reserve.c new file mode 100644 index 00000000..a8ef3928 --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_reserve.c @@ -0,0 +1,64 @@ +/* +   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 pg_update_auditor_progress_reserve.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_auditor_progress_reserve.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointReserve *ppr) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_recoup_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_open_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_purse_decisions_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_account_merges_serial_id), +    GNUNET_PQ_query_param_uint64 (&ppr->last_history_requests_serial_id), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_progress_update_reserve", +           "UPDATE auditor_progress_reserve SET " +           " last_reserve_in_serial_id=$1" +           ",last_reserve_out_serial_id=$2" +           ",last_reserve_recoup_serial_id=$3" +           ",last_reserve_open_serial_id=$4" +           ",last_reserve_close_serial_id=$5" +           ",last_purse_decision_serial_id=$6" +           ",last_account_merges_serial_id=$7" +           ",last_history_requests_serial_id=$8" +           " WHERE master_pub=$9"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_progress_update_reserve", +                                             params); +} diff --git a/src/auditordb/pg_update_auditor_progress_reserve.h b/src/auditordb/pg_update_auditor_progress_reserve.h new file mode 100644 index 00000000..3feaa0dc --- /dev/null +++ b/src/auditordb/pg_update_auditor_progress_reserve.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 pg_update_auditor_progress_reserve.h + * @brief implementation of the update_auditor_progress_reserve function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_AUDITOR_PROGRESS_RESERVE_H +#define PG_UPDATE_AUDITOR_PROGRESS_RESERVE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param ppr where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_auditor_progress_reserve ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ProgressPointReserve *ppr); + +#endif diff --git a/src/auditordb/pg_update_balance_summary.c b/src/auditordb/pg_update_balance_summary.c new file mode 100644 index 00000000..96f074cb --- /dev/null +++ b/src/auditordb/pg_update_balance_summary.c @@ -0,0 +1,75 @@ +/* +   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 pg_update_balance_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_balance_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (&dfb->total_escrowed), +    TALER_PQ_query_param_amount (&dfb->deposit_fee_balance), +    TALER_PQ_query_param_amount (&dfb->melt_fee_balance), +    TALER_PQ_query_param_amount (&dfb->refund_fee_balance), +    TALER_PQ_query_param_amount (&dfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&dfb->open_deposit_fee_balance), +    TALER_PQ_query_param_amount (&dfb->risk), +    TALER_PQ_query_param_amount (&dfb->loss), +    TALER_PQ_query_param_amount (&dfb->irregular_loss), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_balance_summary_update", +           "UPDATE auditor_balance_summary SET" +           " denom_balance_val=$1" +           ",denom_balance_frac=$2" +           ",deposit_fee_balance_val=$3" +           ",deposit_fee_balance_frac=$4" +           ",melt_fee_balance_val=$5" +           ",melt_fee_balance_frac=$6" +           ",refund_fee_balance_val=$7" +           ",refund_fee_balance_frac=$8" +           ",purse_fee_balance_val=$9" +           ",purse_fee_balance_frac=$10" +           ",open_deposit_fee_balance_val=$11" +           ",open_deposit_fee_balance_frac=$12" +           ",risk_val=$13" +           ",risk_frac=$14" +           ",loss_val=$15" +           ",loss_frac=$16" +           ",irregular_loss_val=$17" +           ",irregular_loss_frac=$18" +           " WHERE master_pub=$19;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_balance_summary_update", +                                             params); +} diff --git a/src/auditordb/pg_update_balance_summary.h b/src/auditordb/pg_update_balance_summary.h new file mode 100644 index 00000000..dbb721ec --- /dev/null +++ b/src/auditordb/pg_update_balance_summary.h @@ -0,0 +1,44 @@ +/* +   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 pg_update_balance_summary.h + * @brief implementation of the update_balance_summary function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_BALANCE_SUMMARY_H +#define PG_UPDATE_BALANCE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about an exchange's denomination balances.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param dfb denomination balance data to store + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_balance_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb); + +#endif diff --git a/src/auditordb/pg_update_denomination_balance.c b/src/auditordb/pg_update_denomination_balance.c new file mode 100644 index 00000000..2fb0f564 --- /dev/null +++ b/src/auditordb/pg_update_denomination_balance.c @@ -0,0 +1,62 @@ +/* +   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 pg_update_denomination_balance.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_denomination_balance.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  const struct TALER_AUDITORDB_DenominationCirculationData *dcd) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (&dcd->denom_balance), +    TALER_PQ_query_param_amount (&dcd->denom_loss), +    GNUNET_PQ_query_param_uint64 (&dcd->num_issued), +    TALER_PQ_query_param_amount (&dcd->denom_risk), +    TALER_PQ_query_param_amount (&dcd->recoup_loss), +    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_denomination_pending_update", +           "UPDATE auditor_denomination_pending SET" +           " denom_balance_val=$1" +           ",denom_balance_frac=$2" +           ",denom_loss_val=$3" +           ",denom_loss_frac=$4" +           ",num_issued=$5" +           ",denom_risk_val=$6" +           ",denom_risk_frac=$7" +           ",recoup_loss_val=$8" +           ",recoup_loss_frac=$9" +           " WHERE denom_pub_hash=$10"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_denomination_pending_update", +                                             params); +} diff --git a/src/auditordb/pg_update_denomination_balance.h b/src/auditordb/pg_update_denomination_balance.h new file mode 100644 index 00000000..474fcaaf --- /dev/null +++ b/src/auditordb/pg_update_denomination_balance.h @@ -0,0 +1,45 @@ +/* +   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 pg_update_denomination_balance.h + * @brief implementation of the update_denomination_balance function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_DENOMINATION_BALANCE_H +#define PG_UPDATE_DENOMINATION_BALANCE_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about a denomination key's balances.  There + * must be an existing record for the denomination key. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param denom_pub_hash hash of the denomination public key + * @param dcd circulation data to store + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_denomination_balance ( +  void *cls, +  const struct TALER_DenominationHashP *denom_pub_hash, +  const struct TALER_AUDITORDB_DenominationCirculationData *dcd); + + +#endif diff --git a/src/auditordb/pg_update_predicted_result.c b/src/auditordb/pg_update_predicted_result.c new file mode 100644 index 00000000..5c9618ad --- /dev/null +++ b/src/auditordb/pg_update_predicted_result.c @@ -0,0 +1,55 @@ +/* +   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 pg_update_predicted_result.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_predicted_result.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_predicted_result ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *balance, +  const struct TALER_Amount *drained) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (balance), +    TALER_PQ_query_param_amount (drained), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_predicted_result_update", +           "UPDATE auditor_predicted_result SET" +           " balance_val=$1" +           ",balance_frac=$2" +           ",drained_val=$3" +           ",drained_frac=$4" +           " WHERE master_pub=$5;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_predicted_result_update", +                                             params); +} diff --git a/src/auditordb/pg_update_predicted_result.h b/src/auditordb/pg_update_predicted_result.h new file mode 100644 index 00000000..e70d079d --- /dev/null +++ b/src/auditordb/pg_update_predicted_result.h @@ -0,0 +1,46 @@ +/* +   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 pg_update_predicted_result.h + * @brief implementation of the update_predicted_result function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_PREDICTED_RESULT_H +#define PG_UPDATE_PREDICTED_RESULT_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about an exchange's predicted balance.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param balance what the bank account balance of the exchange should show + * @param drained amount that was drained in profits + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_predicted_result ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *balance, +  const struct TALER_Amount *drained); + +#endif diff --git a/src/auditordb/pg_update_reserve_info.c b/src/auditordb/pg_update_reserve_info.c new file mode 100644 index 00000000..49d4f025 --- /dev/null +++ b/src/auditordb/pg_update_reserve_info.c @@ -0,0 +1,72 @@ +/* +   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 pg_update_reserve_info.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_reserve_info.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_reserve_info ( +  void *cls, +  const struct TALER_ReservePublicKeyP *reserve_pub, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +  struct GNUNET_TIME_Timestamp expiration_date) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (&rfb->reserve_balance), +    TALER_PQ_query_param_amount (&rfb->reserve_loss), +    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), +    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&rfb->open_fee_balance), +    TALER_PQ_query_param_amount (&rfb->history_fee_balance), +    GNUNET_PQ_query_param_timestamp (&expiration_date), +    GNUNET_PQ_query_param_auto_from_type (reserve_pub), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_reserves_update", +           "UPDATE auditor_reserves SET" +           " reserve_balance_val=$1" +           ",reserve_balance_frac=$2" +           ",reserve_loss_val=$3" +           ",reserve_loss_frac=$4" +           ",withdraw_fee_balance_val=$5" +           ",withdraw_fee_balance_frac=$6" +           ",purse_fee_balance_val=$7" +           ",purse_fee_balance_frac=$8" +           ",open_fee_balance_val=$9" +           ",open_fee_balance_frac=$10" +           ",history_fee_balance_val=$11" +           ",history_fee_balance_frac=$12" +           ",expiration_date=$13" +           " WHERE reserve_pub=$14" +           " AND master_pub=$15;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_reserves_update", +                                             params); +} diff --git a/src/auditordb/pg_update_reserve_info.h b/src/auditordb/pg_update_reserve_info.h new file mode 100644 index 00000000..1c7707f0 --- /dev/null +++ b/src/auditordb/pg_update_reserve_info.h @@ -0,0 +1,48 @@ +/* +   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 pg_update_reserve_info.h + * @brief implementation of the update_reserve_info function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_RESERVE_INFO_H +#define PG_UPDATE_RESERVE_INFO_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about a reserve.  Destructively updates an + * existing record, which must already exist. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param reserve_pub public key of the reserve + * @param master_pub master public key of the exchange + * @param rfb amounts for the reserve + * @param expiration_date expiration date of the reserve + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_reserve_info ( +  void *cls, +  const struct TALER_ReservePublicKeyP *reserve_pub, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, +  struct GNUNET_TIME_Timestamp expiration_date); + +#endif diff --git a/src/auditordb/pg_update_reserve_summary.c b/src/auditordb/pg_update_reserve_summary.c new file mode 100644 index 00000000..3cb18ea5 --- /dev/null +++ b/src/auditordb/pg_update_reserve_summary.c @@ -0,0 +1,69 @@ +/* +   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 pg_update_reserve_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_reserve_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_reserve_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (&rfb->reserve_balance), +    TALER_PQ_query_param_amount (&rfb->reserve_loss), +    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), +    TALER_PQ_query_param_amount (&rfb->close_fee_balance), +    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), +    TALER_PQ_query_param_amount (&rfb->open_fee_balance), +    TALER_PQ_query_param_amount (&rfb->history_fee_balance), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_reserve_balance_update", +           "UPDATE auditor_reserve_balance SET" +           " reserve_balance_val=$1" +           ",reserve_balance_frac=$2" +           ",reserve_loss_val=$3" +           ",reserve_loss_frac=$4" +           ",withdraw_fee_balance_val=$5" +           ",withdraw_fee_balance_frac=$6" +           ",close_fee_balance_val=$7" +           ",close_fee_balance_frac=$8" +           ",purse_fee_balance_val=$9" +           ",purse_fee_balance_frac=$10" +           ",open_fee_balance_val=$11" +           ",open_fee_balance_frac=$12" +           ",history_fee_balance_val=$13" +           ",history_fee_balance_frac=$14" +           " WHERE master_pub=$15;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_reserve_balance_update", +                                             params); +} diff --git a/src/auditordb/pg_update_reserve_summary.h b/src/auditordb/pg_update_reserve_summary.h new file mode 100644 index 00000000..50d73075 --- /dev/null +++ b/src/auditordb/pg_update_reserve_summary.h @@ -0,0 +1,45 @@ +/* +   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 pg_update_reserve_summary.h + * @brief implementation of the update_reserve_summary function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_RESERVE_SUMMARY_H +#define PG_UPDATE_RESERVE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about all reserves.  Destructively updates an + * existing record, which must already exist. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param rfb balances to be stored for the reserve + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_reserve_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb); + + +#endif diff --git a/src/auditordb/pg_update_wire_auditor_account_progress.c b/src/auditordb/pg_update_wire_auditor_account_progress.c new file mode 100644 index 00000000..ff01be09 --- /dev/null +++ b/src/auditordb/pg_update_wire_auditor_account_progress.c @@ -0,0 +1,59 @@ +/* +   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 pg_update_wire_auditor_account_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_wire_auditor_account_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), +    GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), +    GNUNET_PQ_query_param_uint64 (&bapp->in_wire_off), +    GNUNET_PQ_query_param_uint64 (&bapp->out_wire_off), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_string (account_name), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "wire_auditor_account_progress_update", +           "UPDATE wire_auditor_account_progress SET " +           " last_wire_reserve_in_serial_id=$1" +           ",last_wire_wire_out_serial_id=$2" +           ",wire_in_off=$3" +           ",wire_out_off=$4" +           " WHERE master_pub=$5 AND account_name=$6"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "wire_auditor_account_progress_update", +                                             params); +} diff --git a/src/auditordb/pg_update_wire_auditor_account_progress.h b/src/auditordb/pg_update_wire_auditor_account_progress.h new file mode 100644 index 00000000..03f5701c --- /dev/null +++ b/src/auditordb/pg_update_wire_auditor_account_progress.h @@ -0,0 +1,49 @@ +/* +   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 pg_update_wire_auditor_account_progress.h + * @brief implementation of the update_wire_auditor_account_progress function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_WIRE_AUDITOR_ACCOUNT_PROGRESS_H +#define PG_UPDATE_WIRE_AUDITOR_ACCOUNT_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param account_name name of the wire account we are auditing + * @param pp where is the auditor in processing + * @param bapp progress in wire transaction histories + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_auditor_account_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const char *account_name, +  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, +  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp); + + +#endif diff --git a/src/auditordb/pg_update_wire_auditor_progress.c b/src/auditordb/pg_update_wire_auditor_progress.c new file mode 100644 index 00000000..5fb0ff31 --- /dev/null +++ b/src/auditordb/pg_update_wire_auditor_progress.c @@ -0,0 +1,52 @@ +/* +   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 pg_update_wire_auditor_progress.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_wire_auditor_progress.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_WireProgressPoint *pp) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    GNUNET_PQ_query_param_timestamp (&pp->last_timestamp), +    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_uuid), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "wire_auditor_progress_update", +           "UPDATE wire_auditor_progress SET " +           " last_timestamp=$1" +           ",last_reserve_close_uuid=$2" +           " WHERE master_pub=$3"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "wire_auditor_progress_update", +                                             params); +} diff --git a/src/auditordb/pg_update_wire_auditor_progress.h b/src/auditordb/pg_update_wire_auditor_progress.h new file mode 100644 index 00000000..e46c6119 --- /dev/null +++ b/src/auditordb/pg_update_wire_auditor_progress.h @@ -0,0 +1,45 @@ +/* +   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 pg_update_wire_auditor_progress.h + * @brief implementation of the update_wire_auditor_progress function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_WIRE_AUDITOR_PROGRESS_H +#define PG_UPDATE_WIRE_AUDITOR_PROGRESS_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Update information about the progress of the auditor.  There + * must be an existing record for the exchange. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master key of the exchange + * @param pp where is the auditor in processing + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_auditor_progress ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_AUDITORDB_WireProgressPoint *pp); + + +#endif diff --git a/src/auditordb/pg_update_wire_fee_summary.c b/src/auditordb/pg_update_wire_fee_summary.c new file mode 100644 index 00000000..28ee39c4 --- /dev/null +++ b/src/auditordb/pg_update_wire_fee_summary.c @@ -0,0 +1,51 @@ +/* +   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 pg_update_wire_fee_summary.c + * @brief Low-level (statement-level) Postgres database access for the exchange + * @author Christian Grothoff + */ +#include "platform.h" +#include "taler_error_codes.h" +#include "taler_dbevents.h" +#include "taler_pq_lib.h" +#include "pg_update_wire_fee_summary.h" +#include "pg_helper.h" + + +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_fee_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *wire_fee_balance) +{ +  struct PostgresClosure *pg = cls; +  struct GNUNET_PQ_QueryParam params[] = { +    TALER_PQ_query_param_amount (wire_fee_balance), +    GNUNET_PQ_query_param_auto_from_type (master_pub), +    GNUNET_PQ_query_param_end +  }; + +  PREPARE (pg, +           "auditor_wire_fee_balance_update", +           "UPDATE auditor_wire_fee_balance SET" +           " wire_fee_balance_val=$1" +           ",wire_fee_balance_frac=$2" +           " WHERE master_pub=$3;"); +  return GNUNET_PQ_eval_prepared_non_select (pg->conn, +                                             "auditor_wire_fee_balance_update", +                                             params); +} diff --git a/src/auditordb/pg_update_wire_fee_summary.h b/src/auditordb/pg_update_wire_fee_summary.h new file mode 100644 index 00000000..5a1760ee --- /dev/null +++ b/src/auditordb/pg_update_wire_fee_summary.h @@ -0,0 +1,44 @@ +/* +   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 pg_update_wire_fee_summary.h + * @brief implementation of the update_wire_fee_summary function + * @author Christian Grothoff + */ +#ifndef PG_UPDATE_WIRE_FEE_SUMMARY_H +#define PG_UPDATE_WIRE_FEE_SUMMARY_H + +#include "taler_util.h" +#include "taler_json_lib.h" +#include "taler_auditordb_plugin.h" + + +/** + * Insert information about exchange's wire fee balance.  Destructively updates an + * existing record, which must already exist. + * + * @param cls the @e cls of this struct with the plugin-specific state + * @param master_pub master public key of the exchange + * @param wire_fee_balance amount the exchange gained in wire fees + * @return transaction status code + */ +enum GNUNET_DB_QueryStatus +TAH_PG_update_wire_fee_summary ( +  void *cls, +  const struct TALER_MasterPublicKeyP *master_pub, +  const struct TALER_Amount *wire_fee_balance); + +#endif diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c index 318311d4..2a6f200c 100644 --- a/src/auditordb/plugin_auditordb_postgres.c +++ b/src/auditordb/plugin_auditordb_postgres.c @@ -21,70 +21,78 @@   */  #include "platform.h"  #include "taler_pq_lib.h" -#include "taler_auditordb_plugin.h"  #include <pthread.h>  #include <libpq-fe.h> - +#include "pg_helper.h" +#include "pg_insert_auditor_progress_reserve.h" +#include "pg_update_auditor_progress_reserve.h" +#include "pg_get_auditor_progress_reserve.h" +#include "pg_insert_auditor_progress_purse.h" +#include "pg_update_auditor_progress_purse.h" +#include "pg_get_auditor_progress_purse.h" +#include "pg_insert_auditor_progress_aggregation.h" +#include "pg_update_auditor_progress_aggregation.h" +#include "pg_get_auditor_progress_aggregation.h" +#include "pg_insert_auditor_progress_deposit_confirmation.h" +#include "pg_update_auditor_progress_deposit_confirmation.h" +#include "pg_get_auditor_progress_deposit_confirmation.h" +#include "pg_insert_auditor_progress_coin.h" +#include "pg_update_auditor_progress_coin.h" +#include "pg_get_auditor_progress_coin.h" +#include "pg_insert_wire_auditor_account_progress.h" +#include "pg_update_wire_auditor_account_progress.h" +#include "pg_get_wire_auditor_account_progress.h" +#include "pg_insert_wire_auditor_progress.h" +#include "pg_update_wire_auditor_progress.h" +#include "pg_get_wire_auditor_progress.h" +#include "pg_insert_reserve_info.h" +#include "pg_update_reserve_info.h" +#include "pg_del_reserve_info.h" +#include "pg_get_reserve_info.h" +#include "pg_insert_reserve_summary.h" +#include "pg_update_reserve_summary.h" +#include "pg_get_reserve_summary.h" +#include "pg_insert_wire_fee_summary.h" +#include "pg_update_wire_fee_summary.h" +#include "pg_get_wire_fee_summary.h" +#include "pg_insert_denomination_balance.h" +#include "pg_update_denomination_balance.h" +#include "pg_get_denomination_balance.h" +#include "pg_insert_balance_summary.h" +#include "pg_update_balance_summary.h" +#include "pg_get_balance_summary.h" +#include "pg_insert_historic_denom_revenue.h" +#include "pg_select_historic_denom_revenue.h" +#include "pg_insert_historic_reserve_revenue.h" +#include "pg_select_historic_reserve_revenue.h" +#include "pg_insert_predicted_result.h" +#include "pg_update_predicted_result.h" +#include "pg_get_predicted_balance.h" +#include "pg_insert_exchange.h" +#include "pg_list_exchanges.h" +#include "pg_delete_exchange.h" +#include "pg_insert_exchange_signkey.h" +#include "pg_insert_deposit_confirmation.h" +#include "pg_get_deposit_confirmations.h" +#include "pg_insert_auditor_progress_coin.h" +#include "pg_update_auditor_progress_coin.h" +#include "pg_get_auditor_progress_coin.h" +#include "pg_insert_auditor_progress_purse.h" +#include "pg_update_auditor_progress_purse.h" +#include "pg_get_auditor_progress_purse.h" +#include "pg_get_reserve_info.h" +#include "pg_insert_historic_reserve_revenue.h" +#include "pg_insert_wire_auditor_progress.h" +#include "pg_update_wire_auditor_progress.h" +#include "pg_get_wire_auditor_progress.h" +#include "pg_insert_historic_reserve_revenue.h" +#include "pg_helper.h"  #define LOG(kind,...) GNUNET_log_from (kind, "taler-auditordb-postgres", \                                         __VA_ARGS__)  /** - * Wrapper macro to add the currency from the plugin's state - * when fetching amounts from the database. - * - * @param field name of the database field to fetch amount from - * @param[out] amountp pointer to amount to set - */ -#define TALER_PQ_RESULT_SPEC_AMOUNT(field,amountp) \ -  TALER_PQ_result_spec_amount (                    \ -    field,pg->currency,amountp) - -/** - * Wrapper macro to add the currency from the plugin's state - * when fetching amounts from the database.  NBO variant. - * - * @param field name of the database field to fetch amount from - * @param[out] amountp pointer to amount to set - */ -#define TALER_PQ_RESULT_SPEC_AMOUNT_NBO(field, \ -                                        amountp) TALER_PQ_result_spec_amount_nbo ( \ -    field,pg->currency,amountp) - - -/** - * Type of the "cls" argument given to each of the functions in - * our API. - */ -struct PostgresClosure -{ - -  /** -   * Postgres connection handle. -   */ -  struct GNUNET_PQ_Context *conn; - -  /** -   * Name of the ongoing transaction, used to debug cases where -   * a transaction is not properly terminated via COMMIT or -   * ROLLBACK. -   */ -  const char *transaction_name; - -  /** -   * Our configuration. -   */ -  const struct GNUNET_CONFIGURATION_Handle *cfg; - -  /** -   * Which currency should we assume all amounts to be in? -   */ -  char *currency; -}; - - -/**   * Drop all auditor tables OR deletes recoverable auditor state.   * This should only be used by testcases or when restarting the   * auditor from scratch. @@ -154,586 +162,6 @@ postgres_create_tables (void *cls)  static enum GNUNET_GenericReturnValue  setup_connection (struct PostgresClosure *pg)  { -  struct GNUNET_PQ_PreparedStatement ps[] = { -    /* used in #postgres_commit */ -    GNUNET_PQ_make_prepare ("do_commit", -                            "COMMIT"), -    /* used in #postgres_insert_exchange */ -    GNUNET_PQ_make_prepare ("auditor_insert_exchange", -                            "INSERT INTO auditor_exchanges " -                            "(master_pub" -                            ",exchange_url" -                            ") VALUES ($1,$2);"), -    /* used in #postgres_delete_exchange */ -    GNUNET_PQ_make_prepare ("auditor_delete_exchange", -                            "DELETE" -                            " FROM auditor_exchanges" -                            " WHERE master_pub=$1;"), -    /* used in #postgres_list_exchanges */ -    GNUNET_PQ_make_prepare ("auditor_list_exchanges", -                            "SELECT" -                            " master_pub" -                            ",exchange_url" -                            " FROM auditor_exchanges"), -    /* used in #postgres_insert_exchange_signkey */ -    GNUNET_PQ_make_prepare ("auditor_insert_exchange_signkey", -                            "INSERT INTO auditor_exchange_signkeys " -                            "(master_pub" -                            ",ep_start" -                            ",ep_expire" -                            ",ep_end" -                            ",exchange_pub" -                            ",master_sig" -                            ") VALUES ($1,$2,$3,$4,$5,$6);"), -    /* Used in #postgres_insert_deposit_confirmation() */ -    GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_insert", -                            "INSERT INTO deposit_confirmations " -                            "(master_pub" -                            ",h_contract_terms" -                            ",h_extensions" -                            ",h_wire" -                            ",exchange_timestamp" -                            ",wire_deadline" -                            ",refund_deadline" -                            ",amount_without_fee_val" -                            ",amount_without_fee_frac" -                            ",coin_pub" -                            ",merchant_pub" -                            ",exchange_sig" -                            ",exchange_pub" -                            ",master_sig" /* master_sig could be normalized... */ -                            ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14);"), -    /* Used in #postgres_get_deposit_confirmations() */ -    GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_select", -                            "SELECT" -                            " serial_id" -                            ",h_contract_terms" -                            ",h_extensions" -                            ",h_wire" -                            ",exchange_timestamp" -                            ",wire_deadline" -                            ",refund_deadline" -                            ",amount_without_fee_val" -                            ",amount_without_fee_frac" -                            ",coin_pub" -                            ",merchant_pub" -                            ",exchange_sig" -                            ",exchange_pub" -                            ",master_sig" /* master_sig could be normalized... */ -                            " FROM deposit_confirmations" -                            " WHERE master_pub=$1" -                            " AND serial_id>$2"), -    /* Used in #postgres_update_auditor_progress_reserve() */ -    GNUNET_PQ_make_prepare ("auditor_progress_update_reserve", -                            "UPDATE auditor_progress_reserve SET " -                            " last_reserve_in_serial_id=$1" -                            ",last_reserve_out_serial_id=$2" -                            ",last_reserve_recoup_serial_id=$3" -                            ",last_reserve_open_serial_id=$4" -                            ",last_reserve_close_serial_id=$5" -                            ",last_purse_decision_serial_id=$6" -                            ",last_account_merges_serial_id=$7" -                            ",last_history_requests_serial_id=$8" -                            " WHERE master_pub=$9"), -    /* Used in #postgres_get_auditor_progress_reserve() */ -    GNUNET_PQ_make_prepare ("auditor_progress_select_reserve", -                            "SELECT" -                            " last_reserve_in_serial_id" -                            ",last_reserve_out_serial_id" -                            ",last_reserve_recoup_serial_id" -                            ",last_reserve_close_serial_id" -                            ",last_purse_decision_serial_id" -                            ",last_account_merges_serial_id" -                            ",last_history_requests_serial_id" -                            ",last_reserve_open_serial_id" -                            " FROM auditor_progress_reserve" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_auditor_progress_reserve() */ -    GNUNET_PQ_make_prepare ("auditor_progress_insert_reserve", -                            "INSERT INTO auditor_progress_reserve " -                            "(master_pub" -                            ",last_reserve_in_serial_id" -                            ",last_reserve_out_serial_id" -                            ",last_reserve_recoup_serial_id" -                            ",last_reserve_open_serial_id" -                            ",last_reserve_close_serial_id" -                            ",last_purse_decision_serial_id" -                            ",last_account_merges_serial_id" -                            ",last_history_requests_serial_id" -                            ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);"), -    /* Used in #postgres_update_auditor_progress_purse() */ -    GNUNET_PQ_make_prepare ("auditor_progress_update_purse", -                            "UPDATE auditor_progress_purse SET " -                            " last_purse_request_serial_id=$1" -                            ",last_purse_decision_serial_id=$2" -                            ",last_purse_merges_serial_id=$3" -                            ",last_account_merges_serial_id=$4" -                            ",last_purse_deposits_serial_id=$5" -                            " WHERE master_pub=$6"), -    /* Used in #postgres_get_auditor_progress_purse() */ -    GNUNET_PQ_make_prepare ("auditor_progress_select_purse", -                            "SELECT" -                            " last_purse_request_serial_id" -                            ",last_purse_decision_serial_id" -                            ",last_purse_merges_serial_id" -                            ",last_account_merges_serial_id" -                            ",last_purse_deposits_serial_id" -                            " FROM auditor_progress_purse" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_auditor_progress_purse() */ -    GNUNET_PQ_make_prepare ("auditor_progress_insert_purse", -                            "INSERT INTO auditor_progress_purse " -                            "(master_pub" -                            ",last_purse_request_serial_id" -                            ",last_purse_decision_serial_id" -                            ",last_purse_merges_serial_id" -                            ",last_account_merges_serial_id" -                            ",last_purse_deposits_serial_id" -                            ") VALUES ($1,$2,$3,$4,$5,$6);"), -    /* Used in #postgres_update_auditor_progress_aggregation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_update_aggregation", -                            "UPDATE auditor_progress_aggregation SET " -                            " last_wire_out_serial_id=$1" -                            " WHERE master_pub=$2"), -    /* Used in #postgres_get_auditor_progress_aggregation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_select_aggregation", -                            "SELECT" -                            " last_wire_out_serial_id" -                            " FROM auditor_progress_aggregation" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_auditor_progress_aggregation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_insert_aggregation", -                            "INSERT INTO auditor_progress_aggregation " -                            "(master_pub" -                            ",last_wire_out_serial_id" -                            ") VALUES ($1,$2);"), -    /* Used in #postgres_update_auditor_progress_deposit_confirmation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_update_deposit_confirmation", -                            "UPDATE auditor_progress_deposit_confirmation SET " -                            " last_deposit_confirmation_serial_id=$1" -                            " WHERE master_pub=$2"), -    /* Used in #postgres_get_auditor_progress_deposit_confirmation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_select_deposit_confirmation", -                            "SELECT" -                            " last_deposit_confirmation_serial_id" -                            " FROM auditor_progress_deposit_confirmation" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_auditor_progress_deposit_confirmation() */ -    GNUNET_PQ_make_prepare ("auditor_progress_insert_deposit_confirmation", -                            "INSERT INTO auditor_progress_deposit_confirmation " -                            "(master_pub" -                            ",last_deposit_confirmation_serial_id" -                            ") VALUES ($1,$2);"), -    /* Used in #postgres_update_auditor_progress_coin() */ -    GNUNET_PQ_make_prepare ("auditor_progress_update_coin", -                            "UPDATE auditor_progress_coin SET " -                            " last_withdraw_serial_id=$1" -                            ",last_deposit_serial_id=$2" -                            ",last_melt_serial_id=$3" -                            ",last_refund_serial_id=$4" -                            ",last_recoup_serial_id=$5" -                            ",last_recoup_refresh_serial_id=$6" -                            ",last_purse_deposits_serial_id=$7" -                            ",last_purse_decision_serial_id=$8" -                            " WHERE master_pub=$9"), -    /* Used in #postgres_get_auditor_progress_coin() */ -    GNUNET_PQ_make_prepare ("auditor_progress_select_coin", -                            "SELECT" -                            " last_withdraw_serial_id" -                            ",last_deposit_serial_id" -                            ",last_melt_serial_id" -                            ",last_refund_serial_id" -                            ",last_recoup_serial_id" -                            ",last_recoup_refresh_serial_id" -                            ",last_purse_deposits_serial_id" -                            ",last_purse_decision_serial_id" -                            " FROM auditor_progress_coin" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_auditor_progress() */ -    GNUNET_PQ_make_prepare ("auditor_progress_insert_coin", -                            "INSERT INTO auditor_progress_coin " -                            "(master_pub" -                            ",last_withdraw_serial_id" -                            ",last_deposit_serial_id" -                            ",last_melt_serial_id" -                            ",last_refund_serial_id" -                            ",last_recoup_serial_id" -                            ",last_recoup_refresh_serial_id" -                            ",last_purse_deposits_serial_id" -                            ",last_purse_decision_serial_id" -                            ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9);"), -    /* Used in #postgres_insert_wire_auditor_account_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_account_progress_insert", -                            "INSERT INTO wire_auditor_account_progress " -                            "(master_pub" -                            ",account_name" -                            ",last_wire_reserve_in_serial_id" -                            ",last_wire_wire_out_serial_id" -                            ",wire_in_off" -                            ",wire_out_off" -                            ") VALUES ($1,$2,$3,$4,$5,$6);"), -    /* Used in #postgres_update_wire_auditor_account_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_account_progress_update", -                            "UPDATE wire_auditor_account_progress SET " -                            " last_wire_reserve_in_serial_id=$1" -                            ",last_wire_wire_out_serial_id=$2" -                            ",wire_in_off=$3" -                            ",wire_out_off=$4" -                            " WHERE master_pub=$5 AND account_name=$6"), -    /* Used in #postgres_get_wire_auditor_account_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_account_progress_select", -                            "SELECT" -                            " last_wire_reserve_in_serial_id" -                            ",last_wire_wire_out_serial_id" -                            ",wire_in_off" -                            ",wire_out_off" -                            " FROM wire_auditor_account_progress" -                            " WHERE master_pub=$1 AND account_name=$2;"), -    /* Used in #postgres_insert_wire_auditor_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_progress_insert", -                            "INSERT INTO wire_auditor_progress " -                            "(master_pub" -                            ",last_timestamp" -                            ",last_reserve_close_uuid" -                            ") VALUES ($1,$2,$3);"), -    /* Used in #postgres_update_wire_auditor_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_progress_update", -                            "UPDATE wire_auditor_progress SET " -                            " last_timestamp=$1" -                            ",last_reserve_close_uuid=$2" -                            " WHERE master_pub=$3"), -    /* Used in #postgres_get_wire_auditor_progress() */ -    GNUNET_PQ_make_prepare ("wire_auditor_progress_select", -                            "SELECT" -                            " last_timestamp" -                            ",last_reserve_close_uuid" -                            " FROM wire_auditor_progress" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_reserve_info() */ -    GNUNET_PQ_make_prepare ("auditor_reserves_insert", -                            "INSERT INTO auditor_reserves " -                            "(reserve_pub" -                            ",master_pub" -                            ",reserve_balance_val" -                            ",reserve_balance_frac" -                            ",reserve_loss_val" -                            ",reserve_loss_frac" -                            ",withdraw_fee_balance_val" -                            ",withdraw_fee_balance_frac" -                            ",close_fee_balance_val" -                            ",close_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_fee_balance_val" -                            ",open_fee_balance_frac" -                            ",history_fee_balance_val" -                            ",history_fee_balance_frac" -                            ",expiration_date" -                            ",origin_account" -                            ") VALUES " -                            "($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18);"), -    /* Used in #postgres_update_reserve_info() */ -    GNUNET_PQ_make_prepare ("auditor_reserves_update", -                            "UPDATE auditor_reserves SET" -                            " reserve_balance_val=$1" -                            ",reserve_balance_frac=$2" -                            ",reserve_loss_val=$3" -                            ",reserve_loss_frac=$4" -                            ",withdraw_fee_balance_val=$5" -                            ",withdraw_fee_balance_frac=$6" -                            ",purse_fee_balance_val=$7" -                            ",purse_fee_balance_frac=$8" -                            ",open_fee_balance_val=$9" -                            ",open_fee_balance_frac=$10" -                            ",history_fee_balance_val=$11" -                            ",history_fee_balance_frac=$12" -                            ",expiration_date=$13" -                            " WHERE reserve_pub=$14" -                            " AND master_pub=$15;"), -    /* Used in #postgres_get_reserve_info() */ -    GNUNET_PQ_make_prepare ("auditor_reserves_select", -                            "SELECT" -                            " reserve_balance_val" -                            ",reserve_balance_frac" -                            ",reserve_loss_val" -                            ",reserve_loss_frac" -                            ",withdraw_fee_balance_val" -                            ",withdraw_fee_balance_frac" -                            ",close_fee_balance_val" -                            ",close_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_fee_balance_val" -                            ",open_fee_balance_frac" -                            ",history_fee_balance_val" -                            ",history_fee_balance_frac" -                            ",expiration_date" -                            ",auditor_reserves_rowid" -                            ",origin_account" -                            " FROM auditor_reserves" -                            " WHERE reserve_pub=$1 AND master_pub=$2;"), -    /* Used in #postgres_del_reserve_info() */ -    GNUNET_PQ_make_prepare ("auditor_reserves_delete", -                            "DELETE" -                            " FROM auditor_reserves" -                            " WHERE reserve_pub=$1 AND master_pub=$2;"), -    /* Used in #postgres_insert_reserve_summary() */ -    GNUNET_PQ_make_prepare ("auditor_reserve_balance_insert", -                            "INSERT INTO auditor_reserve_balance" -                            "(master_pub" -                            ",reserve_balance_val" -                            ",reserve_balance_frac" -                            ",reserve_loss_val" -                            ",reserve_loss_frac" -                            ",withdraw_fee_balance_val" -                            ",withdraw_fee_balance_frac" -                            ",close_fee_balance_val" -                            ",close_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_fee_balance_val" -                            ",open_fee_balance_frac" -                            ",history_fee_balance_val" -                            ",history_fee_balance_frac" -                            ") VALUES " -                            "($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15)"), -    /* Used in #postgres_update_reserve_summary() */ -    GNUNET_PQ_make_prepare ("auditor_reserve_balance_update", -                            "UPDATE auditor_reserve_balance SET" -                            " reserve_balance_val=$1" -                            ",reserve_balance_frac=$2" -                            ",reserve_loss_val=$3" -                            ",reserve_loss_frac=$4" -                            ",withdraw_fee_balance_val=$5" -                            ",withdraw_fee_balance_frac=$6" -                            ",close_fee_balance_val=$7" -                            ",close_fee_balance_frac=$8" -                            ",purse_fee_balance_val=$9" -                            ",purse_fee_balance_frac=$10" -                            ",open_fee_balance_val=$11" -                            ",open_fee_balance_frac=$12" -                            ",history_fee_balance_val=$13" -                            ",history_fee_balance_frac=$14" -                            " WHERE master_pub=$15;"), -    /* Used in #postgres_get_reserve_summary() */ -    GNUNET_PQ_make_prepare ("auditor_reserve_balance_select", -                            "SELECT" -                            " reserve_balance_val" -                            ",reserve_balance_frac" -                            ",reserve_loss_val" -                            ",reserve_loss_frac" -                            ",withdraw_fee_balance_val" -                            ",withdraw_fee_balance_frac" -                            ",close_fee_balance_val" -                            ",close_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_fee_balance_val" -                            ",open_fee_balance_frac" -                            ",history_fee_balance_val" -                            ",history_fee_balance_frac" -                            " FROM auditor_reserve_balance" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_wire_fee_summary() */ -    GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_insert", -                            "INSERT INTO auditor_wire_fee_balance" -                            "(master_pub" -                            ",wire_fee_balance_val" -                            ",wire_fee_balance_frac" -                            ") VALUES ($1,$2,$3)"), -    /* Used in #postgres_update_wire_fee_summary() */ -    GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_update", -                            "UPDATE auditor_wire_fee_balance SET" -                            " wire_fee_balance_val=$1" -                            ",wire_fee_balance_frac=$2" -                            " WHERE master_pub=$3;"), -    /* Used in #postgres_get_wire_fee_summary() */ -    GNUNET_PQ_make_prepare ("auditor_wire_fee_balance_select", -                            "SELECT" -                            " wire_fee_balance_val" -                            ",wire_fee_balance_frac" -                            " FROM auditor_wire_fee_balance" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_denomination_balance() */ -    GNUNET_PQ_make_prepare ("auditor_denomination_pending_insert", -                            "INSERT INTO auditor_denomination_pending " -                            "(denom_pub_hash" -                            ",denom_balance_val" -                            ",denom_balance_frac" -                            ",denom_loss_val" -                            ",denom_loss_frac" -                            ",num_issued" -                            ",denom_risk_val" -                            ",denom_risk_frac" -                            ",recoup_loss_val" -                            ",recoup_loss_frac" -                            ") VALUES (" -                            "$1,$2,$3,$4,$5,$6,$7,$8,$9,$10" -                            ");"), -    /* Used in #postgres_update_denomination_balance() */ -    GNUNET_PQ_make_prepare ("auditor_denomination_pending_update", -                            "UPDATE auditor_denomination_pending SET" -                            " denom_balance_val=$1" -                            ",denom_balance_frac=$2" -                            ",denom_loss_val=$3" -                            ",denom_loss_frac=$4" -                            ",num_issued=$5" -                            ",denom_risk_val=$6" -                            ",denom_risk_frac=$7" -                            ",recoup_loss_val=$8" -                            ",recoup_loss_frac=$9" -                            " WHERE denom_pub_hash=$10"), -    /* Used in #postgres_get_denomination_balance() */ -    GNUNET_PQ_make_prepare ("auditor_denomination_pending_select", -                            "SELECT" -                            " denom_balance_val" -                            ",denom_balance_frac" -                            ",denom_loss_val" -                            ",denom_loss_frac" -                            ",num_issued" -                            ",denom_risk_val" -                            ",denom_risk_frac" -                            ",recoup_loss_val" -                            ",recoup_loss_frac" -                            " FROM auditor_denomination_pending" -                            " WHERE denom_pub_hash=$1"), -    /* Used in #postgres_insert_balance_summary() */ -    GNUNET_PQ_make_prepare ("auditor_balance_summary_insert", -                            "INSERT INTO auditor_balance_summary " -                            "(master_pub" -                            ",denom_balance_val" -                            ",denom_balance_frac" -                            ",deposit_fee_balance_val" -                            ",deposit_fee_balance_frac" -                            ",melt_fee_balance_val" -                            ",melt_fee_balance_frac" -                            ",refund_fee_balance_val" -                            ",refund_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_deposit_fee_balance_val" -                            ",open_deposit_fee_balance_frac" -                            ",risk_val" -                            ",risk_frac" -                            ",loss_val" -                            ",loss_frac" -                            ",irregular_loss_val" -                            ",irregular_loss_frac" -                            ") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10," -                            "          $11,$12,$13,$14,$15,$16,$17,$18,$19);"), -    /* Used in #postgres_update_balance_summary() */ -    GNUNET_PQ_make_prepare ("auditor_balance_summary_update", -                            "UPDATE auditor_balance_summary SET" -                            " denom_balance_val=$1" -                            ",denom_balance_frac=$2" -                            ",deposit_fee_balance_val=$3" -                            ",deposit_fee_balance_frac=$4" -                            ",melt_fee_balance_val=$5" -                            ",melt_fee_balance_frac=$6" -                            ",refund_fee_balance_val=$7" -                            ",refund_fee_balance_frac=$8" -                            ",purse_fee_balance_val=$9" -                            ",purse_fee_balance_frac=$10" -                            ",open_deposit_fee_balance_val=$11" -                            ",open_deposit_fee_balance_frac=$12" -                            ",risk_val=$13" -                            ",risk_frac=$14" -                            ",loss_val=$15" -                            ",loss_frac=$16" -                            ",irregular_loss_val=$17" -                            ",irregular_loss_frac=$18" -                            " WHERE master_pub=$19;"), -    /* Used in #postgres_get_balance_summary() */ -    GNUNET_PQ_make_prepare ("auditor_balance_summary_select", -                            "SELECT" -                            " denom_balance_val" -                            ",denom_balance_frac" -                            ",deposit_fee_balance_val" -                            ",deposit_fee_balance_frac" -                            ",melt_fee_balance_val" -                            ",melt_fee_balance_frac" -                            ",refund_fee_balance_val" -                            ",refund_fee_balance_frac" -                            ",purse_fee_balance_val" -                            ",purse_fee_balance_frac" -                            ",open_deposit_fee_balance_val" -                            ",open_deposit_fee_balance_frac" -                            ",risk_val" -                            ",risk_frac" -                            ",loss_val" -                            ",loss_frac" -                            ",irregular_loss_val" -                            ",irregular_loss_frac" -                            " FROM auditor_balance_summary" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_historic_denom_revenue() */ -    GNUNET_PQ_make_prepare ("auditor_historic_denomination_revenue_insert", -                            "INSERT INTO auditor_historic_denomination_revenue" -                            "(master_pub" -                            ",denom_pub_hash" -                            ",revenue_timestamp" -                            ",revenue_balance_val" -                            ",revenue_balance_frac" -                            ",loss_balance_val" -                            ",loss_balance_frac" -                            ") VALUES ($1,$2,$3,$4,$5,$6,$7);"), -    /* Used in #postgres_select_historic_denom_revenue() */ -    GNUNET_PQ_make_prepare ("auditor_historic_denomination_revenue_select", -                            "SELECT" -                            " denom_pub_hash" -                            ",revenue_timestamp" -                            ",revenue_balance_val" -                            ",revenue_balance_frac" -                            ",loss_balance_val" -                            ",loss_balance_frac" -                            " FROM auditor_historic_denomination_revenue" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_historic_reserve_revenue() */ -    GNUNET_PQ_make_prepare ("auditor_historic_reserve_summary_insert", -                            "INSERT INTO auditor_historic_reserve_summary" -                            "(master_pub" -                            ",start_date" -                            ",end_date" -                            ",reserve_profits_val" -                            ",reserve_profits_frac" -                            ") VALUES ($1,$2,$3,$4,$5);"), -    /* Used in #postgres_select_historic_reserve_revenue() */ -    GNUNET_PQ_make_prepare ("auditor_historic_reserve_summary_select", -                            "SELECT" -                            " start_date" -                            ",end_date" -                            ",reserve_profits_val" -                            ",reserve_profits_frac" -                            " FROM auditor_historic_reserve_summary" -                            " WHERE master_pub=$1;"), -    /* Used in #postgres_insert_predicted_result() */ -    GNUNET_PQ_make_prepare ("auditor_predicted_result_insert", -                            "INSERT INTO auditor_predicted_result" -                            "(master_pub" -                            ",balance_val" -                            ",balance_frac" -                            ",drained_val" -                            ",drained_frac" -                            ") VALUES ($1,$2,$3,$4,$5);"), -    /* Used in #postgres_update_predicted_result() */ -    GNUNET_PQ_make_prepare ("auditor_predicted_result_update", -                            "UPDATE auditor_predicted_result SET" -                            " balance_val=$1" -                            ",balance_frac=$2" -                            ",drained_val=$3" -                            ",drained_frac=$4" -                            " WHERE master_pub=$5;"), -    /* Used in #postgres_get_predicted_balance() */ -    GNUNET_PQ_make_prepare ("auditor_predicted_result_select", -                            "SELECT" -                            " balance_val" -                            ",balance_frac" -                            ",drained_val" -                            ",drained_frac" -                            " FROM auditor_predicted_result" -                            " WHERE master_pub=$1;"), -    GNUNET_PQ_PREPARED_STATEMENT_END -  };    struct GNUNET_PQ_ExecuteStatement es[] = {      GNUNET_PQ_make_try_execute ("SET search_path TO auditor;"),      GNUNET_PQ_EXECUTE_STATEMENT_END @@ -749,10 +177,11 @@ setup_connection (struct PostgresClosure *pg)                                          "auditordb-postgres",                                          NULL,                                          es, -                                        ps); +                                        NULL);    if (NULL == db_conn)      return GNUNET_SYSERR;    pg->conn = db_conn; +  pg->prep_gen++;    return GNUNET_OK;  } @@ -867,6 +296,9 @@ postgres_commit (void *cls)      GNUNET_PQ_query_param_end    }; +  PREPARE (pg, +           "do_commit", +           "COMMIT");    return GNUNET_PQ_eval_prepared_non_select (pg->conn,                                               "do_commit",                                               params); @@ -929,2101 +361,6 @@ postgres_gc (void *cls)  /** - * Insert information about an exchange this auditor will be auditing. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param exchange_url public (base) URL of the API of the exchange - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_exchange (void *cls, -                          const struct TALER_MasterPublicKeyP *master_pub, -                          const char *exchange_url) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_string (exchange_url), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_insert_exchange", -                                             params); -} - - -/** - * Delete an exchange from the list of exchanges this auditor is auditing. - * Warning: this will cascade and delete all knowledge of this auditor related - * to this exchange! - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_delete_exchange (void *cls, -                          const struct TALER_MasterPublicKeyP *master_pub) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_delete_exchange", -                                             params); -} - - -/** - * Closure for #exchange_info_cb(). - */ -struct ExchangeInfoContext -{ - -  /** -   * Function to call for each exchange. -   */ -  TALER_AUDITORDB_ExchangeCallback cb; - -  /** -   * Closure for @e cb -   */ -  void *cb_cls; - -  /** -   * Query status to return. -   */ -  enum GNUNET_DB_QueryStatus qs; -}; - - -/** - * Helper function for #postgres_list_exchanges(). - * To be called with the results of a SELECT statement - * that has returned @a num_results results. - * - * @param cls closure of type `struct ExchangeInfoContext *` - * @param result the postgres result - * @param num_results the number of results in @a result - */ -static void -exchange_info_cb (void *cls, -                  PGresult *result, -                  unsigned int num_results) -{ -  struct ExchangeInfoContext *eic = cls; - -  for (unsigned int i = 0; i < num_results; i++) -  { -    struct TALER_MasterPublicKeyP master_pub; -    char *exchange_url; -    struct GNUNET_PQ_ResultSpec rs[] = { -      GNUNET_PQ_result_spec_auto_from_type ("master_pub", &master_pub), -      GNUNET_PQ_result_spec_string ("exchange_url", &exchange_url), -      GNUNET_PQ_result_spec_end -    }; - -    if (GNUNET_OK != -        GNUNET_PQ_extract_result (result, -                                  rs, -                                  i)) -    { -      GNUNET_break (0); -      eic->qs = GNUNET_DB_STATUS_HARD_ERROR; -      return; -    } -    eic->qs = i + 1; -    eic->cb (eic->cb_cls, -             &master_pub, -             exchange_url); -    GNUNET_free (exchange_url); -  } -} - - -/** - * Obtain information about exchanges this auditor is auditing. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param cb function to call with the results - * @param cb_cls closure for @a cb - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_list_exchanges (void *cls, -                         TALER_AUDITORDB_ExchangeCallback cb, -                         void *cb_cls) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_end -  }; -  struct ExchangeInfoContext eic = { -    .cb = cb, -    .cb_cls = cb_cls -  }; -  enum GNUNET_DB_QueryStatus qs; - -  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, -                                             "auditor_list_exchanges", -                                             params, -                                             &exchange_info_cb, -                                             &eic); -  if (qs > 0) -    return eic.qs; -  GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs); -  return qs; -} - - -/** - * Insert information about a signing key of the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param sk signing key information to store - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_exchange_signkey ( -  void *cls, -  const struct TALER_AUDITORDB_ExchangeSigningKey *sk) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (&sk->master_public_key), -    GNUNET_PQ_query_param_timestamp (&sk->ep_start), -    GNUNET_PQ_query_param_timestamp (&sk->ep_expire), -    GNUNET_PQ_query_param_timestamp (&sk->ep_end), -    GNUNET_PQ_query_param_auto_from_type (&sk->exchange_pub), -    GNUNET_PQ_query_param_auto_from_type (&sk->master_sig), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_insert_exchange_signkey", -                                             params); -} - - -/** - * Insert information about a deposit confirmation into the database. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param dc deposit confirmation information to store - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_deposit_confirmation ( -  void *cls, -  const struct TALER_AUDITORDB_DepositConfirmation *dc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (&dc->master_public_key), -    GNUNET_PQ_query_param_auto_from_type (&dc->h_contract_terms), -    GNUNET_PQ_query_param_auto_from_type (&dc->h_extensions), -    GNUNET_PQ_query_param_auto_from_type (&dc->h_wire), -    GNUNET_PQ_query_param_timestamp (&dc->exchange_timestamp), -    GNUNET_PQ_query_param_timestamp (&dc->wire_deadline), -    GNUNET_PQ_query_param_timestamp (&dc->refund_deadline), -    TALER_PQ_query_param_amount (&dc->amount_without_fee), -    GNUNET_PQ_query_param_auto_from_type (&dc->coin_pub), -    GNUNET_PQ_query_param_auto_from_type (&dc->merchant), -    GNUNET_PQ_query_param_auto_from_type (&dc->exchange_sig), -    GNUNET_PQ_query_param_auto_from_type (&dc->exchange_pub), -    GNUNET_PQ_query_param_auto_from_type (&dc->master_sig), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_deposit_confirmation_insert", -                                             params); -} - - -/** - * Closure for #deposit_confirmation_cb(). - */ -struct DepositConfirmationContext -{ - -  /** -   * Master public key that is being used. -   */ -  const struct TALER_MasterPublicKeyP *master_pub; - -  /** -   * Function to call for each deposit confirmation. -   */ -  TALER_AUDITORDB_DepositConfirmationCallback cb; - -  /** -   * Closure for @e cb -   */ -  void *cb_cls; - -  /** -   * Plugin context. -   */ -  struct PostgresClosure *pg; - -  /** -   * Query status to return. -   */ -  enum GNUNET_DB_QueryStatus qs; -}; - - -/** - * Helper function for #postgres_get_deposit_confirmations(). - * To be called with the results of a SELECT statement - * that has returned @a num_results results. - * - * @param cls closure of type `struct DepositConfirmationContext *` - * @param result the postgres result - * @param num_results the number of results in @a result - */ -static void -deposit_confirmation_cb (void *cls, -                         PGresult *result, -                         unsigned int num_results) -{ -  struct DepositConfirmationContext *dcc = cls; -  struct PostgresClosure *pg = dcc->pg; - -  for (unsigned int i = 0; i < num_results; i++) -  { -    uint64_t serial_id; -    struct TALER_AUDITORDB_DepositConfirmation dc = { -      .master_public_key = *dcc->master_pub -    }; -    struct GNUNET_PQ_ResultSpec rs[] = { -      GNUNET_PQ_result_spec_uint64 ("serial_id", -                                    &serial_id), -      GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", -                                            &dc.h_contract_terms), -      GNUNET_PQ_result_spec_auto_from_type ("h_extensions", -                                            &dc.h_extensions), -      GNUNET_PQ_result_spec_auto_from_type ("h_wire", -                                            &dc.h_wire), -      GNUNET_PQ_result_spec_timestamp ("exchange_timestamp", -                                       &dc.exchange_timestamp), -      GNUNET_PQ_result_spec_timestamp ("refund_deadline", -                                       &dc.refund_deadline), -      GNUNET_PQ_result_spec_timestamp ("wire_deadline", -                                       &dc.wire_deadline), -      TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee", -                                   &dc.amount_without_fee), -      GNUNET_PQ_result_spec_auto_from_type ("coin_pub", -                                            &dc.coin_pub), -      GNUNET_PQ_result_spec_auto_from_type ("merchant_pub", -                                            &dc.merchant), -      GNUNET_PQ_result_spec_auto_from_type ("exchange_sig", -                                            &dc.exchange_sig), -      GNUNET_PQ_result_spec_auto_from_type ("exchange_pub", -                                            &dc.exchange_pub), -      GNUNET_PQ_result_spec_auto_from_type ("master_sig", -                                            &dc.master_sig), -      GNUNET_PQ_result_spec_end -    }; - -    if (GNUNET_OK != -        GNUNET_PQ_extract_result (result, -                                  rs, -                                  i)) -    { -      GNUNET_break (0); -      dcc->qs = GNUNET_DB_STATUS_HARD_ERROR; -      return; -    } -    dcc->qs = i + 1; -    if (GNUNET_OK != -        dcc->cb (dcc->cb_cls, -                 serial_id, -                 &dc)) -      break; -  } -} - - -/** - * Get information about deposit confirmations from the database. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_public_key for which exchange do we want to get deposit confirmations - * @param start_id row/serial ID where to start the iteration (0 from - *                  the start, exclusive, i.e. serial_ids must start from 1) - * @param cb function to call with results - * @param cb_cls closure for @a cb - * @return query result status - */ -static enum GNUNET_DB_QueryStatus -postgres_get_deposit_confirmations ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_public_key, -  uint64_t start_id, -  TALER_AUDITORDB_DepositConfirmationCallback cb, -  void *cb_cls) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_public_key), -    GNUNET_PQ_query_param_uint64 (&start_id), -    GNUNET_PQ_query_param_end -  }; -  struct DepositConfirmationContext dcc = { -    .master_pub = master_public_key, -    .cb = cb, -    .cb_cls = cb_cls, -    .pg = pg -  }; -  enum GNUNET_DB_QueryStatus qs; - -  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, -                                             "auditor_deposit_confirmation_select", -                                             params, -                                             &deposit_confirmation_cb, -                                             &dcc); -  if (qs > 0) -    return dcc.qs; -  GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR != qs); -  return qs; -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppr where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress_reserve ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointReserve *ppr) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_recoup_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_open_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_purse_decisions_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_account_merges_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_history_requests_serial_id), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_insert_reserve", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppr where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress_reserve ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointReserve *ppr) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_in_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_out_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_recoup_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_open_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_reserve_close_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_purse_decisions_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_account_merges_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppr->last_history_requests_serial_id), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_update_reserve", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] ppr set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress_reserve ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_ProgressPointReserve *ppr) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_reserve_in_serial_id", -                                  &ppr->last_reserve_in_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_reserve_out_serial_id", -                                  &ppr->last_reserve_out_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_reserve_recoup_serial_id", -                                  &ppr->last_reserve_recoup_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_reserve_open_serial_id", -                                  &ppr->last_reserve_open_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_reserve_close_serial_id", -                                  &ppr->last_reserve_close_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", -                                  &ppr->last_purse_decisions_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_account_merges_serial_id", -                                  &ppr->last_account_merges_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_history_requests_serial_id", -                                  &ppr->last_history_requests_serial_id), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_progress_select_reserve", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppp where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress_purse ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointPurse *ppp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_request_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_decision_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_merge_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_account_merge_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_deposits_serial_id), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_insert_purse", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppp where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress_purse ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointPurse *ppp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_request_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_decision_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_merge_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_account_merge_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppp->last_purse_deposits_serial_id), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_update_purse", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] ppp set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress_purse ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_ProgressPointPurse *ppp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_purse_request_serial_id", -                                  &ppp->last_purse_request_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", -                                  &ppp->last_purse_decision_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_merges_serial_id", -                                  &ppp->last_purse_merge_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_account_merges_serial_id", -                                  &ppp->last_account_merge_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_deposits_serial_id", -                                  &ppp->last_purse_deposits_serial_id), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_progress_select_purse", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppa where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress_aggregation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_insert_aggregation", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppa where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress_aggregation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointAggregation *ppa) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&ppa->last_wire_out_serial_id), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_update_aggregation", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] ppa set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress_aggregation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_ProgressPointAggregation *ppa) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_wire_out_serial_id", -                                  &ppa->last_wire_out_serial_id), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_progress_select_aggregation", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppdc where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress_deposit_confirmation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_uint64 (&ppdc->last_deposit_confirmation_serial_id), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_insert_deposit_confirmation", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppdc where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress_deposit_confirmation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&ppdc->last_deposit_confirmation_serial_id), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_update_deposit_confirmation", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] ppdc set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress_deposit_confirmation ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_ProgressPointDepositConfirmation *ppdc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_deposit_confirmation_serial_id", -                                  &ppdc->last_deposit_confirmation_serial_id), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_progress_select_deposit_confirmation", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppc where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_auditor_progress_coin ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointCoin *ppc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_refresh_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_deposits_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_refunds_serial_id), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_insert_coin", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param ppc where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_auditor_progress_coin ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ProgressPointCoin *ppc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&ppc->last_withdraw_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_deposit_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_melt_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_refund_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_recoup_refresh_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_deposits_serial_id), -    GNUNET_PQ_query_param_uint64 (&ppc->last_purse_refunds_serial_id), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_progress_update_coin", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] ppc set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_auditor_progress_coin ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_ProgressPointCoin *ppc) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_withdraw_serial_id", -                                  &ppc->last_withdraw_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_deposit_serial_id", -                                  &ppc->last_deposit_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_melt_serial_id", -                                  &ppc->last_melt_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_refund_serial_id", -                                  &ppc->last_refund_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_recoup_serial_id", -                                  &ppc->last_recoup_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_recoup_refresh_serial_id", -                                  &ppc->last_recoup_refresh_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_deposits_serial_id", -                                  &ppc->last_purse_deposits_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_purse_decision_serial_id", -                                  &ppc->last_purse_refunds_serial_id), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_progress_select_coin", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param account_name name of the wire account we are auditing - * @param pp how far are we in the auditor's tables - * @param bapp progress in wire transaction histories - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_wire_auditor_account_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const char *account_name, -  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, -  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_string (account_name), -    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), -    GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), -    GNUNET_PQ_query_param_uint64 (&bapp->in_wire_off), -    GNUNET_PQ_query_param_uint64 (&bapp->out_wire_off), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "wire_auditor_account_progress_insert", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param account_name name of the wire account we are auditing - * @param pp where is the auditor in processing - * @param bapp progress in wire transaction histories - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_wire_auditor_account_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const char *account_name, -  const struct TALER_AUDITORDB_WireAccountProgressPoint *pp, -  const struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_in_serial_id), -    GNUNET_PQ_query_param_uint64 (&pp->last_wire_out_serial_id), -    GNUNET_PQ_query_param_uint64 (&bapp->in_wire_off), -    GNUNET_PQ_query_param_uint64 (&bapp->out_wire_off), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_string (account_name), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "wire_auditor_account_progress_update", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param account_name name of the wire account we are auditing - * @param[out] pp where is the auditor in processing - * @param[out] bapp how far are we in the wire transaction histories - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_wire_auditor_account_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const char *account_name, -  struct TALER_AUDITORDB_WireAccountProgressPoint *pp, -  struct TALER_AUDITORDB_BankAccountProgressPoint *bapp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_string (account_name), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_uint64 ("last_wire_reserve_in_serial_id", -                                  &pp->last_reserve_in_serial_id), -    GNUNET_PQ_result_spec_uint64 ("last_wire_wire_out_serial_id", -                                  &pp->last_wire_out_serial_id), -    GNUNET_PQ_result_spec_uint64 ("wire_in_off", -                                  &bapp->in_wire_off), -    GNUNET_PQ_result_spec_uint64 ("wire_out_off", -                                  &bapp->out_wire_off), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "wire_auditor_account_progress_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about the auditor's progress with an exchange's - * data. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param pp where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_wire_auditor_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_WireProgressPoint *pp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_timestamp (&pp->last_timestamp), -    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_uuid), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "wire_auditor_progress_insert", -                                             params); -} - - -/** - * Update information about the progress of the auditor.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param pp where is the auditor in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_wire_auditor_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_WireProgressPoint *pp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_timestamp (&pp->last_timestamp), -    GNUNET_PQ_query_param_uint64 (&pp->last_reserve_close_uuid), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "wire_auditor_progress_update", -                                             params); -} - - -/** - * Get information about the progress of the auditor. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] pp set to where the auditor is in processing - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_wire_auditor_progress ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_WireProgressPoint *pp) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    GNUNET_PQ_result_spec_timestamp ("last_timestamp", -                                     &pp->last_timestamp), -    GNUNET_PQ_result_spec_uint64 ("last_reserve_close_uuid", -                                  &pp->last_reserve_close_uuid), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "wire_auditor_progress_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about a reserve.  There must not be an - * existing record for the reserve. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param reserve_pub public key of the reserve - * @param master_pub master public key of the exchange - * @param rfb balance amounts for the reserve - * @param expiration_date when will the reserve expire - * @param origin_account where did the money in the reserve originally come from - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_reserve_info ( -  void *cls, -  const struct TALER_ReservePublicKeyP *reserve_pub, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, -  struct GNUNET_TIME_Timestamp expiration_date, -  const char *origin_account) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (reserve_pub), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    TALER_PQ_query_param_amount (&rfb->reserve_balance), -    TALER_PQ_query_param_amount (&rfb->reserve_loss), -    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), -    TALER_PQ_query_param_amount (&rfb->close_fee_balance), -    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&rfb->open_fee_balance), -    TALER_PQ_query_param_amount (&rfb->history_fee_balance), -    GNUNET_PQ_query_param_timestamp (&expiration_date), -    NULL == origin_account -    ? GNUNET_PQ_query_param_null () -    : GNUNET_PQ_query_param_string (origin_account), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_reserves_insert", -                                             params); -} - - -/** - * Update information about a reserve.  Destructively updates an - * existing record, which must already exist. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param reserve_pub public key of the reserve - * @param master_pub master public key of the exchange - * @param rfb amounts for the reserve - * @param expiration_date expiration date of the reserve - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_reserve_info ( -  void *cls, -  const struct TALER_ReservePublicKeyP *reserve_pub, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb, -  struct GNUNET_TIME_Timestamp expiration_date) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (&rfb->reserve_balance), -    TALER_PQ_query_param_amount (&rfb->reserve_loss), -    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), -    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&rfb->open_fee_balance), -    TALER_PQ_query_param_amount (&rfb->history_fee_balance), -    GNUNET_PQ_query_param_timestamp (&expiration_date), -    GNUNET_PQ_query_param_auto_from_type (reserve_pub), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_reserves_update", -                                             params); -} - - -/** - * Delete information about a reserve. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param reserve_pub public key of the reserve - * @param master_pub master public key of the exchange - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_del_reserve_info (void *cls, -                           const struct TALER_ReservePublicKeyP *reserve_pub, -                           const struct TALER_MasterPublicKeyP *master_pub) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (reserve_pub), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_reserves_delete", -                                             params); -} - - -/** - * Get information about a reserve. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param reserve_pub public key of the reserve - * @param master_pub master public key of the exchange - * @param[out] rowid which row did we get the information from - * @param[out] rfb where to store the reserve balance summary - * @param[out] expiration_date expiration date of the reserve - * @param[out] sender_account from where did the money in the reserve originally come from - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_reserve_info (void *cls, -                           const struct TALER_ReservePublicKeyP *reserve_pub, -                           const struct TALER_MasterPublicKeyP *master_pub, -                           uint64_t *rowid, -                           struct TALER_AUDITORDB_ReserveFeeBalance *rfb, -                           struct GNUNET_TIME_Timestamp *expiration_date, -                           char **sender_account) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (reserve_pub), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", -                                 &rfb->reserve_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_loss", -                                 &rfb->reserve_loss), -    TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", -                                 &rfb->withdraw_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("close_fee_balance", -                                 &rfb->close_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", -                                 &rfb->purse_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("open_fee_balance", -                                 &rfb->open_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("history_fee_balance", -                                 &rfb->history_fee_balance), -    GNUNET_PQ_result_spec_timestamp ("expiration_date", -                                     expiration_date), -    GNUNET_PQ_result_spec_uint64 ("auditor_reserves_rowid", -                                  rowid), -    GNUNET_PQ_result_spec_allow_null ( -      GNUNET_PQ_result_spec_string ("origin_account", -                                    sender_account), -      NULL), -    GNUNET_PQ_result_spec_end -  }; - -  *sender_account = NULL; -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_reserves_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about all reserves.  There must not be an - * existing record for the @a master_pub. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param rfb balances to be stored for the reserve - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_reserve_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    TALER_PQ_query_param_amount (&rfb->reserve_balance), -    TALER_PQ_query_param_amount (&rfb->reserve_loss), -    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), -    TALER_PQ_query_param_amount (&rfb->close_fee_balance), -    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&rfb->open_fee_balance), -    TALER_PQ_query_param_amount (&rfb->history_fee_balance), -    GNUNET_PQ_query_param_end -  }; - -  GNUNET_assert (GNUNET_YES == -                 TALER_amount_cmp_currency (&rfb->reserve_balance, -                                            &rfb->withdraw_fee_balance)); - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_reserve_balance_insert", -                                             params); -} - - -/** - * Update information about all reserves.  Destructively updates an - * existing record, which must already exist. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param rfb balances to be stored for the reserve - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_reserve_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_ReserveFeeBalance *rfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (&rfb->reserve_balance), -    TALER_PQ_query_param_amount (&rfb->reserve_loss), -    TALER_PQ_query_param_amount (&rfb->withdraw_fee_balance), -    TALER_PQ_query_param_amount (&rfb->close_fee_balance), -    TALER_PQ_query_param_amount (&rfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&rfb->open_fee_balance), -    TALER_PQ_query_param_amount (&rfb->history_fee_balance), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_reserve_balance_update", -                                             params); -} - - -/** - * Get summary information about all reserves. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param[out] rfb balances are returned here - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_reserve_summary (void *cls, -                              const struct TALER_MasterPublicKeyP *master_pub, -                              struct TALER_AUDITORDB_ReserveFeeBalance *rfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_balance", -                                 &rfb->reserve_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_loss", -                                 &rfb->reserve_loss), -    TALER_PQ_RESULT_SPEC_AMOUNT ("withdraw_fee_balance", -                                 &rfb->withdraw_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("close_fee_balance", -                                 &rfb->close_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", -                                 &rfb->purse_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("open_fee_balance", -                                 &rfb->open_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("history_fee_balance", -                                 &rfb->history_fee_balance), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_reserve_balance_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about exchange's wire fee balance. There must not be an - * existing record for the same @a master_pub. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param wire_fee_balance amount the exchange gained in wire fees - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_wire_fee_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_Amount *wire_fee_balance) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    TALER_PQ_query_param_amount (wire_fee_balance), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_wire_fee_balance_insert", -                                             params); -} - - -/** - * Insert information about exchange's wire fee balance.  Destructively updates an - * existing record, which must already exist. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param wire_fee_balance amount the exchange gained in wire fees - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_wire_fee_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_Amount *wire_fee_balance) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (wire_fee_balance), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_wire_fee_balance_update", -                                             params); -} - - -/** - * Get summary information about an exchanges wire fee balance. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master public key of the exchange - * @param[out] wire_fee_balance set amount the exchange gained in wire fees - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_wire_fee_summary (void *cls, -                               const struct TALER_MasterPublicKeyP *master_pub, -                               struct TALER_Amount *wire_fee_balance) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("wire_fee_balance", -                                 wire_fee_balance), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_wire_fee_balance_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about a denomination key's balances.  There - * must not be an existing record for the denomination key. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param denom_pub_hash hash of the denomination public key - * @param dcd circulation data to store - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_denomination_balance ( -  void *cls, -  const struct TALER_DenominationHashP *denom_pub_hash, -  const struct TALER_AUDITORDB_DenominationCirculationData *dcd) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), -    TALER_PQ_query_param_amount (&dcd->denom_balance), -    TALER_PQ_query_param_amount (&dcd->denom_loss), -    GNUNET_PQ_query_param_uint64 (&dcd->num_issued), -    TALER_PQ_query_param_amount (&dcd->denom_risk), -    TALER_PQ_query_param_amount (&dcd->recoup_loss), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_denomination_pending_insert", -                                             params); -} - - -/** - * Update information about a denomination key's balances.  There - * must be an existing record for the denomination key. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param denom_pub_hash hash of the denomination public key - * @param dcd circulation data to store - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_denomination_balance ( -  void *cls, -  const struct TALER_DenominationHashP *denom_pub_hash, -  const struct TALER_AUDITORDB_DenominationCirculationData *dcd) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (&dcd->denom_balance), -    TALER_PQ_query_param_amount (&dcd->denom_loss), -    GNUNET_PQ_query_param_uint64 (&dcd->num_issued), -    TALER_PQ_query_param_amount (&dcd->denom_risk), -    TALER_PQ_query_param_amount (&dcd->recoup_loss), -    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_denomination_pending_update", -                                             params); -} - - -/** - * Get information about a denomination key's balances. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param denom_pub_hash hash of the denomination public key - * @param[out] dcd circulation data to initialize - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_denomination_balance ( -  void *cls, -  const struct TALER_DenominationHashP *denom_pub_hash, -  struct TALER_AUDITORDB_DenominationCirculationData *dcd) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", -                                 &dcd->denom_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_loss", -                                 &dcd->denom_loss), -    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_risk", -                                 &dcd->denom_risk), -    TALER_PQ_RESULT_SPEC_AMOUNT ("recoup_loss", -                                 &dcd->recoup_loss), -    GNUNET_PQ_result_spec_uint64 ("num_issued", -                                  &dcd->num_issued), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_denomination_pending_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about an exchange's denomination balances.  There - * must not be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param dfb denomination balance data to store - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_balance_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    TALER_PQ_query_param_amount (&dfb->total_escrowed), -    TALER_PQ_query_param_amount (&dfb->deposit_fee_balance), -    TALER_PQ_query_param_amount (&dfb->melt_fee_balance), -    TALER_PQ_query_param_amount (&dfb->refund_fee_balance), -    TALER_PQ_query_param_amount (&dfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&dfb->open_deposit_fee_balance), -    TALER_PQ_query_param_amount (&dfb->risk), -    TALER_PQ_query_param_amount (&dfb->loss), -    TALER_PQ_query_param_amount (&dfb->irregular_loss), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_balance_summary_insert", -                                             params); -} - - -/** - * Update information about an exchange's denomination balances.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param dfb denomination balance data to store - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_balance_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_AUDITORDB_GlobalCoinBalance *dfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (&dfb->total_escrowed), -    TALER_PQ_query_param_amount (&dfb->deposit_fee_balance), -    TALER_PQ_query_param_amount (&dfb->melt_fee_balance), -    TALER_PQ_query_param_amount (&dfb->refund_fee_balance), -    TALER_PQ_query_param_amount (&dfb->purse_fee_balance), -    TALER_PQ_query_param_amount (&dfb->open_deposit_fee_balance), -    TALER_PQ_query_param_amount (&dfb->risk), -    TALER_PQ_query_param_amount (&dfb->loss), -    TALER_PQ_query_param_amount (&dfb->irregular_loss), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_balance_summary_update", -                                             params); -} - - -/** - * Get information about an exchange's denomination balances. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] dfb where to return the denomination balances - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_balance_summary ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct TALER_AUDITORDB_GlobalCoinBalance *dfb) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("denom_balance", -                                 &dfb->total_escrowed), -    TALER_PQ_RESULT_SPEC_AMOUNT ("deposit_fee_balance", -                                 &dfb->deposit_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("melt_fee_balance", -                                 &dfb->melt_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("refund_fee_balance", -                                 &dfb->refund_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee_balance", -                                 &dfb->purse_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("open_deposit_fee_balance", -                                 &dfb->open_deposit_fee_balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("risk", -                                 &dfb->risk), -    TALER_PQ_RESULT_SPEC_AMOUNT ("loss", -                                 &dfb->loss), -    TALER_PQ_RESULT_SPEC_AMOUNT ("irregular_loss", -                                 &dfb->irregular_loss), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_balance_summary_select", -                                                   params, -                                                   rs); -} - - -/** - * Insert information about an exchange's historic - * revenue about a denomination key. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param denom_pub_hash hash of the denomination key - * @param revenue_timestamp when did this profit get realized - * @param revenue_balance what was the total profit made from - *                        deposit fees, melting fees, refresh fees - *                        and coins that were never returned? - * @param loss_balance total losses suffered by the exchange at the time - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_historic_denom_revenue ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_DenominationHashP *denom_pub_hash, -  struct GNUNET_TIME_Timestamp revenue_timestamp, -  const struct TALER_Amount *revenue_balance, -  const struct TALER_Amount *loss_balance) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_auto_from_type (denom_pub_hash), -    GNUNET_PQ_query_param_timestamp (&revenue_timestamp), -    TALER_PQ_query_param_amount (revenue_balance), -    TALER_PQ_query_param_amount (loss_balance), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_historic_denomination_revenue_insert", -                                             params); -} - - -/** - * Closure for #historic_denom_revenue_cb(). - */ -struct HistoricDenomRevenueContext -{ -  /** -   * Function to call for each result. -   */ -  TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb; - -  /** -   * Closure for @e cb. -   */ -  void *cb_cls; - -  /** -   * Plugin context. -   */ -  struct PostgresClosure *pg; - -  /** -   * Number of results processed. -   */ -  enum GNUNET_DB_QueryStatus qs; -}; - - -/** - * Helper function for #postgres_select_historic_denom_revenue(). - * To be called with the results of a SELECT statement - * that has returned @a num_results results. - * - * @param cls closure of type `struct HistoricRevenueContext *` - * @param result the postgres result - * @param num_results the number of results in @a result - */ -static void -historic_denom_revenue_cb (void *cls, -                           PGresult *result, -                           unsigned int num_results) -{ -  struct HistoricDenomRevenueContext *hrc = cls; -  struct PostgresClosure *pg = hrc->pg; - -  for (unsigned int i = 0; i < num_results; i++) -  { -    struct TALER_DenominationHashP denom_pub_hash; -    struct GNUNET_TIME_Timestamp revenue_timestamp; -    struct TALER_Amount revenue_balance; -    struct TALER_Amount loss; -    struct GNUNET_PQ_ResultSpec rs[] = { -      GNUNET_PQ_result_spec_auto_from_type ("denom_pub_hash", -                                            &denom_pub_hash), -      GNUNET_PQ_result_spec_timestamp ("revenue_timestamp", -                                       &revenue_timestamp), -      TALER_PQ_RESULT_SPEC_AMOUNT ("revenue_balance", -                                   &revenue_balance), -      TALER_PQ_RESULT_SPEC_AMOUNT ("loss_balance", -                                   &loss), -      GNUNET_PQ_result_spec_end -    }; - -    if (GNUNET_OK != -        GNUNET_PQ_extract_result (result, -                                  rs, -                                  i)) -    { -      GNUNET_break (0); -      hrc->qs = GNUNET_DB_STATUS_HARD_ERROR; -      return; -    } - -    hrc->qs = i + 1; -    if (GNUNET_OK != -        hrc->cb (hrc->cb_cls, -                 &denom_pub_hash, -                 revenue_timestamp, -                 &revenue_balance, -                 &loss)) -      break; -  } -} - - -/** - * Obtain all of the historic denomination key revenue - * of the given @a master_pub. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param cb function to call with the results - * @param cb_cls closure for @a cb - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_select_historic_denom_revenue ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  TALER_AUDITORDB_HistoricDenominationRevenueDataCallback cb, -  void *cb_cls) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct HistoricDenomRevenueContext hrc = { -    .cb = cb, -    .cb_cls = cb_cls, -    .pg = pg -  }; -  enum GNUNET_DB_QueryStatus qs; - -  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, -                                             "auditor_historic_denomination_revenue_select", -                                             params, -                                             &historic_denom_revenue_cb, -                                             &hrc); -  if (qs <= 0) -    return qs; -  return hrc.qs; -} - - -/** - * Insert information about an exchange's historic revenue from reserves. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param start_time beginning of aggregated time interval - * @param end_time end of aggregated time interval - * @param reserve_profits total profits made - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_historic_reserve_revenue ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  struct GNUNET_TIME_Timestamp start_time, -  struct GNUNET_TIME_Timestamp end_time, -  const struct TALER_Amount *reserve_profits) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_timestamp (&start_time), -    GNUNET_PQ_query_param_timestamp (&end_time), -    TALER_PQ_query_param_amount (reserve_profits), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_historic_reserve_summary_insert", -                                             params); -} - - -/** - * Closure for #historic_reserve_revenue_cb(). - */ -struct HistoricReserveRevenueContext -{ -  /** -   * Function to call for each result. -   */ -  TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb; - -  /** -   * Closure for @e cb. -   */ -  void *cb_cls; - -  /** -   * Plugin context. -   */ -  struct PostgresClosure *pg; - -  /** -   * Number of results processed. -   */ -  enum GNUNET_DB_QueryStatus qs; -}; - - -/** - * Helper function for #postgres_select_historic_reserve_revenue(). - * To be called with the results of a SELECT statement - * that has returned @a num_results results. - * - * @param cls closure of type `struct HistoricRevenueContext *` - * @param result the postgres result - * @param num_results the number of results in @a result - */ -static void -historic_reserve_revenue_cb (void *cls, -                             PGresult *result, -                             unsigned int num_results) -{ -  struct HistoricReserveRevenueContext *hrc = cls; -  struct PostgresClosure *pg = hrc->pg; - -  for (unsigned int i = 0; i < num_results; i++) -  { -    struct GNUNET_TIME_Timestamp start_date; -    struct GNUNET_TIME_Timestamp end_date; -    struct TALER_Amount reserve_profits; -    struct GNUNET_PQ_ResultSpec rs[] = { -      GNUNET_PQ_result_spec_timestamp ("start_date", -                                       &start_date), -      GNUNET_PQ_result_spec_timestamp ("end_date", -                                       &end_date), -      TALER_PQ_RESULT_SPEC_AMOUNT ("reserve_profits", -                                   &reserve_profits), -      GNUNET_PQ_result_spec_end -    }; - -    if (GNUNET_OK != -        GNUNET_PQ_extract_result (result, -                                  rs, -                                  i)) -    { -      GNUNET_break (0); -      hrc->qs = GNUNET_DB_STATUS_HARD_ERROR; -      return; -    } -    hrc->qs = i + 1; -    if (GNUNET_OK != -        hrc->cb (hrc->cb_cls, -                 start_date, -                 end_date, -                 &reserve_profits)) -      break; -  } -} - - -/** - * Return information about an exchange's historic revenue from reserves. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param cb function to call with results - * @param cb_cls closure for @a cb - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_select_historic_reserve_revenue ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  TALER_AUDITORDB_HistoricReserveRevenueDataCallback cb, -  void *cb_cls) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  enum GNUNET_DB_QueryStatus qs; -  struct HistoricReserveRevenueContext hrc = { -    .cb = cb, -    .cb_cls = cb_cls, -    .pg = pg -  }; - -  qs = GNUNET_PQ_eval_prepared_multi_select (pg->conn, -                                             "auditor_historic_reserve_summary_select", -                                             params, -                                             &historic_reserve_revenue_cb, -                                             &hrc); -  if (0 >= qs) -    return qs; -  return hrc.qs; -} - - -/** - * Insert information about the predicted exchange's bank - * account balance. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param balance what the bank account balance of the exchange should show - * @param drained amount that was drained in profits - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_insert_predicted_result ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_Amount *balance, -  const struct TALER_Amount *drained) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    TALER_PQ_query_param_amount (balance), -    TALER_PQ_query_param_amount (drained), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_predicted_result_insert", -                                             params); -} - - -/** - * Update information about an exchange's predicted balance.  There - * must be an existing record for the exchange. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param balance what the bank account balance of the exchange should show - * @param drained amount that was drained in profits - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_update_predicted_result ( -  void *cls, -  const struct TALER_MasterPublicKeyP *master_pub, -  const struct TALER_Amount *balance, -  const struct TALER_Amount *drained) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    TALER_PQ_query_param_amount (balance), -    TALER_PQ_query_param_amount (drained), -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; - -  return GNUNET_PQ_eval_prepared_non_select (pg->conn, -                                             "auditor_predicted_result_update", -                                             params); -} - - -/** - * Get an exchange's predicted balance. - * - * @param cls the @e cls of this struct with the plugin-specific state - * @param master_pub master key of the exchange - * @param[out] balance expected bank account balance of the exchange - * @param[out] drained amount drained so far - * @return transaction status code - */ -static enum GNUNET_DB_QueryStatus -postgres_get_predicted_balance (void *cls, -                                const struct TALER_MasterPublicKeyP *master_pub, -                                struct TALER_Amount *balance, -                                struct TALER_Amount *drained) -{ -  struct PostgresClosure *pg = cls; -  struct GNUNET_PQ_QueryParam params[] = { -    GNUNET_PQ_query_param_auto_from_type (master_pub), -    GNUNET_PQ_query_param_end -  }; -  struct GNUNET_PQ_ResultSpec rs[] = { -    TALER_PQ_RESULT_SPEC_AMOUNT ("balance", -                                 balance), -    TALER_PQ_RESULT_SPEC_AMOUNT ("drained", -                                 drained), -    GNUNET_PQ_result_spec_end -  }; - -  return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, -                                                   "auditor_predicted_result_select", -                                                   params, -                                                   rs); -} - - -/**   * Initialize Postgres database subsystem.   *   * @param cls a configuration instance @@ -3055,90 +392,122 @@ libtaler_plugin_auditordb_postgres_init (void *cls)    plugin->rollback = &postgres_rollback;    plugin->gc = &postgres_gc; -  plugin->insert_exchange = &postgres_insert_exchange; -  plugin->delete_exchange = &postgres_delete_exchange; -  plugin->list_exchanges = &postgres_list_exchanges; -  plugin->insert_exchange_signkey = &postgres_insert_exchange_signkey; -  plugin->insert_deposit_confirmation = &postgres_insert_deposit_confirmation; -  plugin->get_deposit_confirmations = &postgres_get_deposit_confirmations; +  plugin->insert_exchange +    = &TAH_PG_insert_exchange; +  plugin->delete_exchange +    = &TAH_PG_delete_exchange; +  plugin->list_exchanges +    = &TAH_PG_list_exchanges; + +  plugin->insert_exchange_signkey +    = &TAH_PG_insert_exchange_signkey; +  plugin->insert_deposit_confirmation +    = &TAH_PG_insert_deposit_confirmation; +  plugin->get_deposit_confirmations +    = &TAH_PG_get_deposit_confirmations;    plugin->get_auditor_progress_reserve -    = &postgres_get_auditor_progress_reserve; +    = &TAH_PG_get_auditor_progress_reserve;    plugin->update_auditor_progress_reserve -    = &postgres_update_auditor_progress_reserve; +    = &TAH_PG_update_auditor_progress_reserve;    plugin->insert_auditor_progress_reserve -    = &postgres_insert_auditor_progress_reserve; +    = &TAH_PG_insert_auditor_progress_reserve;    plugin->get_auditor_progress_purse -    = &postgres_get_auditor_progress_purse; +    = &TAH_PG_get_auditor_progress_purse;    plugin->update_auditor_progress_purse -    = &postgres_update_auditor_progress_purse; +    = &TAH_PG_update_auditor_progress_purse;    plugin->insert_auditor_progress_purse -    = &postgres_insert_auditor_progress_purse; +    = &TAH_PG_insert_auditor_progress_purse;    plugin->get_auditor_progress_aggregation -    = &postgres_get_auditor_progress_aggregation; +    = &TAH_PG_get_auditor_progress_aggregation;    plugin->update_auditor_progress_aggregation -    = &postgres_update_auditor_progress_aggregation; +    = &TAH_PG_update_auditor_progress_aggregation;    plugin->insert_auditor_progress_aggregation -    = &postgres_insert_auditor_progress_aggregation; +    = &TAH_PG_insert_auditor_progress_aggregation;    plugin->get_auditor_progress_deposit_confirmation -    = &postgres_get_auditor_progress_deposit_confirmation; +    = &TAH_PG_get_auditor_progress_deposit_confirmation;    plugin->update_auditor_progress_deposit_confirmation -    = &postgres_update_auditor_progress_deposit_confirmation; +    = &TAH_PG_update_auditor_progress_deposit_confirmation;    plugin->insert_auditor_progress_deposit_confirmation -    = &postgres_insert_auditor_progress_deposit_confirmation; +    = &TAH_PG_insert_auditor_progress_deposit_confirmation; -  plugin->get_auditor_progress_coin = &postgres_get_auditor_progress_coin; -  plugin->update_auditor_progress_coin = &postgres_update_auditor_progress_coin; -  plugin->insert_auditor_progress_coin = &postgres_insert_auditor_progress_coin; +  plugin->get_auditor_progress_coin +    = &TAH_PG_get_auditor_progress_coin; +  plugin->update_auditor_progress_coin +    = &TAH_PG_update_auditor_progress_coin; +  plugin->insert_auditor_progress_coin +    = &TAH_PG_insert_auditor_progress_coin;    plugin->get_wire_auditor_account_progress -    = &postgres_get_wire_auditor_account_progress; +    = &TAH_PG_get_wire_auditor_account_progress;    plugin->update_wire_auditor_account_progress -    = &postgres_update_wire_auditor_account_progress; +    = &TAH_PG_update_wire_auditor_account_progress;    plugin->insert_wire_auditor_account_progress -    = &postgres_insert_wire_auditor_account_progress; - -  plugin->get_wire_auditor_progress = &postgres_get_wire_auditor_progress; -  plugin->update_wire_auditor_progress = &postgres_update_wire_auditor_progress; -  plugin->insert_wire_auditor_progress = &postgres_insert_wire_auditor_progress; - -  plugin->del_reserve_info = &postgres_del_reserve_info; -  plugin->get_reserve_info = &postgres_get_reserve_info; -  plugin->update_reserve_info = &postgres_update_reserve_info; -  plugin->insert_reserve_info = &postgres_insert_reserve_info; - -  plugin->get_reserve_summary = &postgres_get_reserve_summary; -  plugin->update_reserve_summary = &postgres_update_reserve_summary; -  plugin->insert_reserve_summary = &postgres_insert_reserve_summary; - -  plugin->get_wire_fee_summary = &postgres_get_wire_fee_summary; -  plugin->update_wire_fee_summary = &postgres_update_wire_fee_summary; -  plugin->insert_wire_fee_summary = &postgres_insert_wire_fee_summary; - -  plugin->get_denomination_balance = &postgres_get_denomination_balance; -  plugin->update_denomination_balance = &postgres_update_denomination_balance; -  plugin->insert_denomination_balance = &postgres_insert_denomination_balance; - -  plugin->get_balance_summary = &postgres_get_balance_summary; -  plugin->update_balance_summary = &postgres_update_balance_summary; -  plugin->insert_balance_summary = &postgres_insert_balance_summary; +    = &TAH_PG_insert_wire_auditor_account_progress; + +  plugin->get_wire_auditor_progress +    = &TAH_PG_get_wire_auditor_progress; +  plugin->update_wire_auditor_progress +    = &TAH_PG_update_wire_auditor_progress; +  plugin->insert_wire_auditor_progress +    = &TAH_PG_insert_wire_auditor_progress; + +  plugin->del_reserve_info +    = &TAH_PG_del_reserve_info; +  plugin->get_reserve_info +    = &TAH_PG_get_reserve_info; +  plugin->update_reserve_info +    = &TAH_PG_update_reserve_info; +  plugin->insert_reserve_info +    = &TAH_PG_insert_reserve_info; + +  plugin->get_reserve_summary +    = &TAH_PG_get_reserve_summary; +  plugin->update_reserve_summary +    = &TAH_PG_update_reserve_summary; +  plugin->insert_reserve_summary +    = &TAH_PG_insert_reserve_summary; + +  plugin->get_wire_fee_summary +    = &TAH_PG_get_wire_fee_summary; +  plugin->update_wire_fee_summary +    = &TAH_PG_update_wire_fee_summary; +  plugin->insert_wire_fee_summary +    = &TAH_PG_insert_wire_fee_summary; + +  plugin->get_denomination_balance +    = &TAH_PG_get_denomination_balance; +  plugin->update_denomination_balance +    = &TAH_PG_update_denomination_balance; +  plugin->insert_denomination_balance +    = &TAH_PG_insert_denomination_balance; + +  plugin->get_balance_summary +    = &TAH_PG_get_balance_summary; +  plugin->update_balance_summary +    = &TAH_PG_update_balance_summary; +  plugin->insert_balance_summary +    = &TAH_PG_insert_balance_summary;    plugin->select_historic_denom_revenue -    = &postgres_select_historic_denom_revenue; +    = &TAH_PG_select_historic_denom_revenue;    plugin->insert_historic_denom_revenue -    = &postgres_insert_historic_denom_revenue; +    = &TAH_PG_insert_historic_denom_revenue;    plugin->select_historic_reserve_revenue -    = &postgres_select_historic_reserve_revenue; +    = &TAH_PG_select_historic_reserve_revenue;    plugin->insert_historic_reserve_revenue -    = &postgres_insert_historic_reserve_revenue; - -  plugin->get_predicted_balance = &postgres_get_predicted_balance; -  plugin->update_predicted_result = &postgres_update_predicted_result; -  plugin->insert_predicted_result = &postgres_insert_predicted_result; +    = &TAH_PG_insert_historic_reserve_revenue; + +  plugin->get_predicted_balance +    = &TAH_PG_get_predicted_balance; +  plugin->update_predicted_result +    = &TAH_PG_update_predicted_result; +  plugin->insert_predicted_result +    = &TAH_PG_insert_predicted_result;    return plugin;  }  | 
