Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2022, 2025 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify it under the
6 : terms of the GNU General Public License as published by the Free Software
7 : Foundation; either version 3, or (at your option) any later version.
8 :
9 : TALER is distributed in the hope that it will be useful, but WITHOUT ANY
10 : WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 : A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 :
13 : You should have received a copy of the GNU General Public License along with
14 : TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
15 : */
16 : /**
17 : * @file src/backenddb/insert_deposit_to_transfer.c
18 : * @brief Implementation of the insert_deposit_to_transfer function for Postgres
19 : * @author Christian Grothoff
20 : */
21 : #include "platform.h"
22 : #include <taler/taler_pq_lib.h>
23 : #include "merchant-database/insert_deposit_to_transfer.h"
24 : #include "helper.h"
25 :
26 :
27 : enum TALER_MERCHANTDB_DepositToTransferStatus
28 17 : TALER_MERCHANTDB_insert_deposit_to_transfer (
29 : struct TALER_MERCHANTDB_PostgresContext *pg,
30 : uint64_t deposit_serial,
31 : const struct TALER_MerchantWireHashP *h_wire,
32 : const char *exchange_url,
33 : const struct TALER_EXCHANGE_DepositData *dd)
34 : {
35 17 : struct GNUNET_PQ_QueryParam params[] = {
36 17 : GNUNET_PQ_query_param_uint64 (&deposit_serial),
37 17 : TALER_PQ_query_param_amount_with_currency (pg->conn,
38 : &dd->coin_contribution),
39 17 : GNUNET_PQ_query_param_timestamp (&dd->execution_time),
40 17 : GNUNET_PQ_query_param_string (exchange_url),
41 17 : GNUNET_PQ_query_param_auto_from_type (h_wire),
42 17 : GNUNET_PQ_query_param_auto_from_type (&dd->exchange_sig),
43 17 : GNUNET_PQ_query_param_auto_from_type (&dd->exchange_pub),
44 17 : GNUNET_PQ_query_param_auto_from_type (&dd->wtid),
45 : GNUNET_PQ_query_param_end
46 : };
47 : bool no_signkey;
48 : bool no_account;
49 17 : struct GNUNET_PQ_ResultSpec rs[] = {
50 17 : GNUNET_PQ_result_spec_bool ("out_no_signkey",
51 : &no_signkey),
52 17 : GNUNET_PQ_result_spec_bool ("out_no_account",
53 : &no_account),
54 : GNUNET_PQ_result_spec_end
55 : };
56 : enum GNUNET_DB_QueryStatus qs;
57 :
58 17 : GNUNET_assert (NULL != pg->current_merchant_id);
59 17 : TMH_PQ_prepare_anon (pg,
60 : "SELECT"
61 : " out_no_signkey"
62 : " ,out_no_account"
63 : " FROM merchant_insert_deposit_to_transfer"
64 : " ($1,$2,$3,$4,$5,$6,$7,$8);");
65 17 : qs = GNUNET_PQ_eval_prepared_singleton_select (
66 : pg->conn,
67 : "",
68 : params,
69 : rs);
70 17 : switch (qs)
71 : {
72 0 : case GNUNET_DB_STATUS_HARD_ERROR:
73 0 : return TALER_MERCHANTDB_DTTS_HARD_ERROR;
74 0 : case GNUNET_DB_STATUS_SOFT_ERROR:
75 0 : return TALER_MERCHANTDB_DTTS_SOFT_ERROR;
76 0 : case GNUNET_DB_STATUS_SUCCESS_NO_RESULTS:
77 : /* stored procedure always returns exactly one row */
78 0 : GNUNET_break (0);
79 0 : return TALER_MERCHANTDB_DTTS_NO_RESULTS;
80 17 : case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT:
81 17 : break;
82 : }
83 17 : if (no_signkey)
84 : {
85 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
86 : "Exchange `%s' signed transfer for deposit %llu with an unknown key, will retry later\n",
87 : exchange_url,
88 : (unsigned long long) deposit_serial);
89 0 : return TALER_MERCHANTDB_DTTS_SIGNKEY_UNKNOWN;
90 : }
91 17 : if (no_account)
92 : {
93 1 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
94 : "Exchange `%s' wired deposit %llu to account `%s' which is unknown to us; deposit will never settle\n",
95 : exchange_url,
96 : (unsigned long long) deposit_serial,
97 : TALER_B2S (h_wire));
98 1 : return TALER_MERCHANTDB_DTTS_ACCOUNT_UNKNOWN;
99 : }
100 16 : return TALER_MERCHANTDB_DTTS_SETTLED;
101 : }
|