summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2022-07-04 23:40:49 +0200
committerChristian Grothoff <christian@grothoff.org>2022-07-04 23:40:49 +0200
commit615b4621e3637db8ea32b0a17803101044adb594 (patch)
tree08dee586dac3768012488ece64088a2efbda9bdd
parente68206b1f9725a82b38225025c4693580d6aad10 (diff)
downloadexchange-615b4621e3637db8ea32b0a17803101044adb594.tar.gz
exchange-615b4621e3637db8ea32b0a17803101044adb594.tar.bz2
exchange-615b4621e3637db8ea32b0a17803101044adb594.zip
-implement DB logic for forcing reserve close
-rw-r--r--src/exchangedb/exchange-0001-part.sql41
-rw-r--r--src/exchangedb/plugin_exchangedb_postgres.c64
-rw-r--r--src/include/taler_exchangedb_plugin.h20
3 files changed, 62 insertions, 63 deletions
diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql
index cc34b6be3..e24129957 100644
--- a/src/exchangedb/exchange-0001-part.sql
+++ b/src/exchangedb/exchange-0001-part.sql
@@ -3605,6 +3605,7 @@ END $$;
CREATE OR REPLACE FUNCTION exchange_do_close_request(
IN in_reserve_pub BYTEA,
+ IN in_close_timestamp INT8,
IN in_reserve_sig BYTEA,
OUT out_final_balance_val INT8,
OUT out_final_balance_frac INT4,
@@ -3613,7 +3614,45 @@ CREATE OR REPLACE FUNCTION exchange_do_close_request(
LANGUAGE plpgsql
AS $$
BEGIN
- -- FIXME
+
+ SELECT
+ current_balance_val
+ ,current_balance_frac
+ INTO
+ out_final_balance_val
+ ,out_final_balance_frac
+ FROM reserves
+ WHERE reserve_pub=in_reserve_pub;
+
+ IF NOT FOUND
+ THEN
+ out_final_balance_val=0;
+ out_final_balance_frac=0;
+ out_balance_ok = FALSE;
+ out_conflict = FALSE;
+ END IF;
+
+ INSERT INTO close_requests
+ (reserve_pub
+ ,close_timestamp
+ ,reserve_sig
+ ,close_val
+ ,close_frac)
+ VALUES
+ (in_reserve_pub
+ ,in_close_timestamp
+ ,in_reserve_sig
+ ,out_final_balance_val
+ ,out_final_balance_frac)
+ ON CONFLICT DO NOTHING;
+ out_conflict = NOT FOUND;
+
+ UPDATE reserves SET
+ current_balance_val=0
+ ,current_balance_frac=0
+ WHERE reserve_pub=in_reserve_pub;
+ out_balance_ok = TRUE;
+
END $$;
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c
index 5985fa95d..cbacebbd6 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -741,22 +741,6 @@ prepare_statements (struct PostgresClosure *pg)
") VALUES ($1, $2, $3, $4, $5, $6, $7)"
" ON CONFLICT DO NOTHING;",
7),
-#if FIXME_DEAD
- /* Used in #postgres_reserves_in_insert() to store transaction details */
- GNUNET_PQ_make_prepare (
- "reserves_in_add_by_pub",
- "INSERT INTO reserves_in "
- "(reserve_pub"
- ",wire_reference"
- ",credit_val"
- ",credit_frac"
- ",exchange_account_section"
- ",wire_source_h_payto"
- ",execution_date"
- ") VALUES ($1, $2, $3, $4, $5, $6, $7)"
- " ON CONFLICT DO NOTHING;",
- 7),
-#endif
/* Used in postgres_select_reserves_in_above_serial_id() to obtain inbound
transactions for reserves with serial id '\geq' the given parameter */
GNUNET_PQ_make_prepare (
@@ -4268,8 +4252,8 @@ prepare_statements (struct PostgresClosure *pg)
" out_final_balance_val"
",out_final_balance_frac"
" FROM exchange_do_close_request"
- " ($1, $2)",
- 2),
+ " ($1, $2, $3)",
+ 3),
GNUNET_PQ_PREPARED_STATEMENT_END
};
@@ -15869,28 +15853,6 @@ postgres_select_purse_merge (
/**
- * Function called to approve merging of a purse with
- * an account, made by the receiving account.
- *
- * @param cls the @e cls of this struct with the plugin-specific state
- * @param purse_pub public key of the purse being merged
- * @param reserve_pub public key of the account being credited
- * @param reserve_sig signature of the account holder affirming the merge
- * @return transaction status code
- */
-static enum GNUNET_DB_QueryStatus
-postgres_do_account_merge (
- void *cls,
- const struct TALER_PurseContractPublicKeyP *purse_pub,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const struct TALER_ReserveSignatureP *reserve_sig)
-{
- GNUNET_break (0); // FIXME: Function dead, eliminate? (DCE)
- return GNUNET_DB_STATUS_HARD_ERROR;
-}
-
-
-/**
* Function called to persist a signature that
* prove that the client requested an
* account history. Debits the @a history_fee from
@@ -15953,10 +15915,26 @@ postgres_insert_close_request (
void *cls,
const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_ReserveSignatureP *reserve_sig,
+ struct GNUNET_TIME_Timestamp request_timestamp,
struct TALER_Amount *final_balance)
{
- GNUNET_break (0); // FIXME
- return GNUNET_DB_STATUS_HARD_ERROR;
+ struct PostgresClosure *pg = cls;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (reserve_pub),
+ GNUNET_PQ_query_param_timestamp (&request_timestamp),
+ GNUNET_PQ_query_param_auto_from_type (reserve_sig),
+ GNUNET_PQ_query_param_end
+ };
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ TALER_PQ_RESULT_SPEC_AMOUNT ("out_final_balance",
+ final_balance),
+ GNUNET_PQ_result_spec_end
+ };
+
+ return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
+ "call_account_close",
+ params,
+ rs);
}
@@ -16272,8 +16250,6 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
= &postgres_do_reserve_purse;
plugin->select_purse_merge
= &postgres_select_purse_merge;
- plugin->do_account_merge
- = &postgres_do_account_merge;
plugin->insert_history_request
= &postgres_insert_history_request;
plugin->insert_close_request
diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h
index 4ec2b6c78..23b2702ed 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -5463,24 +5463,6 @@ struct TALER_EXCHANGEDB_Plugin
/**
- * Function called to approve merging of a purse with
- * an account, made by the receiving account.
- *
- * @param cls the @e cls of this struct with the plugin-specific state
- * @param purse_pub public key of the purse being merged
- * @param reserve_pub public key of the account being credited
- * @param reserve_sig signature of the account holder affirming the merge
- * @return transaction status code
- */
- enum GNUNET_DB_QueryStatus
- (*do_account_merge)(
- void *cls,
- const struct TALER_PurseContractPublicKeyP *purse_pub,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const struct TALER_ReserveSignatureP *reserve_sig);
-
-
- /**
* Function called to persist a signature that
* prove that the client requested an
* account history. Debits the @a history_fee from
@@ -5513,6 +5495,7 @@ struct TALER_EXCHANGEDB_Plugin
* @param cls the @e cls of this struct with the plugin-specific state
* @param reserve_pub public key of the account to close
* @param reserve_sig signature affiming that the account is to be closed
+ * @param request_timestamp timestamp of the close request
* @param[out] final_balance set to the final balance in the account that will be wired back to the origin account
* @return transaction status code
*/
@@ -5520,6 +5503,7 @@ struct TALER_EXCHANGEDB_Plugin
(*insert_close_request)(void *cls,
const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_ReserveSignatureP *reserve_sig,
+ struct GNUNET_TIME_Timestamp request_timestamp,
struct TALER_Amount *final_balance);